import re
import click
from click import BadParameter
from steamship import Steamship
from steamship.data.manifest import Manifest, PluginConfig, SteamshipRegistry
from steamship.data.user import User
[docs]
def validate_handle(handle: str) -> str:
if re.fullmatch(r"[a-z\-]+", handle) is not None:
return handle
else:
raise BadParameter("Handle must only include lowercase letters and -")
[docs]
def validate_version_handle(handle: str) -> str:
if re.fullmatch(r"[a-z0-9\-.]+", handle) is not None:
return handle
else:
raise BadParameter("Handle must only include lowercase letters, numbers, . and -")
[docs]
def manifest_init_wizard(client: Steamship):
click.secho(
"It looks like you don't yet have a steamship.json to deploy. Let's create one.",
fg="cyan",
)
deployable_type = click.prompt(
"Is this a package or a plugin?",
default="package",
type=click.Choice(["package", "plugin"]),
show_choices=False,
)
handle = click.prompt(
f"What handle would you like to use for your {deployable_type}? Valid characters are a-z and -",
value_proc=validate_handle,
)
# TODO: claim the handle right here!
version_handle = "0.0.1"
plugin_detail = None
if deployable_type == "plugin":
plugin_type = click.prompt(
"What type of plugin is this?",
default="tagger",
type=click.Choice(
["tagger", "blockifier", "exporter", "fileImporter", "corpusImporter", "generator"]
),
show_choices=True,
)
if plugin_type == "tagger":
trainable = click.confirm("Is the plugin trainable?", default=False)
else:
trainable = False
if plugin_type == "generator":
streaming = click.confirm("Will the plugin stream its results?", default=False)
else:
streaming = False
plugin_detail = PluginConfig(isTrainable=trainable, type=plugin_type, streaming=streaming)
public = click.confirm(f"Do you want this {deployable_type} to be public?", default=True)
user = User.current(client)
author = click.prompt("How should we list your author name?", default=user.handle)
tagline = None
author_github = None
if public:
tagline = click.prompt(f"Want to give the {deployable_type} a tagline?", default="")
author_github = click.prompt(
"If you'd like this associated with your github account, please input your github username",
default="",
)
tag_string = click.prompt(
f"Want to give the {deployable_type} some tags? (comma separated)", default="Prompt API"
)
tags = [tag.strip() for tag in tag_string.split(",")]
return Manifest(
type=deployable_type,
handle=handle,
version=version_handle,
description="",
author=author,
public=public,
plugin=plugin_detail,
build_config={"ignore": ["tests", "examples"]},
configTemplate={},
steamshipRegistry=SteamshipRegistry(
tagline=tagline, authorGithub=author_github, authorName=author, tags=tags
),
)