Adding logging decorator

This commit is contained in:
leandrotoledo 2015-07-20 07:53:58 -03:00
parent 859f04e566
commit 61530aeb34
17 changed files with 91 additions and 50 deletions

View file

@ -5,6 +5,7 @@
__author__ = 'leandrotoledodesouza@gmail.com'
__version__ = '1.9'
from .base import TelegramObject
from .user import User
from .message import Message
from .update import Update
@ -25,7 +26,6 @@ from .forcereply import ForceReply
from .inputfile import InputFile
from .error import TelegramError
from .emoji import Emoji
from .base import TelegramObject
from .bot import Bot
__all__ = ['Bot', 'Emoji', 'TelegramError', 'InputFile', 'ReplyMarkup',

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class Audio(TelegramObject):

View file

@ -11,7 +11,7 @@ class TelegramObject(object):
__metaclass__ = ABCMeta
def __str__(self):
return self.to_data()
return str(self.to_data())
def __getitem__(self, item):
return self.__dict__[item]

View file

@ -13,16 +13,25 @@ except ImportError:
from urllib2 import urlopen, Request
from urllib2 import HTTPError, URLError
import functools
import logging
from telegram import (User, Message, Update, UserProfilePhotos, TelegramError,
ReplyMarkup, InputFile)
ReplyMarkup, InputFile, TelegramObject)
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
class Bot(object):
class Bot(TelegramObject):
def __init__(self,
token,
base_url=None):
base_url=None,
debug=True):
self.log = logging.getLogger(__name__)
if debug:
self.log.setLevel(logging.DEBUG)
else:
self.log.setLevel(logging.INFO)
self.token = token
@ -45,39 +54,27 @@ class Bot(object):
@property
def name(self):
if self.username:
return '@%s' % self.username
if self.last_name:
return '%s %s' % (self.first_name, self.last_name)
return self.first_name
return '@%s' % self.username
def clearCredentials(self):
"""Clear any credentials for this instance.
"""
self.__auth = False
def log(func):
logger = logging.getLogger(func.__module__)
def getMe(self):
"""A simple method for testing your bot's auth token.
Returns:
A telegram.User instance representing that bot if the
credentials are valid, None otherwise.
"""
url = '%s/getMe' % self.base_url
json_data = self._requestUrl(url, 'GET')
data = self._parseAndCheckTelegram(json_data)
return User.de_json(data)
@functools.wraps(func)
def decorator(self, *args, **kwargs):
logger.debug('Entering %s' % func.__name__)
result = func(self, *args, **kwargs)
logger.debug(result)
logger.debug('Exiting %s' % func.__name__)
return result
return decorator
def message(func):
"""
Returns:
A telegram.Message instance representing the message posted.
"""
functools.wraps(func)
def wrap(self, *args, **kwargs):
@functools.wraps(func)
def decorator(self, *args, **kwargs):
url, data = func(self, *args, **kwargs)
if kwargs.get('reply_to_message_id'):
@ -98,18 +95,41 @@ class Bot(object):
return data
return Message.de_json(data)
return wrap
return decorator
def require_authentication(func):
functools.wraps(func)
def wrap(self, *args, **kwargs):
@functools.wraps(func)
def decorator(self, *args, **kwargs):
if not self.__auth:
raise TelegramError({'message': "API must be authenticated."})
return func(self, *args, **kwargs)
return wrap
return decorator
@log
@require_authentication
def clearCredentials(self):
"""Clear any credentials for this instance.
"""
self.__auth = False
@log
def getMe(self):
"""A simple method for testing your bot's auth token.
Returns:
A telegram.User instance representing that bot if the
credentials are valid, None otherwise.
"""
url = '%s/getMe' % self.base_url
json_data = self._requestUrl(url, 'GET')
data = self._parseAndCheckTelegram(json_data)
return User.de_json(data)
@log
@message
@require_authentication
def sendMessage(self,
@ -149,6 +169,7 @@ class Bot(object):
return url, data
@log
@message
@require_authentication
def forwardMessage(self,
@ -182,6 +203,7 @@ class Bot(object):
return url, data
@log
@message
@require_authentication
def sendPhoto(self,
@ -223,6 +245,7 @@ class Bot(object):
return url, data
@log
@message
@require_authentication
def sendAudio(self,
@ -260,6 +283,7 @@ class Bot(object):
return url, data
@log
@message
@require_authentication
def sendDocument(self,
@ -294,6 +318,7 @@ class Bot(object):
return url, data
@log
@message
@require_authentication
def sendSticker(self,
@ -328,6 +353,7 @@ class Bot(object):
return url, data
@log
@message
@require_authentication
def sendVideo(self,
@ -363,6 +389,7 @@ class Bot(object):
return url, data
@log
@message
@require_authentication
def sendLocation(self,
@ -399,6 +426,7 @@ class Bot(object):
return url, data
@log
@message
@require_authentication
def sendChatAction(self,
@ -430,6 +458,7 @@ class Bot(object):
return url, data
@log
@require_authentication
def getUserProfilePhotos(self,
user_id,
@ -465,6 +494,7 @@ class Bot(object):
return UserProfilePhotos.de_json(data)
@log
@require_authentication
def getUpdates(self,
offset=None,
@ -505,6 +535,7 @@ class Bot(object):
return [Update.de_json(x) for x in data]
@log
@require_authentication
def setWebhook(self,
webhook_url):
@ -531,6 +562,7 @@ class Bot(object):
return True
@log
def _requestUrl(self,
url,
method,
@ -581,6 +613,7 @@ class Bot(object):
return 0 # if not a POST or GET request
@log
def _parseAndCheckTelegram(self,
json_data):
"""Try and parse the JSON returned from Telegram and return an empty
@ -604,3 +637,11 @@ class Bot(object):
raise TelegramError({'message': 'JSON decoding'})
return data['result']
def to_data(self):
data = {'id': self.id,
'username': self.username,
'first_name': self.username}
if self.last_name:
data['last_name'] = self.last_name
return data

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class Contact(TelegramObject):

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class Document(TelegramObject):

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class ForceReply(TelegramObject):

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class GroupChat(TelegramObject):

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class Location(TelegramObject):

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class Message(TelegramObject):
@ -181,7 +181,7 @@ class Message(TelegramObject):
if self.document:
data['document'] = self.document.to_data()
if self.photo:
data['photo'] = self.photo.to_data()
data['photo'] = [p.to_data() for p in self.photo]
if self.sticker:
data['sticker'] = self.sticker.to_data()
if self.video:

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class PhotoSize(TelegramObject):

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class ReplyMarkup(TelegramObject):

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class Sticker(TelegramObject):

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class Update(TelegramObject):

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class User(TelegramObject):

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class UserProfilePhotos(TelegramObject):

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
from .base import TelegramObject
from telegram import TelegramObject
class Video(TelegramObject):