Fix unicode error in py2.7 for example plugin

Strings should now be passed to the plugins as unicode values in py2.7
so we have to make sure that we don't convert those into ascii by using
python str instead of u'' strings.
This commit is contained in:
Jeff Ammons 2016-06-05 13:28:28 -07:00
parent 2b9e9b752c
commit c81bdfec99
8 changed files with 41 additions and 11 deletions

View file

@ -67,6 +67,8 @@ This will print the incoming message json (dict) to the screen where the bot is
Plugins having a method defined as ```catch_all(data)``` will receive ALL events from the websocket. This is useful for learning the names of events and debugging. Plugins having a method defined as ```catch_all(data)``` will receive ALL events from the websocket. This is useful for learning the names of events and debugging.
Note: If you're using Python 2.x, the incoming data should be a unicode string, be careful you don't coerce it into a normal str object as it will cause errors on output. You can add `from __future__ import unicode_literals` to your plugin file to avoid this.
####Outgoing data ####Outgoing data
Plugins can send messages back to any channel, including direct messages. This is done by appending a two item array to the outputs global array. The first item in the array is the channel ID and the second is the message text. Example that writes "hello world" when the plugin is started: Plugins can send messages back to any channel, including direct messages. This is done by appending a two item array to the outputs global array. The first item in the array is the channel ID and the second is the message text. Example that writes "hello world" when the plugin is started:

View file

@ -1,3 +1,6 @@
from __future__ import unicode_literals
# don't convert to ascii in py2.7 when creating string to return
import time import time
outputs = [] outputs = []

View file

@ -1,3 +1,6 @@
from __future__ import unicode_literals
# don't convert to ascii in py2.7 when creating string to return
import time import time
crontable = [] crontable = []
outputs = [] outputs = []

View file

@ -1,3 +1,6 @@
from __future__ import unicode_literals
# don't convert to ascii in py2.7 when creating string to return
crontable = [] crontable = []
outputs = [] outputs = []

View file

@ -1,4 +1,7 @@
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals
# don't convert to ascii in py2.7 when creating string to return
import os import os
import pickle import pickle

View file

@ -1,4 +1,5 @@
#!/usr/bin/env python #!/usr/bin/env python
from __future__ import unicode_literals
import sys import sys
import glob import glob
import os import os
@ -101,8 +102,7 @@ class RtmBot(object):
if limiter: if limiter:
time.sleep(.1) time.sleep(.1)
limiter = False limiter = False
message = output[1] channel.send_message(output[1])
channel.send_message("{}".format(message))
limiter = True limiter = True
def crons(self): def crons(self):

View file

@ -4,7 +4,7 @@ from distutils.core import setup
setup( setup(
name='rtmbot', name='rtmbot',
version='0.10', version='0.2.0',
description='A Slack bot written in python that connects via the RTM API.', description='A Slack bot written in python that connects via the RTM API.',
author='Ryan Huber', author='Ryan Huber',
author_email='rhuber@gmail.com', author_email='rhuber@gmail.com',

View file

@ -1,11 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
try: try:
from unittest.mock import Mock from unittest.mock import Mock, create_autospec
except ImportError: except ImportError:
from mock import Mock from mock import Mock, create_autospec
from testfixtures import LogCapture from testfixtures import LogCapture
from rtmbot.core import RtmBot from slackclient import SlackClient, _channel, _server, _util
from rtmbot.core import RtmBot, Plugin
def init_rtmbot(): def init_rtmbot():
''' Initializes an instance of RTMBot with some default values ''' ''' Initializes an instance of RTMBot with some default values '''
@ -33,14 +34,21 @@ def test_output():
''' Test that sending a message behaves as expected ''' ''' Test that sending a message behaves as expected '''
rtmbot = init_rtmbot() rtmbot = init_rtmbot()
# Mock the slack_client object # Mock the slack_client object with Server, Channel objects and needed methods
slackclient_mock = Mock() slackclient_mock = create_autospec(SlackClient)
channel_mock = Mock() server_mock = create_autospec(_server.Server)
# Mock Server with channels method and correct return value
slackclient_mock.server = server_mock
searchlist_mock = create_autospec(_util.SearchList)
server_mock.channels = searchlist_mock
channel_mock = create_autospec(_channel.Channel)
slackclient_mock.server.channels.find.return_value = channel_mock slackclient_mock.server.channels.find.return_value = channel_mock
rtmbot.slack_client = slackclient_mock rtmbot.slack_client = slackclient_mock
# mock the plugin object to return a sample response # mock the plugin object to return a sample response
plugin_mock = Mock() plugin_mock = create_autospec(Plugin)
plugin_mock.do_output.return_value = [['C12345678', 'test message']] plugin_mock.do_output.return_value = [['C12345678', 'test message']]
rtmbot.bot_plugins.append(plugin_mock) rtmbot.bot_plugins.append(plugin_mock)
@ -50,10 +58,18 @@ def test_output():
# test that the output matches the expected value # test that the output matches the expected value
channel_mock.send_message.assert_called_with('test message') channel_mock.send_message.assert_called_with('test message')
# test that unicode messages work as expected # test that emoji messages work as expected
channel_mock.reset_mock() channel_mock.reset_mock()
plugin_mock.reset_mock() plugin_mock.reset_mock()
plugin_mock.do_output.return_value = [['C12345678', '🚀 testing']] plugin_mock.do_output.return_value = [['C12345678', '🚀 testing']]
rtmbot.output() rtmbot.output()
channel_mock.send_message.assert_called_with('🚀 testing') channel_mock.send_message.assert_called_with('🚀 testing')
# test that unicode messages work as expected
channel_mock.reset_mock()
plugin_mock.reset_mock()
plugin_mock.do_output.return_value = [['C12345678', 'ù hœø3ö']]
rtmbot.output()
channel_mock.send_message.assert_called_with('ù hœø3ö')