From 9fe12dfa83284ecde3368c222f8d2d31ea38199c Mon Sep 17 00:00:00 2001 From: Timur Tuchkovenko Date: Fri, 27 Feb 2015 00:10:32 +0500 Subject: [PATCH 01/22] python3 compatibility manager fix --- asterisk/manager.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/asterisk/manager.py b/asterisk/manager.py index 8eefcb0..6fa9bb0 100644 --- a/asterisk/manager.py +++ b/asterisk/manager.py @@ -56,6 +56,7 @@ import sys import os import socket import threading +from six import PY3 from six.moves import queue import re from types import * @@ -262,7 +263,7 @@ class Manager(object): # lock the socket and send our command try: - self._sock.write(command) + self._sock.write(command.encode('ascii')) self._sock.flush() except socket.error as e: raise ManagerSocketException(e.errno, e.strerror) @@ -290,6 +291,7 @@ class Manager(object): try: lines = [] for line in self._sock: + line = line.decode('ascii') # check to see if this is the greeting line if not self.title and '/' in line and not ':' in line: # store the title of the manager we are connecting to: @@ -452,7 +454,10 @@ class Manager(object): try: _sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) _sock.connect((host, port)) - self._sock = _sock.makefile() + if PY3: + self._sock = _sock.makefile(mode='rwb', buffering=0) + else: + self._sock = _sock.makefile() _sock.close() except socket.error as e: raise ManagerSocketException(e.errno, e.strerror) From e4ed55c479eb9df87440646b6803c1c79f838658 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Sun, 29 Mar 2015 00:26:23 -0700 Subject: [PATCH 02/22] Version bump! --- asterisk/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asterisk/__init__.py b/asterisk/__init__.py index 510678b..40e9390 100644 --- a/asterisk/__init__.py +++ b/asterisk/__init__.py @@ -11,4 +11,4 @@ manager - a module for interacting with the asterisk manager interface """ __all__ = ['agi', 'agitb', 'config', 'manager'] -__version__ = '0.4.1' +__version__ = '0.4.2' From 567a328c6493da7ff3c0bb6952c187908712ef1e Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Sun, 29 Mar 2015 00:27:59 -0700 Subject: [PATCH 03/22] Updating changelog. --- CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 09f49b4..2a742f8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2015-03-39 Timur Tuchkovenko + * UPGRADE: AMI fix for Python 3 compatibility. + 2014-10-08 Timur Tuchkovenko * UPGRADE: initial Python 3 support. Now pyst2 requires Python 'six' module. Some minor changes in other files. From e7630f09abc2165d9e88953dec4efa412f54852a Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Sun, 29 Mar 2015 00:31:10 -0700 Subject: [PATCH 04/22] Fixing formatting. --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 399915a..1486101 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ pyst2: A Python Interface to Asterisk -==================================== +===================================== Pyst2 consists of a set of interfaces and libraries to allow programming of Asterisk from python. The library currently supports AGI, AMI, and the parsing From 67dec4c827ea08606871f3465d1de37dd9c97e3f Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Sun, 29 Mar 2015 00:32:28 -0700 Subject: [PATCH 05/22] Adding maintainer note. --- README.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 1486101..794d7ce 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,12 @@ pyst2: A Python Interface to Asterisk ===================================== +**NOTE**: This project is in need of an active maintainer. I'm quite busy with +other non-asterisk related projects in my personal time, so if you're a good +Python programmer, and working with this library and Asterisk on a daily basis +-- please consider maintaining the project! Contact me for more information: +r@rdegges.com + Pyst2 consists of a set of interfaces and libraries to allow programming of Asterisk from python. The library currently supports AGI, AMI, and the parsing of Asterisk configuration files. The library also includes debugging facilities @@ -15,7 +21,7 @@ My immediate plans include adding full documentation, re-writing some of the core routines, adding a test suite, and accepting pull requests. If you are one of the current maintainers, and would like to take over the -fork, please contact me: rdegges@gmail.com, so we can get that setup! +fork, please contact me: r@rdegges.com, so we can get that setup! Requirements ------------ From e47aa2729cbef8283301a25ce9edf3d5488646a6 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Sun, 29 Mar 2015 00:34:43 -0700 Subject: [PATCH 06/22] Cleaning up. --- README.rst | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index 794d7ce..46dddcb 100644 --- a/README.rst +++ b/README.rst @@ -23,23 +23,14 @@ of the core routines, adding a test suite, and accepting pull requests. If you are one of the current maintainers, and would like to take over the fork, please contact me: r@rdegges.com, so we can get that setup! -Requirements ------------- - -1. six Installation ------------ -Download from `Github project page`_. +To install ``pyst2``, just use pip! -.. _`Github project page`: https://github.com/rdegges/pyst2 + $ pip install pyst2 -Installation is the standard python install:: - - git clone https://github.com/rdegges/pyst2.git - cd pyst2 - python setup.py install --prefix=/usr/local Documentation ------------- @@ -63,15 +54,19 @@ directly on the host where Asterisk is running. Since Asterisk doesn't run on windows platforms (and probably never will) the agi part of the package can only be run on Asterisk platforms. + Credits ------- Thanks to Karl Putland for writing the original package. + Thanks to Matthew Nicholson for maintaining the package for some years and for handing over maintenance when he was no longer interested. + Thanks to Randall Degges for maintaining this for and accepting pull requests. + Things to do for pyst --------------------- From b1ecd2484711374d0f14abdcb127cb3be9a51bce Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Sun, 29 Mar 2015 00:34:53 -0700 Subject: [PATCH 07/22] Removing legacy upgrading notes. --- README.rst | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/README.rst b/README.rst index 46dddcb..e28192a 100644 --- a/README.rst +++ b/README.rst @@ -119,23 +119,6 @@ this, I'm currently satisfied with the threaded implementation): hooks will be called from the host application's main loop. -Upgrading from older versions ------------------------------ - -If upgrading from... - -* 0.2: - - - ``get_header()`` methods in ``manager.py`` now work like - ``dict.get()`` instead of ``dict[key]`` - - -* 0.1.0: - - - ``agi.get_variable`` no longer throws an exception, instead it - returns an empty string when a channel variable is not set. - - ``manager.quit()`` has be renamed to ``manager.close()`` - Source Code Repository Access ----------------------------- From fddefefdfbb524a4788242fc08a19bd9777338f8 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Sun, 29 Mar 2015 00:35:08 -0700 Subject: [PATCH 08/22] Removing old SVN references. --- README.rst | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/README.rst b/README.rst index e28192a..416e456 100644 --- a/README.rst +++ b/README.rst @@ -119,35 +119,6 @@ this, I'm currently satisfied with the threaded implementation): hooks will be called from the host application's main loop. -Source Code Repository Access ------------------------------ - -The current versions are kept in a Subversion repository on Sourceforge. -You can check out the trunk with:: - - svn co https://pyst.svn.sourceforge.net/svnroot/pyst/pyst/trunk pyst - -There is also a 0.2 branch in:: - - https://pyst.svn.sourceforge.net/svnroot/pyst/pyst/branches/0.2 - -which contains unreleased changes after 0.2 (which have been merged into -trunk *after* changing how manager commands to asterisk are parsed). - -Released versions are in:: - - https://pyst.svn.sourceforge.net/svnroot/pyst/pyst/tags - -For versions prior to the 0.2 release when Matthew Nicholson was -maintaining pyst, the changes are kept in a `monotone`_ repository -(monotone is a free distributed version control system). Please contact -Matthew via Sourceforge if you're interested in intermediate versions. - -.. _`monotone`: http://monotone.ca/ - -prior to that the sources are in the CVS repository on sourceforge. - - Changes ------- From 5bb2eb4036f0d0586fe0be4911749b0cd8630526 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Sun, 29 Mar 2015 00:35:24 -0700 Subject: [PATCH 09/22] Removing duplicate changes. --- README.rst | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/README.rst b/README.rst index 416e456..4a67bae 100644 --- a/README.rst +++ b/README.rst @@ -117,36 +117,3 @@ this, I'm currently satisfied with the threaded implementation): flexible. The current code will be consolidated into a single threaded design with hooks to have the library process events and such. These hooks will be called from the host application's main loop. - - -Changes -------- - -Version 0.3: Minor feature enhancements - -New maintainer Ralf Schlatterbeck, this is my first release, please -report any problems via the Sourceforge Bug-Tracker or email me -directly. Thanks to Karl Putland for writing the original package. -Thanks to Matthew Nicholson for maintaining the package for some years -and for handing over maintenance when he was no longer interested. -The parsing of answers from asterisk was completely rewritten. This -should fix problems people were having with commands returning embedded -'/' or empty lines. Some new manager commands added. - - - Add playdtmf manager command - - add sippeers and sipshowpeer manager commands - - rewritten manager communication - - should no longer choke on '/' in answers returned from a manager - command (fixes SF Bug 2947866) - - should now correctly parse multi-line output with embedded empty - lines, e.g. ``mgr.command('dialplan show')`` - - Bug-fix for list manipulation in ``event_dispatch``, thanks to Jan - Mueller, see mailinglist comment from 2008-04-18 - - Merge unreleased changes from repository of Matthew Nicholson - in particular a typo in ``agi.py`` for ``set_autohangup``, and change - of ``get_header`` methods (see Upgrading instructions). The fixed - ``manager.command`` support is already in (with a different - solution). The unreleased changes are also on the 0.2 branch in the - subversion repository in case somebody is interested. - -See the ChangeLog for older changes. From 5331ff646e72ed59227f31096b226041fc6a3d4d Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Sun, 29 Mar 2015 00:43:40 -0700 Subject: [PATCH 10/22] Adding readme updates / logo. --- README.rst | 39 +++++++++++++++++++++++++++++++++++++-- assets/snake-sketch.jpg | Bin 0 -> 51614 bytes 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 assets/snake-sketch.jpg diff --git a/README.rst b/README.rst index 4a67bae..b073de1 100644 --- a/README.rst +++ b/README.rst @@ -1,13 +1,44 @@ pyst2: A Python Interface to Asterisk ===================================== +.. image:: https://img.shields.io/pypi/v/pyst2.svg + :alt: pyst2 Release + :target: https://pypi.python.org/pypi/pyst2 + +.. image:: https://img.shields.io/pypi/dm/pyst2.svg + :alt: pyst2 Downloads + :target: https://pypi.python.org/pypi/pyst2 + +.. image:: https://img.shields.io/travis/rdegges/pyst2.svg + :alt: pyst2 Build + :target: https://travis-ci.org/rdegges/pyst2 + +.. image:: https://github.com/rdegges/pyst2/raw/master/assets/snake-sketch.jpg + :alt: Snake Sketch + + +Meta +---- + +- Author: Randall Degges +- Email: r@rdegges.com +- Site: http://www.rdegges.com +- Status: *looking for maintainer*, active + **NOTE**: This project is in need of an active maintainer. I'm quite busy with other non-asterisk related projects in my personal time, so if you're a good Python programmer, and working with this library and Asterisk on a daily basis -- please consider maintaining the project! Contact me for more information: r@rdegges.com -Pyst2 consists of a set of interfaces and libraries to allow programming of +In the meantime, I'm happy to accept pull requests and cut releases as needed. +If you want to contribute to the project, please do! + + +Purpose +------- + +pyst2 consists of a set of interfaces and libraries to allow programming of Asterisk from python. The library currently supports AGI, AMI, and the parsing of Asterisk configuration files. The library also includes debugging facilities for AGI. @@ -27,10 +58,14 @@ fork, please contact me: r@rdegges.com, so we can get that setup! Installation ------------ -To install ``pyst2``, just use pip! +To install ``pyst2``, simply run: + +.. code-block:: console $ pip install pyst2 +This will install the latest version of the library automatically. + Documentation ------------- diff --git a/assets/snake-sketch.jpg b/assets/snake-sketch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1579a293519f417c31fa4e0392abc37cda5c896 GIT binary patch literal 51614 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

