Source code for errbot.plugin_wizard
#!/usr/bin/env python
import errno
import jinja2
import os
import re
import sys
from configparser import ConfigParser
from errbot.version import VERSION
[docs]def new_plugin_wizard(directory=None):
"""
Start the wizard to create a new plugin in the current working directory.
"""
if directory is None:
print("This wizard will create a new plugin for you in the current directory.")
directory = os.getcwd()
else:
print("This wizard will create a new plugin for you in '%s'." % directory)
if os.path.exists(directory) and not os.path.isdir(directory):
print("Error: The path '%s' exists but it isn't a directory" % directory)
sys.exit(1)
name = ask(
"What should the name of your new plugin be?",
validation_regex=r'^[a-zA-Z][a-zA-Z0-9 _-]*$'
).strip()
module_name = name.lower().replace(' ', '_')
directory_name = name.lower().replace(' ', '-')
class_name = "".join([s.capitalize() for s in name.lower().split(' ')])
description = ask(
"What may I use as a short (one-line) description of your plugin?"
)
python_version = "3"
errbot_min_version = ask(
"Which minimum version of errbot will your plugin work with? "
"Leave blank to support any version or input CURRENT to select the "
"current version (%s)" % VERSION
).strip()
if errbot_min_version.upper() == "CURRENT":
errbot_min_version = VERSION
errbot_max_version = ask(
"Which maximum version of errbot will your plugin work with? "
"Leave blank to support any version or input CURRENT to select the "
"current version (%s)" % VERSION
).strip()
if errbot_max_version.upper() == "CURRENT":
errbot_max_version = VERSION
plug = ConfigParser()
plug["Core"] = {
"Name": name,
"Module": module_name,
}
plug["Documentation"] = {
"Description": description,
}
plug["Python"] = {
"Version": python_version,
}
if errbot_max_version != "" or errbot_min_version != "":
plug["Errbot"] = {}
if errbot_min_version != "":
plug["Errbot"]["Min"] = errbot_min_version
if errbot_max_version != "":
plug["Errbot"]["Max"] = errbot_max_version
plugin_path = directory
plugfile_path = os.path.join(plugin_path, module_name + ".plug")
pyfile_path = os.path.join(plugin_path, module_name + ".py")
try:
os.makedirs(plugin_path, mode=0o700)
except IOError as e:
if e.errno != errno.EEXIST:
raise
if os.path.exists(plugfile_path) or os.path.exists(pyfile_path):
ask(
"Warning: A plugin with this name was already found at {path}\n"
"If you continue, these will be overwritten.\n"
"Press Ctrl+C to abort now or type in 'overwrite' to confirm overwriting of these files."
"".format(
path=os.path.join(directory, module_name + ".{py,plug}")
),
valid_responses=["overwrite"],
)
with open(plugfile_path, 'w') as f:
plug.write(f)
with open(pyfile_path, 'w') as f:
f.write(render_plugin(locals()))
print("Success! You'll find your new plugin at '%s'" % plugfile_path)
print("(Don't forget to include a LICENSE file if you are going to publish your plugin)")
[docs]def ask(question, valid_responses=None, validation_regex=None):
"""
Ask the user for some input. If valid_responses is supplied, the user
must respond with something present in this list.
"""
response = None
print(question)
while True:
response = input("> ")
if valid_responses is not None:
assert isinstance(valid_responses, list)
if response in valid_responses:
break
else:
print("Bad input: Please answer one of: %s" % ", ".join(valid_responses))
elif validation_regex is not None:
m = re.search(validation_regex, response)
if m is None:
print("Bad input: Please respond with something matching this regex: %s" % validation_regex)
else:
break
else:
break
return response
[docs]def render_plugin(values):
"""
Render the Jinja template for the plugin with the given values.
"""
env = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates')),
auto_reload=False,
keep_trailing_newline=True,
autoescape=True
)
template = env.get_template("new_plugin.py.tmpl")
return template.render(**values)
if __name__ == "__main__":
try:
new_plugin_wizard()
except KeyboardInterrupt:
sys.exit(1)