From fa759fc97cf4899f9f454a3a5b6be077682d89eb Mon Sep 17 00:00:00 2001 From: Eeshan Garg Date: Tue, 3 Apr 2018 21:52:10 -0230 Subject: [PATCH] integrations/trello: Improve the Trello script. This commit makes a bunch of improvements: 1. Use format() for string formatting instead of the old style. 2. Stop returning stuff where we don't have to. 3. URL generation should not be done by the script, especially since our eventual goal is for the Zulip server to automatically generate a webhook URL. So the user should be able to supply the URL in the config file. Plus, this makes it easier to test the script with non-Zulip URLs (such as RequestBin). 4. Removed unnecessary arguments. --- zulip/integrations/trello/README.md | 9 +- zulip/integrations/trello/zulip_trello.py | 105 ++++-------------- .../trello/zulip_trello_config.py | 15 +-- .../trello/zulip_trello_webhooks.csv | 2 +- 4 files changed, 27 insertions(+), 104 deletions(-) diff --git a/zulip/integrations/trello/README.md b/zulip/integrations/trello/README.md index 230b261..9a15e38 100644 --- a/zulip/integrations/trello/README.md +++ b/zulip/integrations/trello/README.md @@ -1,16 +1,13 @@ -# Easy Trello integration for Zulip - -An easy Trello integration for Zulip +# A script that automates setting up a webhook with Trello Usage : 1. Fill the needed information in `zulip_trello_config.py` : - - The bot API KEY, - The Trello API KEY, - The Trello TOKEN, - - The Zulip host + - The Zulip webhook URL 2. Execute the script : - $ python zulip_trello.py + $ python zulip_trello.py diff --git a/zulip/integrations/trello/zulip_trello.py b/zulip/integrations/trello/zulip_trello.py index 74be8ff..3513792 100755 --- a/zulip/integrations/trello/zulip_trello.py +++ b/zulip/integrations/trello/zulip_trello.py @@ -10,63 +10,26 @@ import sys import argparse import requests -# Import configuration import zulip_trello_config as configuration -VERSION = '0.2' - - -# argument's settings -parser = argparse.ArgumentParser() - -parser.add_argument( - 'stream_name', - help='The stream to which to integrate Trello.' -) - -parser.add_argument( - 'trello_board_name', - help='The Trello board name.' -) - -parser.add_argument( - 'trello_board_id', - help='The Trello board short id.' -) - -parser.add_argument( - '-v', - '--version', - help='Display Version and exit', - action='version', - version='zulip_trello v'+VERSION -) - - -def check_configuration() -> bool: +def check_configuration() -> None: """check_configuration Check if configuration fields have been populated in zulip_trello_config.py - - :returns: config imported from module zulip_trello_config - """ errors = [] - if not configuration.BOT_API_KEY: - errors.append('Error: BOT_API_KEY is not defined in zulip_trello_config.py') - if not configuration.TRELLO_API_KEY: errors.append('Error: TRELLO_API_KEY is not defined in zulip_trello_config.py') if not configuration.TRELLO_TOKEN: errors.append('Error: TRELLO_TOKEN is not defined in zulip_trello_config.py') - if not configuration.ZULIP_HOST: - errors.append('Error: ZULIP_HOST is not defined in zulip_trello_config.py') + if not configuration.ZULIP_WEBHOOK_URL: + errors.append('Error: ZULIP_WEBHOOK_URL is not defined in zulip_trello_config.py') if len(errors) > 0: for error in errors: @@ -74,9 +37,6 @@ def check_configuration() -> bool: sys.exit(1) - return True - - def get_model_id(options: argparse.Namespace) -> str: """get_model_id @@ -88,7 +48,7 @@ def get_model_id(options: argparse.Namespace) -> str: """ - trello_api_url = 'https://api.trello.com/1/board/%s' % ( + trello_api_url = 'https://api.trello.com/1/board/{}'.format( options.trello_board_id ) @@ -128,17 +88,10 @@ def get_webhook_id(options: argparse.Namespace, id_model: str) -> str: data = { 'key': configuration.TRELLO_API_KEY, 'token': configuration.TRELLO_TOKEN, - 'description': 'Webhook for Zulip integration (From Trello %s to Zulip %s)' % ( + 'description': 'Webhook for Zulip integration (From Trello {} to Zulip)'.format( options.trello_board_name, - options.stream_name - ), - 'callbackURL': '%s' % ( - 'https://%s/api/v1/external/trello?api_key=%s&stream=%s' % ( - configuration.ZULIP_HOST, - configuration.BOT_API_KEY, - options.stream_name - ), ), + 'callbackURL': configuration.ZULIP_WEBHOOK_URL, 'idModel': id_model } @@ -156,52 +109,40 @@ def get_webhook_id(options: argparse.Namespace, id_model: str) -> str: return webhook_info_json['id'] -def log_webhook_info(options: argparse.Namespace, id_webhook: str) -> bool: +def log_webhook_info(options: argparse.Namespace, id_webhook: str) -> None: """log_webhook_info Log webhook info in csv file for possible future use :options: argparse.Namespace arguments :id_webhook: str Trello webhook id - - :returns: bool - """ with open('zulip_trello_webhooks.csv', 'a') as webhooks_file: webhooks_file.write( - '%s,%s,%s\n' % ( - options.stream_name, + '{},{}\n'.format( options.trello_board_name, id_webhook ) ) - return True - - -def create_webhook(options: argparse.Namespace) -> bool: +def create_webhook(options: argparse.Namespace) -> None: """create_webhook Create Trello webhook :options: argparse.Namespace arguments - :returns: bool - """ # first, we need to get the idModel - print('Getting Trello idModel for the %s board...' % (options.trello_board_name)) + print('Getting Trello idModel for the {} board...'.format(options.trello_board_name)) id_model = get_model_id(options) if id_model: print('Success! The idModel is', id_model) - # Next, we need to create the webhook - print('Creating the webhook for the %s stream...' % (options.stream_name)) - id_webhook = get_webhook_id(options, id_model) if id_webhook: @@ -211,26 +152,20 @@ def create_webhook(options: argparse.Namespace) -> bool: # Log informations for possible future needs print('Logging webhook information') - was_logged = log_webhook_info(options, id_webhook) - - if was_logged: - print( - 'Success! The webhook for the %s stream from the %s Trello board was successfully created.' % ( - options.stream_name, - options.trello_board_name - ) - ) - - print('\nYou can find the webhooks information in the zulip_trello_webhooks.csv file.') - - return True + log_webhook_info(options, id_webhook) + print('Success! The webhook for the {} Trello board was successfully created.'.format( + options.trello_board_name)) + print('\nYou can find the webhooks information in the zulip_trello_webhooks.csv file.') def main() -> None: - options = parser.parse_args() - if check_configuration(): - creation_status = create_webhook(options) + parser = argparse.ArgumentParser() + parser.add_argument('trello_board_name', help='The Trello board name.') + parser.add_argument('trello_board_id', help='The Trello board short id.') + options = parser.parse_args() + check_configuration() + create_webhook(options) if __name__ == '__main__': main() diff --git a/zulip/integrations/trello/zulip_trello_config.py b/zulip/integrations/trello/zulip_trello_config.py index e05039a..39c239f 100644 --- a/zulip/integrations/trello/zulip_trello_config.py +++ b/zulip/integrations/trello/zulip_trello_config.py @@ -23,15 +23,6 @@ ### REQUIRED CONFIGURATION ### -# It needs some API KEY and Token (from Zulip and Trello) -# For more information, please visit https://zulipchat.com/integrations/doc/trello - -# BOT_API_KEY -# -# In Zulip, create a new bot for *incomming Webhook*. -# It will generate an API KEY -BOT_API_KEY = "" - # TRELLO_API_KEY # # Visit https://trello.com/1/appkey/generate to generate @@ -46,7 +37,7 @@ TRELLO_API_KEY = "" # Take care to replace with the appropriate value TRELLO_TOKEN = "" -# ZULIP_HOST +# ZULIP_WEBHOOK_URL # -# The hostname of your Zulip application -ZULIP_HOST = "" +# The webhook URL that Trello will query +ZULIP_WEBHOOK_URL = "" diff --git a/zulip/integrations/trello/zulip_trello_webhooks.csv b/zulip/integrations/trello/zulip_trello_webhooks.csv index e50ae92..585c171 100644 --- a/zulip/integrations/trello/zulip_trello_webhooks.csv +++ b/zulip/integrations/trello/zulip_trello_webhooks.csv @@ -1 +1 @@ -stream_name,trello_board_name,id_webhook +trello_board_name,id_webhook