summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--python-telnyx.spec966
-rw-r--r--sources1
3 files changed, 968 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..013a8fd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/telnyx-2.0.0.tar.gz
diff --git a/python-telnyx.spec b/python-telnyx.spec
new file mode 100644
index 0000000..438d43a
--- /dev/null
+++ b/python-telnyx.spec
@@ -0,0 +1,966 @@
+%global _empty_manifest_terminate_build 0
+Name: python-telnyx
+Version: 2.0.0
+Release: 1
+Summary: Python bindings for the Telnyx API
+License: MIT
+URL: https://github.com/team-telnyx/telnyx-python
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/4c/74/ac6e00725b1092164503942138bdaf82338eef942458c4f6b0d0b4825b13/telnyx-2.0.0.tar.gz
+BuildArch: noarch
+
+Requires: python3-PyNaCl
+Requires: python3-requests[security]
+Requires: python3-requests
+
+%description
+# Telnyx Python Library
+
+[![image](https://img.shields.io/pypi/v/telnyx.svg)][pypi]
+[![image](https://img.shields.io/pypi/l/telnyx.svg)][pypi]
+[![image](https://img.shields.io/pypi/pyversions/telnyx.svg)][pypi]
+[![Build Status](https://github.com/team-telnyx/telnyx-python/workflows/Python/badge.svg)][Actions]
+[![Coverage Status](https://coveralls.io/repos/github/team-telnyx/telnyx-python/badge.svg?branch=master)][coveralls]
+[![Join Slack](https://img.shields.io/badge/join-slack-infomational)](https://joinslack.telnyx.com/)
+
+[pypi]: https://pypi.org/project/telnyx/
+[Actions]: https://github.com/team-telnyx/telnyx-python/actions
+[coveralls]: https://coveralls.io/github/team-telnyx/telnyx-python?branch=master
+
+The Telnyx Python library provides convenient access to the Telnyx API from
+applications written in the Python language. It includes a pre-defined set of
+classes for API resources that initialize themselves dynamically from API
+responses which makes it compatible with a wide range of versions of the Telnyx
+API.
+
+## Documentation
+
+See the [API Reference](https://developers.telnyx.com/docs/api/v2/overview) and the [Setup Guides](https://developers.telnyx.com/docs/v2/development/dev-env-setup).
+
+## Installation
+
+You don't need this source code unless you want to modify the package. If you just
+want to use the package, just run:
+
+ pip install --upgrade telnyx
+
+Install from source with:
+
+ python setup.py install
+
+### Non x86/x86_64 Processors
+
+The `telnyx` package is distributed as a wheel (pre-compiled package) for easy
+installation. The wheel is built only for x86/x86_64 processors. When
+installing the package on a different architecture, like ARM, the `pip`
+installer will fall back to installing from source. As a result, you will
+need to ensure you have the additional dependencies installed. This will
+affect you if you're using a Raspberry Pi, for example.
+
+For ARM specifically, as an alternative to a source install, you could look
+into using https://www.piwheels.org/ for ARM compiled wheels.
+
+### Requirements
+
+- Python 2.7 or 3.5+ (PyPy supported)
+
+#### Additional Requirements for Source Install
+
+- build-essentials (gcc, make)
+- python-dev
+- libffi-dev
+
+_These packages are listed as they are named on Ubuntu._
+
+## Usage
+
+The library needs to be configured with your account's API Key which is
+available in your [Telnyx Dashboard][api-keys]. Set `telnyx.api_key` to its
+value:
+
+```python
+import telnyx
+telnyx.api_key = "KEY01234_yoursecretkey"
+
+# Retrieve single Messaging Profile
+telnyx.MessagingProfile.retrieve("123")
+
+# List Messaging Profiles
+profiles = telnyx.MessagingProfile.list()
+
+# Retrieve next page of list results
+profiles.next_page()
+
+# Loop over all page results
+for page in profiles.auto_paging_iter():
+ print(page)
+```
+
+You can read more about our API Keys [here](https://developers.telnyx.com/docs/v2/development/authentication).
+
+### Per-Request Configuration
+
+For apps that need to use multiple keys during the lifetime of a process,
+it's also possible to set a per-request key and/or account:
+
+```python
+import telnyx
+
+# list messaging profiles
+telnyx.MessagingProfile.list(
+ api_key="super-secret...",
+)
+
+# retrieve single messaging profile
+telnyx.MessagingProfile.retrieve(
+ "123",
+ api_key="other-secret...",
+)
+```
+
+### Configuring an HTTP Client
+
+The library can be configured to use `urlfetch`, `requests`, `pycurl`, or
+`urllib2` with `telnyx.default_http_client`:
+
+```python
+client = telnyx.http_client.UrlFetchClient()
+client = telnyx.http_client.RequestsClient()
+client = telnyx.http_client.PycurlClient()
+client = telnyx.http_client.Urllib2Client()
+telnyx.default_http_client = client
+```
+
+Without a configured client, by default the library will attempt to load
+libraries in the order above (i.e. `urlfetch` is preferred with `urllib2` used
+as a last resort). We usually recommend that people use `requests`.
+
+### Configuring a Proxy
+
+A proxy can be configured with `telnyx.proxy`:
+
+```python
+telnyx.proxy = "https://user:pass@example.com:1234"
+```
+
+### Configuring Automatic Retries
+
+Number of automatic retries on requests that fail due to an intermittent
+network problem can be configured:
+
+```python
+telnyx.max_network_retries = 2
+```
+
+### Reserved word keyword arguments
+The Telnyx API includes `from` as an attribute that can be set on messages.
+`from` is also a reserved word in Python. If you would like to use keyword
+arguments where an argument is a reserved word you can add the suffix `_` e.g.
+
+```
+telnyx.Message.create(
+ to="+18665550001",
+ from_="+18445550001",
+ text="Foo"
+)
+```
+
+The argument will be automatically rewritten to `from` in the keyword arguments dict.
+
+> Pro Tip: You can alternatively unpack a dictionary like so:
+> ```python
+> message = {
+> "from": "+18445550001",
+> "to": "+18665550001",
+> "text": "Foo",
+> }
+> telnyx.Message.create(**message)
+> ```
+
+### Logging
+
+The library can be configured to emit logging that will give you better insight
+into what it's doing. The `info` logging level is usually most appropriate for
+production use, but `debug` is also available for more verbosity.
+
+There are a few options for enabling it:
+
+1. Set the environment variable `TELNYX_LOG` to the value `debug` or `info`
+
+ ```
+ $ export TELNYX_LOG=debug
+ ```
+
+2. Set `telnyx.log`:
+
+ ```py
+ import telnyx
+ telnyx.log = 'debug'
+ ```
+
+3. Enable it through Python's logging module:
+ ```py
+ import logging
+ logging.basicConfig()
+ logging.getLogger('telnyx').setLevel(logging.DEBUG)
+ ```
+
+### Writing a Plugin
+
+If you're writing a plugin that uses the library, we'd appreciate it if you
+identified using `telnyx.set_app_info()`:
+
+```py
+telnyx.set_app_info("MyAwesomePlugin", version="1.2.34", url="https://myawesomeplugin.info")
+```
+
+This information is passed along when the library makes calls to the Telnyx
+API.
+
+## Development
+
+The test suite depends on [telnyx-mock], so make sure to fetch and run it from a
+background terminal ([telnyx-mock's README][telnyx-mock] also contains
+instructions for installing via Homebrew and other methods):
+
+ go get -u github.com/team-telnyx/telnyx-mock
+ telnyx-mock
+
+Install [pipenv][pipenv], then install all dependencies for the project:
+
+ pipenv install --dev
+
+Run all tests on all supported Python versions:
+
+ make test
+
+Run all tests for a specific Python version (modify `-e` according to your Python target):
+
+ pipenv run tox -e py27
+
+Run all tests in a single file:
+
+ pipenv run tox -e py27 -- tests/api_resources/abstract/test_updateable_api_resource.py
+
+Run a single test suite:
+
+ pipenv run tox -e py27 -- tests/api_resources/abstract/test_updateable_api_resource.py::TestUpdateableAPIResource
+
+Run a single test:
+
+ pipenv run tox -e py27 -- tests/api_resources/abstract/test_updateable_api_resource.py::TestUpdateableAPIResource::test_save
+
+Run the linter with:
+
+ make lint
+
+The library uses [Black][black] for code formatting. Code must be formatted
+with Black before PRs are submitted, otherwise CI will fail. Run the formatter
+with:
+
+ make fmt
+
+### Adding a new endpoint
+
+1. Define a class for the object that the endpoint interacts with under
+`telnyx/api_resources/`. The path name singularized should typically match
+the record type of the object returned e.g. `/v2/available_phone_numbers`
+returns a list of objects with the record_type `available_phone_number`.
+Inherit from the classes that define the behavior available on the endpoint,one or more of `CreateableAPIResource`, `DeletableAPIResource`,
+`ListableAPIResource`, `UpdateableAPIResource`.
+
+2. Import your class in `telnyx/api_resources/__init__.py`.
+
+3. Add your new class to the `OBJECT_CLASSES` block in `telnyx/util.py`.
+
+4. Add tests for your new class under `tests/api_resources/`.
+
+
+[api-keys]: https://portal.telnyx.com/#/app/auth/v2
+[black]: https://github.com/ambv/black
+[pipenv]: https://github.com/pypa/pipenv
+[telnyx-mock]: https://github.com/team-telnyx/telnyx-mock
+
+## Releasing
+
+1. Update version in
+ * `setup.py` (in the `setup()` call, the `version` kwarg)
+ * `telnyx/__init__.py` (the `__version__` string)
+2. Create new branch, add changes, commit, and push
+3. Ensure commit passes tests in [Travis][travis-telnyx-python]
+4. Tag that commit with `git tag -a v{VERSION} -m "Release v{VERSION}"`, and push the tag `git push --follow-tags`
+5. Ensure checked out copy is entirely clean (best to create a new environment...)
+6. `make dists`
+7. *If you haven't done it before*, download the upload API keys from LastPass (search for "pypi") and put the contents between "PYPIRC FILE" tags into `~/.pypirc-telnyx`.
+8. `make testupload`, check that it looks OK on PyPI and that it's installable via `pip`.
+9. `make liveupload`, repeat checks for live version.
+10. Ta-da.
+
+[travis-telnyx-python]: https://travis-ci.org/team-telnyx/telnyx-python
+
+
+## Acknowledgments
+
+The contributors and maintainers of Telnyx Python would like to extend their
+deep gratitude to the authors of [Stripe Python][stripe-python], upon which
+this project is based. Thank you for developing such elegant, usable, and
+extensible code and for sharing it with the community.
+
+[stripe-python]: https://github.com/stripe/stripe-python
+
+<!--
+# vim: set tw=79:
+-->
+
+
+%package -n python3-telnyx
+Summary: Python bindings for the Telnyx API
+Provides: python-telnyx
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-telnyx
+# Telnyx Python Library
+
+[![image](https://img.shields.io/pypi/v/telnyx.svg)][pypi]
+[![image](https://img.shields.io/pypi/l/telnyx.svg)][pypi]
+[![image](https://img.shields.io/pypi/pyversions/telnyx.svg)][pypi]
+[![Build Status](https://github.com/team-telnyx/telnyx-python/workflows/Python/badge.svg)][Actions]
+[![Coverage Status](https://coveralls.io/repos/github/team-telnyx/telnyx-python/badge.svg?branch=master)][coveralls]
+[![Join Slack](https://img.shields.io/badge/join-slack-infomational)](https://joinslack.telnyx.com/)
+
+[pypi]: https://pypi.org/project/telnyx/
+[Actions]: https://github.com/team-telnyx/telnyx-python/actions
+[coveralls]: https://coveralls.io/github/team-telnyx/telnyx-python?branch=master
+
+The Telnyx Python library provides convenient access to the Telnyx API from
+applications written in the Python language. It includes a pre-defined set of
+classes for API resources that initialize themselves dynamically from API
+responses which makes it compatible with a wide range of versions of the Telnyx
+API.
+
+## Documentation
+
+See the [API Reference](https://developers.telnyx.com/docs/api/v2/overview) and the [Setup Guides](https://developers.telnyx.com/docs/v2/development/dev-env-setup).
+
+## Installation
+
+You don't need this source code unless you want to modify the package. If you just
+want to use the package, just run:
+
+ pip install --upgrade telnyx
+
+Install from source with:
+
+ python setup.py install
+
+### Non x86/x86_64 Processors
+
+The `telnyx` package is distributed as a wheel (pre-compiled package) for easy
+installation. The wheel is built only for x86/x86_64 processors. When
+installing the package on a different architecture, like ARM, the `pip`
+installer will fall back to installing from source. As a result, you will
+need to ensure you have the additional dependencies installed. This will
+affect you if you're using a Raspberry Pi, for example.
+
+For ARM specifically, as an alternative to a source install, you could look
+into using https://www.piwheels.org/ for ARM compiled wheels.
+
+### Requirements
+
+- Python 2.7 or 3.5+ (PyPy supported)
+
+#### Additional Requirements for Source Install
+
+- build-essentials (gcc, make)
+- python-dev
+- libffi-dev
+
+_These packages are listed as they are named on Ubuntu._
+
+## Usage
+
+The library needs to be configured with your account's API Key which is
+available in your [Telnyx Dashboard][api-keys]. Set `telnyx.api_key` to its
+value:
+
+```python
+import telnyx
+telnyx.api_key = "KEY01234_yoursecretkey"
+
+# Retrieve single Messaging Profile
+telnyx.MessagingProfile.retrieve("123")
+
+# List Messaging Profiles
+profiles = telnyx.MessagingProfile.list()
+
+# Retrieve next page of list results
+profiles.next_page()
+
+# Loop over all page results
+for page in profiles.auto_paging_iter():
+ print(page)
+```
+
+You can read more about our API Keys [here](https://developers.telnyx.com/docs/v2/development/authentication).
+
+### Per-Request Configuration
+
+For apps that need to use multiple keys during the lifetime of a process,
+it's also possible to set a per-request key and/or account:
+
+```python
+import telnyx
+
+# list messaging profiles
+telnyx.MessagingProfile.list(
+ api_key="super-secret...",
+)
+
+# retrieve single messaging profile
+telnyx.MessagingProfile.retrieve(
+ "123",
+ api_key="other-secret...",
+)
+```
+
+### Configuring an HTTP Client
+
+The library can be configured to use `urlfetch`, `requests`, `pycurl`, or
+`urllib2` with `telnyx.default_http_client`:
+
+```python
+client = telnyx.http_client.UrlFetchClient()
+client = telnyx.http_client.RequestsClient()
+client = telnyx.http_client.PycurlClient()
+client = telnyx.http_client.Urllib2Client()
+telnyx.default_http_client = client
+```
+
+Without a configured client, by default the library will attempt to load
+libraries in the order above (i.e. `urlfetch` is preferred with `urllib2` used
+as a last resort). We usually recommend that people use `requests`.
+
+### Configuring a Proxy
+
+A proxy can be configured with `telnyx.proxy`:
+
+```python
+telnyx.proxy = "https://user:pass@example.com:1234"
+```
+
+### Configuring Automatic Retries
+
+Number of automatic retries on requests that fail due to an intermittent
+network problem can be configured:
+
+```python
+telnyx.max_network_retries = 2
+```
+
+### Reserved word keyword arguments
+The Telnyx API includes `from` as an attribute that can be set on messages.
+`from` is also a reserved word in Python. If you would like to use keyword
+arguments where an argument is a reserved word you can add the suffix `_` e.g.
+
+```
+telnyx.Message.create(
+ to="+18665550001",
+ from_="+18445550001",
+ text="Foo"
+)
+```
+
+The argument will be automatically rewritten to `from` in the keyword arguments dict.
+
+> Pro Tip: You can alternatively unpack a dictionary like so:
+> ```python
+> message = {
+> "from": "+18445550001",
+> "to": "+18665550001",
+> "text": "Foo",
+> }
+> telnyx.Message.create(**message)
+> ```
+
+### Logging
+
+The library can be configured to emit logging that will give you better insight
+into what it's doing. The `info` logging level is usually most appropriate for
+production use, but `debug` is also available for more verbosity.
+
+There are a few options for enabling it:
+
+1. Set the environment variable `TELNYX_LOG` to the value `debug` or `info`
+
+ ```
+ $ export TELNYX_LOG=debug
+ ```
+
+2. Set `telnyx.log`:
+
+ ```py
+ import telnyx
+ telnyx.log = 'debug'
+ ```
+
+3. Enable it through Python's logging module:
+ ```py
+ import logging
+ logging.basicConfig()
+ logging.getLogger('telnyx').setLevel(logging.DEBUG)
+ ```
+
+### Writing a Plugin
+
+If you're writing a plugin that uses the library, we'd appreciate it if you
+identified using `telnyx.set_app_info()`:
+
+```py
+telnyx.set_app_info("MyAwesomePlugin", version="1.2.34", url="https://myawesomeplugin.info")
+```
+
+This information is passed along when the library makes calls to the Telnyx
+API.
+
+## Development
+
+The test suite depends on [telnyx-mock], so make sure to fetch and run it from a
+background terminal ([telnyx-mock's README][telnyx-mock] also contains
+instructions for installing via Homebrew and other methods):
+
+ go get -u github.com/team-telnyx/telnyx-mock
+ telnyx-mock
+
+Install [pipenv][pipenv], then install all dependencies for the project:
+
+ pipenv install --dev
+
+Run all tests on all supported Python versions:
+
+ make test
+
+Run all tests for a specific Python version (modify `-e` according to your Python target):
+
+ pipenv run tox -e py27
+
+Run all tests in a single file:
+
+ pipenv run tox -e py27 -- tests/api_resources/abstract/test_updateable_api_resource.py
+
+Run a single test suite:
+
+ pipenv run tox -e py27 -- tests/api_resources/abstract/test_updateable_api_resource.py::TestUpdateableAPIResource
+
+Run a single test:
+
+ pipenv run tox -e py27 -- tests/api_resources/abstract/test_updateable_api_resource.py::TestUpdateableAPIResource::test_save
+
+Run the linter with:
+
+ make lint
+
+The library uses [Black][black] for code formatting. Code must be formatted
+with Black before PRs are submitted, otherwise CI will fail. Run the formatter
+with:
+
+ make fmt
+
+### Adding a new endpoint
+
+1. Define a class for the object that the endpoint interacts with under
+`telnyx/api_resources/`. The path name singularized should typically match
+the record type of the object returned e.g. `/v2/available_phone_numbers`
+returns a list of objects with the record_type `available_phone_number`.
+Inherit from the classes that define the behavior available on the endpoint,one or more of `CreateableAPIResource`, `DeletableAPIResource`,
+`ListableAPIResource`, `UpdateableAPIResource`.
+
+2. Import your class in `telnyx/api_resources/__init__.py`.
+
+3. Add your new class to the `OBJECT_CLASSES` block in `telnyx/util.py`.
+
+4. Add tests for your new class under `tests/api_resources/`.
+
+
+[api-keys]: https://portal.telnyx.com/#/app/auth/v2
+[black]: https://github.com/ambv/black
+[pipenv]: https://github.com/pypa/pipenv
+[telnyx-mock]: https://github.com/team-telnyx/telnyx-mock
+
+## Releasing
+
+1. Update version in
+ * `setup.py` (in the `setup()` call, the `version` kwarg)
+ * `telnyx/__init__.py` (the `__version__` string)
+2. Create new branch, add changes, commit, and push
+3. Ensure commit passes tests in [Travis][travis-telnyx-python]
+4. Tag that commit with `git tag -a v{VERSION} -m "Release v{VERSION}"`, and push the tag `git push --follow-tags`
+5. Ensure checked out copy is entirely clean (best to create a new environment...)
+6. `make dists`
+7. *If you haven't done it before*, download the upload API keys from LastPass (search for "pypi") and put the contents between "PYPIRC FILE" tags into `~/.pypirc-telnyx`.
+8. `make testupload`, check that it looks OK on PyPI and that it's installable via `pip`.
+9. `make liveupload`, repeat checks for live version.
+10. Ta-da.
+
+[travis-telnyx-python]: https://travis-ci.org/team-telnyx/telnyx-python
+
+
+## Acknowledgments
+
+The contributors and maintainers of Telnyx Python would like to extend their
+deep gratitude to the authors of [Stripe Python][stripe-python], upon which
+this project is based. Thank you for developing such elegant, usable, and
+extensible code and for sharing it with the community.
+
+[stripe-python]: https://github.com/stripe/stripe-python
+
+<!--
+# vim: set tw=79:
+-->
+
+
+%package help
+Summary: Development documents and examples for telnyx
+Provides: python3-telnyx-doc
+%description help
+# Telnyx Python Library
+
+[![image](https://img.shields.io/pypi/v/telnyx.svg)][pypi]
+[![image](https://img.shields.io/pypi/l/telnyx.svg)][pypi]
+[![image](https://img.shields.io/pypi/pyversions/telnyx.svg)][pypi]
+[![Build Status](https://github.com/team-telnyx/telnyx-python/workflows/Python/badge.svg)][Actions]
+[![Coverage Status](https://coveralls.io/repos/github/team-telnyx/telnyx-python/badge.svg?branch=master)][coveralls]
+[![Join Slack](https://img.shields.io/badge/join-slack-infomational)](https://joinslack.telnyx.com/)
+
+[pypi]: https://pypi.org/project/telnyx/
+[Actions]: https://github.com/team-telnyx/telnyx-python/actions
+[coveralls]: https://coveralls.io/github/team-telnyx/telnyx-python?branch=master
+
+The Telnyx Python library provides convenient access to the Telnyx API from
+applications written in the Python language. It includes a pre-defined set of
+classes for API resources that initialize themselves dynamically from API
+responses which makes it compatible with a wide range of versions of the Telnyx
+API.
+
+## Documentation
+
+See the [API Reference](https://developers.telnyx.com/docs/api/v2/overview) and the [Setup Guides](https://developers.telnyx.com/docs/v2/development/dev-env-setup).
+
+## Installation
+
+You don't need this source code unless you want to modify the package. If you just
+want to use the package, just run:
+
+ pip install --upgrade telnyx
+
+Install from source with:
+
+ python setup.py install
+
+### Non x86/x86_64 Processors
+
+The `telnyx` package is distributed as a wheel (pre-compiled package) for easy
+installation. The wheel is built only for x86/x86_64 processors. When
+installing the package on a different architecture, like ARM, the `pip`
+installer will fall back to installing from source. As a result, you will
+need to ensure you have the additional dependencies installed. This will
+affect you if you're using a Raspberry Pi, for example.
+
+For ARM specifically, as an alternative to a source install, you could look
+into using https://www.piwheels.org/ for ARM compiled wheels.
+
+### Requirements
+
+- Python 2.7 or 3.5+ (PyPy supported)
+
+#### Additional Requirements for Source Install
+
+- build-essentials (gcc, make)
+- python-dev
+- libffi-dev
+
+_These packages are listed as they are named on Ubuntu._
+
+## Usage
+
+The library needs to be configured with your account's API Key which is
+available in your [Telnyx Dashboard][api-keys]. Set `telnyx.api_key` to its
+value:
+
+```python
+import telnyx
+telnyx.api_key = "KEY01234_yoursecretkey"
+
+# Retrieve single Messaging Profile
+telnyx.MessagingProfile.retrieve("123")
+
+# List Messaging Profiles
+profiles = telnyx.MessagingProfile.list()
+
+# Retrieve next page of list results
+profiles.next_page()
+
+# Loop over all page results
+for page in profiles.auto_paging_iter():
+ print(page)
+```
+
+You can read more about our API Keys [here](https://developers.telnyx.com/docs/v2/development/authentication).
+
+### Per-Request Configuration
+
+For apps that need to use multiple keys during the lifetime of a process,
+it's also possible to set a per-request key and/or account:
+
+```python
+import telnyx
+
+# list messaging profiles
+telnyx.MessagingProfile.list(
+ api_key="super-secret...",
+)
+
+# retrieve single messaging profile
+telnyx.MessagingProfile.retrieve(
+ "123",
+ api_key="other-secret...",
+)
+```
+
+### Configuring an HTTP Client
+
+The library can be configured to use `urlfetch`, `requests`, `pycurl`, or
+`urllib2` with `telnyx.default_http_client`:
+
+```python
+client = telnyx.http_client.UrlFetchClient()
+client = telnyx.http_client.RequestsClient()
+client = telnyx.http_client.PycurlClient()
+client = telnyx.http_client.Urllib2Client()
+telnyx.default_http_client = client
+```
+
+Without a configured client, by default the library will attempt to load
+libraries in the order above (i.e. `urlfetch` is preferred with `urllib2` used
+as a last resort). We usually recommend that people use `requests`.
+
+### Configuring a Proxy
+
+A proxy can be configured with `telnyx.proxy`:
+
+```python
+telnyx.proxy = "https://user:pass@example.com:1234"
+```
+
+### Configuring Automatic Retries
+
+Number of automatic retries on requests that fail due to an intermittent
+network problem can be configured:
+
+```python
+telnyx.max_network_retries = 2
+```
+
+### Reserved word keyword arguments
+The Telnyx API includes `from` as an attribute that can be set on messages.
+`from` is also a reserved word in Python. If you would like to use keyword
+arguments where an argument is a reserved word you can add the suffix `_` e.g.
+
+```
+telnyx.Message.create(
+ to="+18665550001",
+ from_="+18445550001",
+ text="Foo"
+)
+```
+
+The argument will be automatically rewritten to `from` in the keyword arguments dict.
+
+> Pro Tip: You can alternatively unpack a dictionary like so:
+> ```python
+> message = {
+> "from": "+18445550001",
+> "to": "+18665550001",
+> "text": "Foo",
+> }
+> telnyx.Message.create(**message)
+> ```
+
+### Logging
+
+The library can be configured to emit logging that will give you better insight
+into what it's doing. The `info` logging level is usually most appropriate for
+production use, but `debug` is also available for more verbosity.
+
+There are a few options for enabling it:
+
+1. Set the environment variable `TELNYX_LOG` to the value `debug` or `info`
+
+ ```
+ $ export TELNYX_LOG=debug
+ ```
+
+2. Set `telnyx.log`:
+
+ ```py
+ import telnyx
+ telnyx.log = 'debug'
+ ```
+
+3. Enable it through Python's logging module:
+ ```py
+ import logging
+ logging.basicConfig()
+ logging.getLogger('telnyx').setLevel(logging.DEBUG)
+ ```
+
+### Writing a Plugin
+
+If you're writing a plugin that uses the library, we'd appreciate it if you
+identified using `telnyx.set_app_info()`:
+
+```py
+telnyx.set_app_info("MyAwesomePlugin", version="1.2.34", url="https://myawesomeplugin.info")
+```
+
+This information is passed along when the library makes calls to the Telnyx
+API.
+
+## Development
+
+The test suite depends on [telnyx-mock], so make sure to fetch and run it from a
+background terminal ([telnyx-mock's README][telnyx-mock] also contains
+instructions for installing via Homebrew and other methods):
+
+ go get -u github.com/team-telnyx/telnyx-mock
+ telnyx-mock
+
+Install [pipenv][pipenv], then install all dependencies for the project:
+
+ pipenv install --dev
+
+Run all tests on all supported Python versions:
+
+ make test
+
+Run all tests for a specific Python version (modify `-e` according to your Python target):
+
+ pipenv run tox -e py27
+
+Run all tests in a single file:
+
+ pipenv run tox -e py27 -- tests/api_resources/abstract/test_updateable_api_resource.py
+
+Run a single test suite:
+
+ pipenv run tox -e py27 -- tests/api_resources/abstract/test_updateable_api_resource.py::TestUpdateableAPIResource
+
+Run a single test:
+
+ pipenv run tox -e py27 -- tests/api_resources/abstract/test_updateable_api_resource.py::TestUpdateableAPIResource::test_save
+
+Run the linter with:
+
+ make lint
+
+The library uses [Black][black] for code formatting. Code must be formatted
+with Black before PRs are submitted, otherwise CI will fail. Run the formatter
+with:
+
+ make fmt
+
+### Adding a new endpoint
+
+1. Define a class for the object that the endpoint interacts with under
+`telnyx/api_resources/`. The path name singularized should typically match
+the record type of the object returned e.g. `/v2/available_phone_numbers`
+returns a list of objects with the record_type `available_phone_number`.
+Inherit from the classes that define the behavior available on the endpoint,one or more of `CreateableAPIResource`, `DeletableAPIResource`,
+`ListableAPIResource`, `UpdateableAPIResource`.
+
+2. Import your class in `telnyx/api_resources/__init__.py`.
+
+3. Add your new class to the `OBJECT_CLASSES` block in `telnyx/util.py`.
+
+4. Add tests for your new class under `tests/api_resources/`.
+
+
+[api-keys]: https://portal.telnyx.com/#/app/auth/v2
+[black]: https://github.com/ambv/black
+[pipenv]: https://github.com/pypa/pipenv
+[telnyx-mock]: https://github.com/team-telnyx/telnyx-mock
+
+## Releasing
+
+1. Update version in
+ * `setup.py` (in the `setup()` call, the `version` kwarg)
+ * `telnyx/__init__.py` (the `__version__` string)
+2. Create new branch, add changes, commit, and push
+3. Ensure commit passes tests in [Travis][travis-telnyx-python]
+4. Tag that commit with `git tag -a v{VERSION} -m "Release v{VERSION}"`, and push the tag `git push --follow-tags`
+5. Ensure checked out copy is entirely clean (best to create a new environment...)
+6. `make dists`
+7. *If you haven't done it before*, download the upload API keys from LastPass (search for "pypi") and put the contents between "PYPIRC FILE" tags into `~/.pypirc-telnyx`.
+8. `make testupload`, check that it looks OK on PyPI and that it's installable via `pip`.
+9. `make liveupload`, repeat checks for live version.
+10. Ta-da.
+
+[travis-telnyx-python]: https://travis-ci.org/team-telnyx/telnyx-python
+
+
+## Acknowledgments
+
+The contributors and maintainers of Telnyx Python would like to extend their
+deep gratitude to the authors of [Stripe Python][stripe-python], upon which
+this project is based. Thank you for developing such elegant, usable, and
+extensible code and for sharing it with the community.
+
+[stripe-python]: https://github.com/stripe/stripe-python
+
+<!--
+# vim: set tw=79:
+-->
+
+
+%prep
+%autosetup -n telnyx-2.0.0
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-telnyx -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Wed May 10 2023 Python_Bot <Python_Bot@openeuler.org> - 2.0.0-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..ae81585
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+b9820ecc3abd33e725092244101db821 telnyx-2.0.0.tar.gz