Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: Merge branch '8.0.0-rc' to main #702

Merged
merged 87 commits into from
Mar 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
35d3b03
chore: drop support for python 3.6 (#632)
JenniferMah Jan 10, 2023
329800a
build: generate RC branch from oai-generator
mattcole19 Jan 10, 2023
fdda73b
Revert "build: generate RC branch from oai-generator"
mattcole19 Jan 10, 2023
d8b3ce1
feat: generate rest using open-api-generator (#633)
mattcole19 Jan 12, 2023
1a587ee
chore: refactor client (#634)
claudiachua Jan 12, 2023
17a210c
chore: generate code with template fixes
mattcole19 Jan 17, 2023
3170791
Revert "chore: generate code with template fixes"
mattcole19 Jan 17, 2023
a25ab50
chore: generate code with template fixes (#635)
mattcole19 Jan 19, 2023
eabfaa9
test: update tox config and replace deprecated test functions (#636)
Jan 19, 2023
d8850f0
chore: Security upgrade pygments from 2.5.2 to 2.7.4 (#609)
twilio-product-security Jan 19, 2023
61f1d4e
docs: remove docs output from repo (#637)
Jan 19, 2023
0bc8c88
chore: relax test dependencies and remove unused dependencies (#638)
Jan 19, 2023
6314d0b
chore: rename last_request/response (#639)
JenniferMah Jan 23, 2023
a31405f
chore: Split Shortcuts (#640)
claudiachua Jan 25, 2023
45816bf
fix: remove Flex shortcuts for removed APIs (#641)
claudiachua Jan 25, 2023
f5467bf
fix: remove camelcase duplicates domains (#642)
claudiachua Jan 26, 2023
d0c066e
chore: remove deprecated grants (#644)
JenniferMah Jan 26, 2023
4efc7c7
chore: remove deprecated twiml methods (#643)
JenniferMah Jan 26, 2023
dc3f8bf
chore: generate client (#645)
mattcole19 Jan 26, 2023
70617fc
feat: generate version files (#647)
mattcole19 Feb 3, 2023
02ccd56
fix: remove brackets (#648)
claudiachua Feb 8, 2023
cf73bf0
chore: keep v2010 shortcuts (#651)
JenniferMah Feb 13, 2023
db7d99c
chore: sync with latest changes
Feb 13, 2023
a384d56
feat: generate init files appropriately (#649)
beebzz Feb 15, 2023
babc14e
fix: correct the python list resource name (#652)
Feb 15, 2023
e540798
feat: Pagination (#653)
claudiachua Feb 15, 2023
2d39d9a
feat: add return types to shortcuts (#654)
Feb 15, 2023
7fa82b4
feat: add account setter (#655)
Feb 16, 2023
6429769
feat: create, get, call methods (#658)
claudiachua Feb 22, 2023
c69f031
Fix import statements (#659)
claudiachua Feb 22, 2023
6026b39
Api Context & Instance Class (#660)
claudiachua Feb 23, 2023
3e5244c
fix: Operations Parameters and Remove $ from URI Paths (#661)
claudiachua Feb 23, 2023
7cb9f34
Fix: Add Underscore to ListProperty (#662)
claudiachua Feb 27, 2023
0841be2
fix: include serialize.prefixed_collapsible_map (#663)
claudiachua Feb 27, 2023
a7515b5
sync with latest
Mar 2, 2023
c3072fe
feat: add enum classes (#664)
Mar 2, 2023
84b5006
fix: init import statements (#666)
claudiachua Mar 3, 2023
e8eaf2f
Adding python cluster tests (#669)
rakatyal Mar 6, 2023
578e420
fix: correct the enum names (#665)
Mar 6, 2023
2409726
fix: move the init files for preview endpoints (#667)
Mar 6, 2023
cb3f43e
fix: correct the param typing for enums (#670)
Mar 6, 2023
a3b0a76
Adding remaining docstrings (#672)
rakatyal Mar 7, 2023
474485b
fix: correct the FormTypes enum reference (#673)
Mar 7, 2023
5ae79a4
fix: github actions and python-tests (#671)
claudiachua Mar 9, 2023
eb16f43
Should call fetch (#674)
claudiachua Mar 9, 2023
946e996
docs: Add upgrade guide for 8.0.0-rc (#675)
rakatyal Mar 10, 2023
39fc5fe
Update test-and-deploy.yml
Mar 14, 2023
8fcb6ac
docs: update UPGRADE.md to include resource links for Voice TwiML cha…
stern-shawn Mar 14, 2023
7ed8bf4
feat: async support (#676)
Hunga1 Mar 14, 2023
c90b484
feat: make python code prettier (#678)
claudiachua Mar 14, 2023
fcbaa4e
Support utf 8 (#679)
claudiachua Mar 16, 2023
dfa6f18
chore: sync with latest changes
Mar 16, 2023
ab49546
chore: remove renamed file
Mar 16, 2023
f8240c4
fix: only include list operations if a path is present (#682)
Mar 16, 2023
e36364e
chore: update generated header to be r-string (#681)
Mar 16, 2023
daecc55
chore: allow 'None' for non-parent params (#680)
Mar 16, 2023
a6f6aa8
chore: fix pyright errors in http folder (#683)
Mar 17, 2023
eb44ff6
fix: Update README / docstring for Authenticating Client (#684)
claudiachua Mar 20, 2023
2325f29
chore: refactor base initialization (#686)
Mar 20, 2023
6903bfe
fix: mark dependents as optional and drop empty path solutions (#688)
Mar 20, 2023
8a62877
chore: move list implementations to the bottom (#689)
Mar 20, 2023
283be94
Prep for RC release (#685)
rakatyal Mar 21, 2023
e8163c1
fix: revert version parts to use single-quotes
Mar 22, 2023
90795ec
docs: Fix upgrade guide (#690)
rakatyal Mar 22, 2023
916ab49
Revert "fix: revert version parts to use single-quotes"
Mar 22, 2023
1f6ef8f
[Librarian] Regenerated @ 063fefeb406fa3d6866703c240040a1e9146ca75
twilio-dx Mar 22, 2023
e457db0
Release 8.0.0-rc.1
twilio-dx Mar 22, 2023
da6141e
fix: re-remove deprecated TwiML methods
Mar 23, 2023
17e5f17
fix: use ‘str’ for non-enum complex response properties (#691)
Mar 23, 2023
a723853
feat: add typings to base domain files (#692)
Mar 23, 2023
c4feb04
feat: add typings to Client class (#694)
Mar 24, 2023
e8de65a
feat: add return types to rest classes (#693)
Mar 24, 2023
aa9a4dd
fix: update the Dict property types (#695)
Mar 24, 2023
5b1621b
fix!: refactor internal resource property storage (#696)
Mar 27, 2023
d6ed2b5
fix: drop the tollfree_verification shortcut
Mar 27, 2023
f88a323
chore: drop unused solutions (#698)
Mar 28, 2023
6d42edd
feat: add more typings to the base and http modules (#697)
Mar 28, 2023
28be8aa
feat: add more types for the generated rest classes (#699)
Mar 28, 2023
770ca69
fix: add form model generation (#700)
Mar 28, 2023
dd7588e
fix: correct the stream and list types (#701)
Mar 29, 2023
8f7aa2d
Merge branch 'main' into 8.0.0-rc
Mar 29, 2023
b7d2e7f
Merge branch 'main' into 8.0.0-rc
Mar 29, 2023
c5388fc
drop RC instructions
Mar 29, 2023
299b41f
update v8 release date
Mar 29, 2023
519b1ae
chore: update sonar properties (#703)
claudiachua Mar 29, 2023
933557b
drop duplicate TwiML
Mar 29, 2023
876e6fb
add _properties refactor to upgrade guide
Mar 29, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 12 additions & 7 deletions .github/workflows/test-and-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,11 @@ on:
jobs:
test:
name: Test
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
matrix:
python-version: [ '3.7', '3.8', '3.9', '3.10', '3.11' ]
os: [ubuntu-latest]
# Need to pin ubuntu version for python 3.6 (see https://github.com/actions/setup-python/issues/544#issuecomment-1332535877)
# Change this to use ubuntu-latest for all python versions after deprecating python 3.6
include:
- python-version: '3.6'
os: 'ubuntu-20.04'
runs-on: ${{ matrix.os }}
steps:
- name: Checkout twilio-python
uses: actions/checkout@v3
Expand All @@ -43,6 +37,17 @@ jobs:
- name: Run the tests
run: make test-with-coverage

- name: Run Cluster Tests
if: (!github.event.pull_request.head.repo.fork)
env:
TWILIO_ACCOUNT_SID: ${{ secrets.TWILIO_ACCOUNT_SID }}
TWILIO_API_KEY: ${{ secrets.TWILIO_CLUSTER_TEST_API_KEY}}
TWILIO_API_SECRET: ${{ secrets.TWILIO_CLUSTER_TEST_API_KEY_SECRET }}
TWILIO_FROM_NUMBER: ${{ secrets.TWILIO_FROM_NUMBER }}
TWILIO_TO_NUMBER: ${{ secrets.TWILIO_TO_NUMBER }}
TWILIO_AUTH_TOKEN: ${{ secrets.TWILIO_AUTH_TOKEN }}
run: make cluster-test

- name: Verify docs generation
run: make docs

Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,5 @@ docs/source/_rst
.python-version

README.md.bak

**/.openapi-generator*
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM python:3.6
FROM python:3.7

ENV PYTHONUNBUFFERED 1

Expand Down
30 changes: 20 additions & 10 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
.PHONY: clean install analysis test test-install test-docker develop docs docs-install
.PHONY: clean install analysis test test-install test-docker develop docs docs-install prettier prettier-check

venv:
@python --version || (echo "Python is not installed, Python 3.6+"; exit 1);
@python --version || (echo "Python is not installed, Python 3.7+"; exit 1);
virtualenv --python=python venv

install: venv
Expand All @@ -12,23 +12,25 @@ test-install: install

test-docker:
docker build -t twilio/twilio-python .
docker run twilio/twilio-python pytest tests
docker run twilio/twilio-python pytest tests --ignore=tests/cluster

develop: venv
. venv/bin/activate; pip install -e . --use-mirrors
. venv/bin/activate; pip install -r tests/requirements.txt

analysis:
. venv/bin/activate; flake8 --ignore=E123,E126,E128,E501,W391,W291,W293,F401 tests
. venv/bin/activate; flake8 --ignore=E402,F401,W391,W291,W293 twilio --max-line-length=300
. venv/bin/activate; flake8 --ignore=E123,E126,E128,E501,W391,W291,W293,F401,W503,E203 tests
. venv/bin/activate; flake8 --ignore=E402,F401,W391,W291,W293,W503,E203 twilio --max-line-length=300

test: analysis
. venv/bin/activate; pytest tests
test: analysis prettier-check
. venv/bin/activate; pytest tests --ignore=tests/cluster

test-with-coverage:
test-with-coverage: prettier-check
. venv/bin/activate; \
pytest --cov=twilio tests; \
coverage xml --omit 'twilio/rest/*' -o coverage.xml
pytest --cov-config=setup.cfg --cov-report xml --cov=twilio tests --ignore=tests/cluster

cluster-test:
. venv/bin/activate; pytest tests/cluster

docs-install:
. venv/bin/activate; pip install -r tests/requirements.txt
Expand All @@ -54,6 +56,14 @@ clean:
nopyc:
find . -name \*.pyc -delete

prettier:
. venv/bin/activate; autoflake --remove-all-unused-imports -i -r --exclude venv .
. venv/bin/activate; black .

prettier-check:
. venv/bin/activate; autoflake --check-diff --quiet --remove-all-unused-imports -r --exclude venv .
. venv/bin/activate; black --check .

API_DEFINITIONS_SHA=$(shell git log --oneline | grep Regenerated | head -n1 | cut -d ' ' -f 5)
CURRENT_TAG=$(shell expr "${GITHUB_TAG}" : ".*-rc.*" >/dev/null && echo "rc" || echo "latest")
docker-build:
Expand Down
62 changes: 46 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ Please consult the [official migration guide](https://www.twilio.com/docs/librar

This library supports the following Python implementations:

* Python 3.6
* Python 3.7
* Python 3.8
* Python 3.9
Expand Down Expand Up @@ -59,15 +58,26 @@ Getting started with the Twilio API couldn't be easier. Create a

### API Credentials

The `Twilio` needs your Twilio credentials. You can either pass these
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 = "ACXXXXXXXXXXXXXXXXX"
token = "YYYYYYYYYYYYYYYYYY"
client = Client(account, token)
account_sid = "ACXXXXXXXXXXXXXXXXX"
auth_token = "YYYYYYYYYYYYYYYYYY"
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 = "ACXXXXXXXXXXXXXXXXX"
client = Client(api_key, api_secret, account_sid)
```

Alternatively, a `Client` constructor without these parameters will
Expand Down Expand Up @@ -112,9 +122,9 @@ This will result in the `hostname` transforming from `api.twilio.com` to `api.sy
```python
from twilio.rest import Client

account = "ACXXXXXXXXXXXXXXXXX"
token = "YYYYYYYYYYYYYYYYYY"
client = Client(account, token)
username = "ACXXXXXXXXXXXXXXXXX"
password = "YYYYYYYYYYYYYYYYYY"
client = Client(username, password)

call = client.calls.create(to="9991231234",
from_="9991231234",
Expand All @@ -127,22 +137,42 @@ print(call.sid)
```python
from twilio.rest import Client

account = "ACXXXXXXXXXXXXXXXXX"
token = "YYYYYYYYYYYYYYYYYY"
client = Client(account, token)
username = "ACXXXXXXXXXXXXXXXXX"
password = "YYYYYYYYYYYYYYYYYY"
client = Client(username, password)

message = client.messages.create(to="+12316851234", from_="+15555555555",
body="Hello there!")
```

### 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():
username = "ACXXXXXXXXXXXXXXXXX"
password = "YYYYYYYYYYYYYYYYYY"
http_client = AsyncTwilioHttpClient()
client = Client(username, password, 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, token)
client = Client(username, password)
logging.basicConfig()
client.http_client.logger.setLevel(logging.INFO)
```
Expand All @@ -152,7 +182,7 @@ Log the API request and response data to a file:
```python
import logging

client = Client(account, token)
client = Client(username, password)
logging.basicConfig(filename='./log.txt')
client.http_client.logger.setLevel(logging.INFO)
```
Expand All @@ -163,9 +193,9 @@ client.http_client.logger.setLevel(logging.INFO)
from twilio.rest import Client
from twilio.base.exceptions import TwilioRestException

account = "ACXXXXXXXXXXXXXXXXX"
token = "YYYYYYYYYYYYYYYYYY"
client = Client(account, token)
username = "ACXXXXXXXXXXXXXXXXX"
password = "YYYYYYYYYYYYYYYYYY"
client = Client(username, password)

try:
message = client.messages.create(to="+12316851234", from_="+15555555555",
Expand Down
110 changes: 91 additions & 19 deletions UPGRADE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,51 +3,122 @@
_`MAJOR` version bumps will have upgrade notes
posted here._

[2021-09-22] 6.x.x to 7.x.x
---------------------------
## [2023-04-05] 7.x.x to 8.x.x

- **Supported Python versions updated**
- Dropped support for Python 3.6 ([#632](https://github.com/twilio/twilio-python/pull/632))
- Python 3.7 is the new required minimum version to use twilio-python helper library
- **Deletion of TwiML Voice Deprecated Methods ([#643](https://github.com/twilio/twilio-python/pull/643))**

- [`<Refer>`](https://www.twilio.com/docs/voice/twiml/refer)
- `Refer.refer_sip()` replaced by `Refer.sip()`
- [`<Say>`](https://www.twilio.com/docs/voice/twiml/say/text-speech#generating-ssml-via-helper-libraries)

- `Say.ssml_break()` replaced by `Say.break_()`
- `Say.ssml_emphasis()` replaced by `Say.emphasis()`
- `Say.ssml_lang()` replaced by `Say.lang()`
- `Say.ssml_p()` replaced by `Say.p()`
- `Say.ssml_phoneme()` replaced by `Say.phoneme()`
- `Say.ssml_prosody()` replaced by `Say.prosody()`
- `Say.ssml_s()` replaced by `Say.s()`
- `Say.ssml_say_as()` replaced by `Say.say_as()`
- `Say.ssml_sub()` replaced by `Say.sub()`
- `Say.ssml_w()` replaced by `Say.w()`

Old:

```python
from twilio.twiml.voice_response import VoiceResponse
resp = VoiceResponse()
say = resp.say("Hello")
say.ssml_emphasis("you")
```

New:

```python
from twilio.twiml.voice_response import VoiceResponse
resp = VoiceResponse()
say = resp.say("Hello")
say.emphasis("you")
```

- **JWT token building deprecations ([#644](https://github.com/twilio/twilio-python/pull/644))**
- `ConversationsGrant` has been deprecated in favor of `VoiceGrant`
- `IpMessagingGrant` has been removed
- `twilio.rest.api.v2010.account.available_phone_number` has been renamed to `twilio.rest.api.v2010.account.available_phone_number_country`
- **[TaskRouter Workers Statistics](https://www.twilio.com/docs/taskrouter/api/worker/statistics) operations updated ([#653](https://github.com/twilio/twilio-python/pull/653))**

- Cumulative and Real-Time Workers Statistics no longer accept a WorkerSid
- `GET /v1/Workspaces/{WorkspaceSid}/Workers/CumulativeStatistics`

Old: `client.taskrouter.v1.workspaces('WS...').workers('WK...).cumulative_statistics()`

New: `client.taskrouter.v1.workspaces('WS...').workers.cumulative_statistics()`

- `GET /v1/Workspaces/{WorkspaceSid}/Workers/RealTimeStatistics`

Old: `client.taskrouter.v1.workspaces('WS...').workers('WK...).real_time_statistics()`

New: `client.taskrouter.v1.workspaces('WS...').workers.real_time_statistics()`

- **Internal refactor of `instance._properties`**
- Instance properties moved out of the generic `_properties` dict ([#696](https://github.com/twilio/twilio-python/pull/696))
- This is an implementation detail that should not be depended upon

## [2021-09-22] 6.x.x to 7.x.x

### Overview

Version `7.x.x` is the first version that officially drops support for Python versions 2.7, 3.4, and 3.5.
#### Removal of files and dependencies that were added to support Python 2.7, 3.4, and 3.5:

#### Removal of files and dependencies that were added to support Python 2.7, 3.4, and 3.5

- [Six](https://github.com/twilio/twilio-python/pull/560/files#diff-4d7c51b1efe9043e44439a949dfd92e5827321b34082903477fd04876edb7552L4)
- Removed use of `u` a fake unicode literal
- Removed use of `b` a fake bytes literal
- Removed `PY3` a boolean indicating if the code is running on Python 3
- `text_type` type for representing (Unicode) textual data --> `str`
- `iteritems` returns an iterator over dictionary’s items --> `items`
- `string_types` possible types for text data like basestring() in Python 2 and str in Python 3.--> `str`
- Removed use of `u` a fake unicode literal
- Removed use of `b` a fake bytes literal
- Removed `PY3` a boolean indicating if the code is running on Python 3
- `text_type` type for representing (Unicode) textual data --> `str`
- `iteritems` returns an iterator over dictionary’s items --> `items`
- `string_types` possible types for text data like basestring() in Python 2 and str in Python 3.--> `str`
- [twilio/compat.py](https://github.com/twilio/twilio-python/pull/560/files?file-filters%5B%5D=.md&file-filters%5B%5D=.py&file-filters%5B%5D=.toml&file-filters%5B%5D=.txt&file-filters%5B%5D=.yml&file-filters%5B%5D=No+extension#diff-e327449701a8717c94e1a084cdfc7dbf334c634cddf3867058b8f991d2de52c1L1)
- `from twilio.compat import urlencode` --> `from urllib.parse import urlencode`
- `izip` --> `zip`
- `from twilio.compat import urlencode` --> `from urllib.parse import urlencode`
- `izip` --> `zip`
- [twilio/jwt/compat.py](https://github.com/twilio/twilio-python/pull/560/files?file-filters%5B%5D=.md&file-filters%5B%5D=.py&file-filters%5B%5D=.toml&file-filters%5B%5D=.txt&file-filters%5B%5D=.yml&file-filters%5B%5D=No+extension#diff-03276a6bdd4ecdf37ab6bedf60032dd05f640e1b470e4353badc787d80ba73d5L1)
- Removed `compat.compare_digest`
- [twilio/jwt/__init__.py](https://github.com/twilio/twilio-python/pull/560/files?file-filters%5B%5D=.ini&file-filters%5B%5D=.py&file-filters%5B%5D=.yml#diff-9152dd65476e69cc34a307781d5cef195070f48da5670ed0934fd34a9ac91150L12-L16)
- Removed import for `simplejson` and `json`
- Removed `compat.compare_digest`
- [twilio/jwt/**init**.py](https://github.com/twilio/twilio-python/pull/560/files?file-filters%5B%5D=.ini&file-filters%5B%5D=.py&file-filters%5B%5D=.yml#diff-9152dd65476e69cc34a307781d5cef195070f48da5670ed0934fd34a9ac91150L12-L16)
- Removed import for `simplejson` and `json`

#### Updated dependencies

- [Updated PyJWT to >=2.0.0](https://github.com/twilio/twilio-python/pull/560/files#diff-4d7c51b1efe9043e44439a949dfd92e5827321b34082903477fd04876edb7552L6)

### CHANGED - [Remove the ability to override the `algorithm` in `Jwt.to_jwt()`](https://github.com/twilio/twilio-python/pull/560/commits/dab158f429015e0894217d6503f55b517c27c474).
#### Removed the ability to override the algorithm while using a jwt access token:
### CHANGED - [Remove the ability to override the `algorithm` in `Jwt.to_jwt()`](https://github.com/twilio/twilio-python/pull/560/commits/dab158f429015e0894217d6503f55b517c27c474)

#### Removed the ability to override the algorithm while using a jwt access token

```python
// 6.x.x
from twilio.jwt.access_token import AccessToken
token.to_jwt(algorithm='HS512')
```

```python
// 7.x.x
from twilio.jwt.access_token import AccessToken
token.to_jwt()
```

[2017-09-28] 6.6.x to 6.7.x
---------------------------
## [2017-09-28] 6.6.x to 6.7.x

### CHANGED - `Body` parameter on Chat `Message` creation is no longer required.
### CHANGED - `Body` parameter on Chat `Message` creation is no longer required

#### Rationale

This was changed to add support for sending media in Chat messages, users can now either provide a `body` or a `media_sid`.

#### 6.6.x

```python
from twilio.rest import Client

Expand All @@ -56,6 +127,7 @@ client.chat.v2.services('IS123').channels('CH123').messages.create("this is the
```

#### 6.7.x

```python
from twilio.rest import Client

Expand Down
Loading