>(Jwf;^P=-)2ip{V)L7P6IlsLl`Hqdm)N=P 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 literal 0 HcmV?d00001 From 58a768eff9785c5a5f277fee30884b819d7da830 Mon Sep 17 00:00:00 2001 From: Areski Belaid Date: Mon, 30 Mar 2015 11:14:24 +0200 Subject: [PATCH 11/22] Fix MANIFEST.in --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 5a7b17f..7dec941 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,3 @@ include CHANGELOG -include README +include README.rst include MANIFEST.in From 390a299fee2db9759cb1d088dd2b588c0249a477 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Mon, 30 Mar 2015 09:32:07 -0700 Subject: [PATCH 12/22] Updating changelog. --- CHANGELOG | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 2a742f8..d01ada5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,8 @@ -2015-03-39 Timur Tuchkovenko +2015-03-30 Areski Belaid + + * Fixing the MANIFEST.in file I accidentally broke :) + +2015-03-29 Timur Tuchkovenko * UPGRADE: AMI fix for Python 3 compatibility. 2014-10-08 Timur Tuchkovenko From beb54cd6abde6381344980e926ff51b0a9a11f78 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Mon, 30 Mar 2015 09:32:31 -0700 Subject: [PATCH 13/22] Version bump. --- asterisk/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asterisk/__init__.py b/asterisk/__init__.py index 40e9390..2de6354 100644 --- a/asterisk/__init__.py +++ b/asterisk/__init__.py @@ -11,4 +11,4 @@ manager - a module for interacting with the asterisk manager interface """ __all__ = ['agi', 'agitb', 'config', 'manager'] -__version__ = '0.4.2' +__version__ = '0.4.3' From 55cc2a09b39914bdf96b8f947d96becab78aed17 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Tue, 31 Mar 2015 11:04:24 -0700 Subject: [PATCH 14/22] Porting setup.py -> setuptools. Also: adding in six as a dependency to fix the broken build. Fixes #11. --- setup.py | 60 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/setup.py b/setup.py index 46cae39..5f62cee 100755 --- a/setup.py +++ b/setup.py @@ -1,44 +1,43 @@ -#!/usr/bin/env python +"""Packaging files and information.""" -from distutils.core import setup + +from setuptools import setup from asterisk import __version__ as version -description = [] -f = open('README.rst') - -logo_stripped = False -for line in f: - if not logo_stripped and line.strip(): - continue - logo_stripped = True - description.append(line) - -licenses = ('Python Software Foundation License', - 'GNU Library or Lesser General Public License (LGPL)') - setup( - name='pyst2', - version=version, - description='A Python Interface to Asterisk', - long_description=''.join(description), author='Karl Putland', - author_email='kputland@users.sourceforge.net', - maintainer='Randall Degges', - maintainer_email='rdegges@gmail.com', - url='https://github.com/rdegges/pyst2', - packages=['asterisk'], - license=', '.join(licenses), - platforms='Any', - classifiers=[ + + # Basic package information: + name = 'pyst2', + version = version, + packages = ['asterisk'], + + # Packaging options: + zip_safe = False, + include_package_data = True, + + # Package dependencies: + install_requires = ['six>=1.9.0'], + + # Metadata for PyPI: + author = 'Randall Degges', + author_email = 'r@rdegges.com', + license = 'Python Software Foundation License / GNU Library or Lesser General Public License (LGPL) / UNLICENSE', + url = 'https://github.com/rdegges/pyst2', + keywords = 'python asterisk agi ami telephony telephony sip voip', + description = 'A Python Interface to Asterisk', + long_description = open('README.rst').read(), + + # Classifiers: + platforms = 'Any', + classifiers = [ 'Development Status :: 5 - Production/Stable', 'Environment :: Other Environment', 'Intended Audience :: Developers', 'Intended Audience :: Telecommunications Industry', 'Operating System :: OS Independent', 'Programming Language :: Python', - 'Programming Language :: Python :: 2.4', - 'Programming Language :: Python :: 2.5', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', @@ -48,5 +47,6 @@ setup( 'Topic :: Communications :: Internet Phone', 'Topic :: Communications :: Telephony', 'Topic :: Software Development :: Libraries :: Python Modules' - ] + ['License :: OSI Approved :: ' + l for l in licenses] + ], + ) From fe734a7afadc888bddc28bf3f67bfc3f812c9784 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Tue, 31 Mar 2015 11:05:02 -0700 Subject: [PATCH 15/22] Version bump. --- asterisk/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asterisk/__init__.py b/asterisk/__init__.py index 2de6354..97dc941 100644 --- a/asterisk/__init__.py +++ b/asterisk/__init__.py @@ -11,4 +11,4 @@ manager - a module for interacting with the asterisk manager interface """ __all__ = ['agi', 'agitb', 'config', 'manager'] -__version__ = '0.4.3' +__version__ = '0.4.4' From 68eee0027c72e67f8757a5c119310fd7abb23c5a Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Tue, 31 Mar 2015 11:05:47 -0700 Subject: [PATCH 16/22] Updating changelog. --- CHANGELOG | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index d01ada5..5573b01 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +2015-03-31 Randall Degges + + * Porting packaging to setuptools (modern). + * Adding six as a dependency (it was missing before). + 2015-03-30 Areski Belaid * Fixing the MANIFEST.in file I accidentally broke :) From be41ef480d667d419237e7f5e0bca1de559ef314 Mon Sep 17 00:00:00 2001 From: Artem Sorokin Date: Wed, 15 Jul 2015 15:47:39 +0300 Subject: [PATCH 17/22] Fix multiline command end marker for OpenVox GSM Gateway --- asterisk/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asterisk/manager.py b/asterisk/manager.py index 6fa9bb0..5846475 100644 --- a/asterisk/manager.py +++ b/asterisk/manager.py @@ -331,7 +331,7 @@ class Manager(object): line.split(':', 1)[1].strip() == 'Follows': wait_for_marker = True # same when seeing end of multiline response - if multiline and line.startswith('--END COMMAND--'): + if multiline and (line.startswith('--END COMMAND--') or line.strip().endswith('--END COMMAND--')): wait_for_marker = False multiline = False # same when seeing end of status response From dd0a54c42a0a126c6576bfc5fd44452698db2739 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Wed, 15 Jul 2015 12:57:22 -0700 Subject: [PATCH 18/22] Updating changelog. --- CHANGELOG | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 5573b01..33c70f6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2015-07-15 Artem Sorokin + + * Fix multiline command end marker for OpenVox GSM Gateway. + 2015-03-31 Randall Degges * Porting packaging to setuptools (modern). From 875079842bdc8dd74f96ebc275766bf291e500b7 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Wed, 15 Jul 2015 12:57:46 -0700 Subject: [PATCH 19/22] Version bump. --- asterisk/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asterisk/__init__.py b/asterisk/__init__.py index 97dc941..daeb1e8 100644 --- a/asterisk/__init__.py +++ b/asterisk/__init__.py @@ -11,4 +11,4 @@ manager - a module for interacting with the asterisk manager interface """ __all__ = ['agi', 'agitb', 'config', 'manager'] -__version__ = '0.4.4' +__version__ = '0.4.5' From 46a5ff8d97661df8fe85e3da586d8ecd0a47d003 Mon Sep 17 00:00:00 2001 From: Artem Sorokin Date: Thu, 16 Jul 2015 15:14:54 +0300 Subject: [PATCH 20/22] Support utf8 for commands. --- asterisk/manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asterisk/manager.py b/asterisk/manager.py index 5846475..2f84f68 100644 --- a/asterisk/manager.py +++ b/asterisk/manager.py @@ -263,7 +263,7 @@ class Manager(object): # lock the socket and send our command try: - self._sock.write(command.encode('ascii')) + self._sock.write(command.encode('utf8')) self._sock.flush() except socket.error as e: raise ManagerSocketException(e.errno, e.strerror) @@ -291,7 +291,7 @@ class Manager(object): try: lines = [] for line in self._sock: - line = line.decode('ascii') + line = line.decode('utf8') # check to see if this is the greeting line if not self.title and '/' in line and not ':' in line: # store the title of the manager we are connecting to: From 5657b8897636181e4dbdae9b55664032070ffd34 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Sat, 18 Jul 2015 19:17:56 -0700 Subject: [PATCH 21/22] Updating changelog. --- CHANGELOG | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 33c70f6..7b0cf9c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2015-07-18 Artem Sorokin + + * Fixing UTF-8 encoding issues. + 2015-07-15 Artem Sorokin * Fix multiline command end marker for OpenVox GSM Gateway. From 61f1090593abfe80fc3068da2020d9ce276b2458 Mon Sep 17 00:00:00 2001 From: Randall Degges Date: Sat, 18 Jul 2015 19:18:11 -0700 Subject: [PATCH 22/22] Version bump. --- asterisk/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asterisk/__init__.py b/asterisk/__init__.py index daeb1e8..13b48cd 100644 --- a/asterisk/__init__.py +++ b/asterisk/__init__.py @@ -11,4 +11,4 @@ manager - a module for interacting with the asterisk manager interface """ __all__ = ['agi', 'agitb', 'config', 'manager'] -__version__ = '0.4.5' +__version__ = '0.4.6'