123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- """Pynecone CLI to create, run, and deploy apps."""
- import os
- import requests
- import typer
- from pynecone import constants, utils
- from pynecone.compiler import templates
- # Create the app.
- cli = typer.Typer()
- @cli.command()
- def version():
- """Get the Pynecone version."""
- utils.console.print(constants.VERSION)
- @cli.command()
- def init():
- """Initialize a new Pynecone app."""
- app_name = utils.get_default_app_name()
- with utils.console.status(f"[bold]Initializing {app_name}") as status:
- # Only create the app directory if it doesn't exist.
- if not os.path.exists(constants.CONFIG_FILE):
- # Create a configuration file.
- with open(constants.CONFIG_FILE, "w") as f:
- f.write(templates.PCCONFIG.format(app_name=app_name))
- utils.console.log(f"Initialize the app directory.")
- # Initialize the app directory.
- utils.cp(constants.APP_TEMPLATE_DIR, app_name)
- utils.mv(
- os.path.join(app_name, constants.APP_TEMPLATE_FILE),
- os.path.join(app_name, app_name + constants.PY_EXT),
- )
- utils.cp(constants.ASSETS_TEMPLATE_DIR, constants.APP_ASSETS_DIR)
- # Install bun if it isn't already installed.
- if not os.path.exists(utils.get_bun_path()):
- utils.console.log(f"Installing bun...")
- os.system(constants.INSTALL_BUN)
- # Initialize the web directory.
- utils.console.log(f"Initializing the web directory.")
- utils.rm(os.path.join(constants.WEB_TEMPLATE_DIR, constants.NODE_MODULES))
- utils.rm(os.path.join(constants.WEB_TEMPLATE_DIR, constants.PACKAGE_LOCK))
- utils.cp(constants.WEB_TEMPLATE_DIR, constants.WEB_DIR)
- utils.console.log(f"[bold green]Finished Initializing: {app_name}")
- @cli.command()
- def run(
- env: constants.Env = constants.Env.DEV,
- frontend: bool = True,
- backend: bool = True,
- ):
- """Run the app.
- Args:
- env: The environment to run the app in.
- frontend: Whether to run the frontend.
- backend: Whether to run the backend.
- """
- utils.console.rule("[bold]Starting Pynecone App")
- app = utils.get_app()
- frontend_cmd = backend_cmd = None
- if env == constants.Env.DEV:
- frontend_cmd, backend_cmd = utils.run_frontend, utils.run_backend
- if env == constants.Env.PROD:
- frontend_cmd, backend_cmd = utils.run_frontend_prod, utils.run_backend_prod
- assert frontend_cmd and backend_cmd, "Invalid env"
- if frontend:
- frontend_cmd(app)
- if backend:
- backend_cmd(app)
- @cli.command()
- def deploy(dry_run: bool = False):
- """Deploy the app to the hosting service.
- Args:
- dry_run: Whether to run a dry run.
- """
- # Get the app config.
- config = utils.get_config()
- config.api_url = utils.get_production_backend_url()
- # Check if the deploy url is set.
- if config.deploy_url is None:
- typer.echo("This feature is coming soon!")
- return
- # Compile the app in production mode.
- typer.echo("Compiling production app")
- app = utils.get_app()
- utils.export_app(app)
- # Exit early if this is a dry run.
- if dry_run:
- return
- # Deploy the app.
- data = {"userId": config.username, "projectId": config.app_name}
- original_response = requests.get(config.deploy_url, params=data)
- response = original_response.json()
- print("response", response)
- frontend = response["frontend_resources_url"]
- backend = response["backend_resources_url"]
- # Upload the frontend and backend.
- with open(constants.FRONTEND_ZIP, "rb") as f:
- response = requests.put(frontend, data=f)
- with open(constants.BACKEND_ZIP, "rb") as f:
- response = requests.put(backend, data=f)
- main = cli
- if __name__ == "__main__":
- main()
|