integrations: Render bots' docs alongside integration docs.

This commit implements support for rendering static files in
under static/generated/bots/ in the same manner as we render
our webhooks/integration documentation. Said static files are
generated by tools/setup/generate_zulip_bots_static_files.py
during provisioning.
This commit is contained in:
Eeshan Garg
2017-09-16 21:58:59 -02:30
committed by Tim Abbott
parent 0368b76468
commit 11b7d219bd
3 changed files with 50 additions and 2 deletions

View File

@@ -47,6 +47,7 @@ CATEGORIES = {
'project-management': _('Project management'),
'productivity': _('Productivity'),
'version-control': _('Version control'),
'bots': _('Interactive bots'),
} # type: Dict[str, str]
class Integration(object):
@@ -94,6 +95,42 @@ class Integration(object):
# type: (Dict[Any, Any]) -> None
self.doc_context = context
class BotIntegration(Integration):
DEFAULT_LOGO_STATIC_PATH_PNG = 'static/generated/bots/{name}/logo.png'
DEFAULT_LOGO_STATIC_PATH_SVG = 'static/generated/bots/{name}/logo.svg'
ZULIP_LOGO_STATIC_PATH_PNG = 'static/images/logo/zulip-icon-128x128.png'
DEFAULT_DOC_PATH = '{name}/doc.md'
def __init__(self, name, categories, logo=None, secondary_line_text=None,
display_name=None, doc=None):
# type: (str, List[str], Optional[str], Optional[str], Optional[str], Optional[str]) -> None
super(BotIntegration, self).__init__(
name,
client_name=name,
categories=categories,
secondary_line_text=secondary_line_text,
)
if logo is None:
if os.path.isfile(self.DEFAULT_LOGO_STATIC_PATH_PNG.format(name=name)):
logo = self.DEFAULT_LOGO_STATIC_PATH_PNG.format(name=name)
elif os.path.isfile(self.DEFAULT_LOGO_STATIC_PATH_SVG.format(name=name)):
logo = self.DEFAULT_LOGO_STATIC_PATH_SVG.format(name=name)
else:
# TODO: Add a test for this by initializing one in a test.
logo = self.ZULIP_LOGO_STATIC_PATH_PNG # nocoverage
self.logo = logo
if display_name is None:
display_name = "{} Bot".format(name.title()) # nocoverage
else:
display_name = "{} Bot".format(display_name)
self.display_name = display_name
if doc is None:
doc = self.DEFAULT_DOC_PATH.format(name=name)
self.doc = doc
class EmailIntegration(Integration):
def is_enabled(self):
# type: () -> bool
@@ -387,6 +424,12 @@ INTEGRATIONS = {
doc='zerver/integrations/twitter.md'),
} # type: Dict[str, Integration]
BOT_INTEGRATIONS = [
BotIntegration('github_detail', ['version-control', 'bots'],
display_name='GitHub Detail'),
BotIntegration('googlesearch', ['bots'], display_name='Google Search'),
] # type: List[BotIntegration]
HUBOT_LOZENGES = {
'assembla': HubotLozenge('assembla', ['project-management', 'version-control']),
'bonusly': HubotLozenge('bonusly', ['hr']),
@@ -403,3 +446,6 @@ HUBOT_LOZENGES = {
for integration in WEBHOOK_INTEGRATIONS:
INTEGRATIONS[integration.name] = integration
for bot_integration in BOT_INTEGRATIONS:
INTEGRATIONS[bot_integration.name] = bot_integration

View File

@@ -85,7 +85,7 @@ def render_markdown_path(markdown_file_path, context=None):
if context.get('integrations_dict') is not None:
integration_dir = None
if markdown_file_path.endswith('doc.md'):
integration_dir = markdown_file_path.split('/')[0]
integration_dir = os.path.basename(os.path.dirname(markdown_file_path))
elif 'integrations' in markdown_file_path.split('/'):
integration_dir = os.path.splitext(os.path.basename(markdown_file_path))[0]
@@ -93,7 +93,8 @@ def render_markdown_path(markdown_file_path, context=None):
context['integration_name'] = integration.name
context['integration_display_name'] = integration.display_name
context['recommended_stream_name'] = integration.stream_name
if hasattr(integration, 'stream_name'):
context['recommended_stream_name'] = integration.stream_name
if hasattr(integration, 'url'):
context['integration_url'] = integration.url[3:]

View File

@@ -71,6 +71,7 @@ class DocPageTest(ZulipTestCase):
'IFTTT'
])
self._test('/integrations/doc-html/travis', 'Your Travis CI notifications may look like:')
self._test('/integrations/doc-html/googlesearch', 'This bot allows users to do Google search queries')
self._test('/devlogin/', 'Normal users', landing_page=False)
self._test('/devtools/', 'Useful development URLs')
self._test('/errors/404/', 'Page not found')