initial commit
This commit is contained in:
commit
f605b65b6c
60
.gitignore
vendored
Normal file
60
.gitignore
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
pip-wheel-metadata/
|
||||||
|
share/python-wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.nox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Visual Studio Code
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
38
README.md
Normal file
38
README.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# voipms-python
|
||||||
|
|
||||||
|
A python-based API wrapper for [voip.ms](https://voip.ms/).
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
You can install this package from PyPi using [pip](http://www.pip-installer.org/en/latest/), a package manager for Python. Once pip is installed, run
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pip install --upgrade voipms-python
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also install from source with:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
python setup.py install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
- Python 2.7+ or 3.4+
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
The library needs to be configured with your account's email and API password, the latter of which can be created [here](https://voip.ms/m/api.php). Set the variables `voipms.email` and `voipms.apikey` to their respective values:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import voipms
|
||||||
|
|
||||||
|
voipms.email = "test@email.com"
|
||||||
|
voipms.api_key = "01N0sWTdiutWTHNF"
|
||||||
|
|
||||||
|
# get current account balance
|
||||||
|
voipms.general.get_balance()
|
||||||
|
|
||||||
|
# remove did from account
|
||||||
|
voipms.dids.cancel_dids(did="5551234567")
|
||||||
|
```
|
68
setup.py
Normal file
68
setup.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
from setuptools.command.test import test as TestCommand
|
||||||
|
|
||||||
|
class PyTest(TestCommand):
|
||||||
|
user_options = [("pytest-args=", "a", "Arguments to pass to pytest")]
|
||||||
|
|
||||||
|
def initialize_options(self):
|
||||||
|
TestCommand.initialize_options(self)
|
||||||
|
self.pytest_args = "-n auto"
|
||||||
|
|
||||||
|
def run_tests(self):
|
||||||
|
import shlex
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
errno = pytest.main(shlex.split(self.pytest_args))
|
||||||
|
sys.exit(errno)
|
||||||
|
|
||||||
|
here = os.path.abspath(os.path.dirname(__file__))
|
||||||
|
|
||||||
|
version_contents = {}
|
||||||
|
with open(os.path.join(here, "voipms", "version.py"), encoding="utf-8") as f:
|
||||||
|
exec(f.read(), version_contents)
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name="voipms-python",
|
||||||
|
version=version_contents["VERSION"],
|
||||||
|
description="Python wrapper for the voip.ms REST API",
|
||||||
|
author="Daniel Tesfai",
|
||||||
|
author_email="danielmtesfai@gmail.com",
|
||||||
|
url="https://github.com/dtesfai/voipms-python",
|
||||||
|
license="MIT",
|
||||||
|
keywords="voipms api",
|
||||||
|
packages=find_packages(exclude=["tests", "tests.*"]),
|
||||||
|
zip_safe=False,
|
||||||
|
install_requires=[
|
||||||
|
'requests >= 2.20; python_version >= "3.0"'
|
||||||
|
],
|
||||||
|
python_requires=">=3.4",
|
||||||
|
tests_require=[
|
||||||
|
"pytest >= 4.6.2, < 4.7",
|
||||||
|
"pytest-mock >= 1.10.4",
|
||||||
|
"pytest-xdist >= 1.28.0",
|
||||||
|
"pytest-cov >= 2.7.1",
|
||||||
|
# coverage 5.0 pre-releases don't work, and setuptools doesn't ignore
|
||||||
|
# pre-releases (cf. https://github.com/pypa/setuptools/issues/855)
|
||||||
|
"coverage >= 4.5.3, < 5",
|
||||||
|
],
|
||||||
|
cmdclass={"test": PyTest},
|
||||||
|
project_urls={
|
||||||
|
"Bug Tracker": "https://github.com/dtesfai/voipms-python/issues",
|
||||||
|
"Source Code": "https://github.com/dtesfai/voipms-python",
|
||||||
|
},
|
||||||
|
classifiers=[
|
||||||
|
"Development Status :: 2 - Pre-Alpha",
|
||||||
|
"Intended Audience :: Developers",
|
||||||
|
"License :: OSI Approved :: MIT License",
|
||||||
|
"Operating System :: OS Independent",
|
||||||
|
"Programming Language :: Python :: 3",
|
||||||
|
"Programming Language :: Python :: 3.4",
|
||||||
|
"Programming Language :: Python :: 3.5",
|
||||||
|
"Programming Language :: Python :: 3.6",
|
||||||
|
"Programming Language :: Python :: 3.7",
|
||||||
|
"Programming Language :: Python :: Implementation :: PyPy",
|
||||||
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
||||||
|
],
|
||||||
|
)
|
0
tests/__init__.py
Normal file
0
tests/__init__.py
Normal file
0
voipms/__init__.py
Normal file
0
voipms/__init__.py
Normal file
73
voipms/api/__init__.py
Normal file
73
voipms/api/__init__.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
import os
|
||||||
|
import platform
|
||||||
|
import requests
|
||||||
|
from voipms.base.exceptions import VoipException
|
||||||
|
|
||||||
|
class Client(object):
|
||||||
|
def __init__(self, username=None, password=None):
|
||||||
|
|
||||||
|
self.username = username or os.environ.get('VOIPMS_ACCOUNT_USER')
|
||||||
|
self.password = password or os.environ.get('VOIPMS_API_TOKEN')
|
||||||
|
self.api_base = "https://voip.ms/api/v1/rest.php"
|
||||||
|
|
||||||
|
if not self.username or not self.password:
|
||||||
|
raise VoipException("Credentials are required to create a Client")
|
||||||
|
|
||||||
|
self.auth = (self.username, self.password)
|
||||||
|
|
||||||
|
# Domains
|
||||||
|
self._accounts = None
|
||||||
|
self._call_detail_records = None
|
||||||
|
self._dids = None
|
||||||
|
self._general = None
|
||||||
|
self._voicemail = None
|
||||||
|
|
||||||
|
def request(self, method, auth=None, params={}):
|
||||||
|
auth = auth or self.auth
|
||||||
|
|
||||||
|
params["api_username"] = auth[0]
|
||||||
|
params["api_password"] = auth[1]
|
||||||
|
params["method"] = method
|
||||||
|
params["content_type"] = "json"
|
||||||
|
|
||||||
|
response = requests.get(self.api_base, params=params).json()
|
||||||
|
return response
|
||||||
|
|
||||||
|
@property
|
||||||
|
def accounts(self):
|
||||||
|
if self._accounts is None:
|
||||||
|
from voipms.api.accounts import Accounts
|
||||||
|
self._accounts = Accounts(self)
|
||||||
|
return self._accounts
|
||||||
|
|
||||||
|
@property
|
||||||
|
def call_detail_records(self):
|
||||||
|
if self._call_detail_records is None:
|
||||||
|
from voipms.api.call_detail_records import CallDetailRecords
|
||||||
|
self._call_detail_records = CallDetailRecords()
|
||||||
|
return self._call_detail_records
|
||||||
|
|
||||||
|
@property
|
||||||
|
def dids(self):
|
||||||
|
if self._dids is None:
|
||||||
|
from voipms.api.dids import DIDs
|
||||||
|
self._dids = DIDs()
|
||||||
|
return self._dids
|
||||||
|
|
||||||
|
@property
|
||||||
|
def general(self):
|
||||||
|
if self._general is None:
|
||||||
|
from voipms.api.general import General
|
||||||
|
self._general = General()
|
||||||
|
return self._general
|
||||||
|
|
||||||
|
@property
|
||||||
|
def voicemail(self):
|
||||||
|
if self._voicemail is None:
|
||||||
|
from voipms.api.voicemail import Voicemail
|
||||||
|
self._voicemail = Voicemail()
|
||||||
|
return self._voicemail
|
||||||
|
|
||||||
|
@property
|
||||||
|
def balance(self):
|
||||||
|
return self.accounts.balance
|
12
voipms/api/accounts/__init__.py
Normal file
12
voipms/api/accounts/__init__.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
from voipms.api.accounts.balance import Balance
|
||||||
|
|
||||||
|
class Accounts():
|
||||||
|
def __init__(self, base):
|
||||||
|
self._balance = None
|
||||||
|
self.base = base
|
||||||
|
|
||||||
|
@property
|
||||||
|
def balance(self):
|
||||||
|
if self._balance is None:
|
||||||
|
self._balance = Balance(self.base)
|
||||||
|
return self._balance
|
7
voipms/api/accounts/balance.py
Normal file
7
voipms/api/accounts/balance.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
class Balance():
|
||||||
|
def __init__(self, base):
|
||||||
|
self.method = "getBalance"
|
||||||
|
self.base = base
|
||||||
|
|
||||||
|
def fetch(self, params={}):
|
||||||
|
return self.base.request(self.method)
|
3
voipms/api/call_detail_records/__init__.py
Normal file
3
voipms/api/call_detail_records/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
class CallDetailRecords():
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
3
voipms/api/dids/__init__.py
Normal file
3
voipms/api/dids/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
class DIDs():
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
3
voipms/api/general/__init__.py
Normal file
3
voipms/api/general/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
class General():
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
3
voipms/api/voicemail/__init__.py
Normal file
3
voipms/api/voicemail/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
class Voicemail():
|
||||||
|
def __init__(self):
|
||||||
|
self._balance = None
|
0
voipms/base/__init__.py
Normal file
0
voipms/base/__init__.py
Normal file
14
voipms/base/exceptions.py
Normal file
14
voipms/base/exceptions.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
class VoipException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class VoipRestException(VoipException):
|
||||||
|
def __init__(self, status, message=""):
|
||||||
|
self.msg = message
|
||||||
|
self.status = status
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.msg or "<empty message>"
|
11
voipms/base/values.py
Normal file
11
voipms/base/values.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
unset = object()
|
||||||
|
|
||||||
|
|
||||||
|
def of(d):
|
||||||
|
"""
|
||||||
|
Remove unset values from a dict.
|
||||||
|
|
||||||
|
:param dict d: A dict to strip.
|
||||||
|
:return dict: A dict with unset values removed.
|
||||||
|
"""
|
||||||
|
return {k: v for k, v in d.items() if v != unset}
|
0
voipms/version.py
Normal file
0
voipms/version.py
Normal file
Loading…
Reference in New Issue
Block a user