mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 12:54:40 +01:00
257 lines
8.5 KiB
Python
257 lines
8.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Package for handling pype command line arguments."""
|
|
import os
|
|
import sys
|
|
|
|
import click
|
|
|
|
# import sys
|
|
from .pype_commands import PypeCommands
|
|
|
|
|
|
@click.group(invoke_without_command=True)
|
|
@click.pass_context
|
|
@click.option("--use-version",
|
|
expose_value=False, help="use specified version")
|
|
@click.option("--use-staging", is_flag=True,
|
|
expose_value=False, help="use staging variants")
|
|
def main(ctx):
|
|
"""Pype is main command serving as entry point to pipeline system.
|
|
|
|
It wraps different commands together.
|
|
"""
|
|
if ctx.invoked_subcommand is None:
|
|
ctx.invoke(tray)
|
|
|
|
|
|
@main.command()
|
|
@click.option("-d", "--dev", is_flag=True, help="Settings in Dev mode")
|
|
def settings(dev=False):
|
|
"""Show Pype Settings UI."""
|
|
PypeCommands().launch_settings_gui(dev)
|
|
|
|
|
|
@main.command()
|
|
def standalonepublisher():
|
|
"""Show Pype Standalone publisher UI."""
|
|
PypeCommands().launch_standalone_publisher()
|
|
|
|
|
|
@main.command()
|
|
@click.option("-d", "--debug",
|
|
is_flag=True, help=("Run pype tray in debug mode"))
|
|
def tray(debug=False):
|
|
"""Launch pype tray.
|
|
|
|
Default action of pype command is to launch tray widget to control basic
|
|
aspects of pype. See documentation for more information.
|
|
|
|
Running pype with `--debug` will result in lot of information useful for
|
|
debugging to be shown in console.
|
|
"""
|
|
PypeCommands().launch_tray(debug)
|
|
|
|
|
|
@main.command()
|
|
@click.option("-d", "--debug", is_flag=True, help="Print debug messages")
|
|
@click.option("--ftrack-url", envvar="FTRACK_SERVER",
|
|
help="Ftrack server url")
|
|
@click.option("--ftrack-user", envvar="FTRACK_API_USER",
|
|
help="Ftrack api user")
|
|
@click.option("--ftrack-api-key", envvar="FTRACK_API_KEY",
|
|
help="Ftrack api key")
|
|
@click.option("--ftrack-events-path",
|
|
envvar="FTRACK_EVENTS_PATH",
|
|
help=("path to ftrack event handlers"))
|
|
@click.option("--no-stored-credentials", is_flag=True,
|
|
help="don't use stored credentials")
|
|
@click.option("--store-credentials", is_flag=True,
|
|
help="store provided credentials")
|
|
@click.option("--legacy", is_flag=True,
|
|
help="run event server without mongo storing")
|
|
@click.option("--clockify-api-key", envvar="CLOCKIFY_API_KEY",
|
|
help="Clockify API key.")
|
|
@click.option("--clockify-workspace", envvar="CLOCKIFY_WORKSPACE",
|
|
help="Clockify workspace")
|
|
def eventserver(debug,
|
|
ftrack_url,
|
|
ftrack_user,
|
|
ftrack_api_key,
|
|
ftrack_events_path,
|
|
no_stored_credentials,
|
|
store_credentials,
|
|
legacy,
|
|
clockify_api_key,
|
|
clockify_workspace):
|
|
"""Launch ftrack event server.
|
|
|
|
This should be ideally used by system service (such us systemd or upstart
|
|
on linux and window service).
|
|
|
|
You have to set either proper environment variables to provide URL and
|
|
credentials or use option to specify them. If you use --store_credentials
|
|
provided credentials will be stored for later use.
|
|
"""
|
|
if debug:
|
|
os.environ['OPENPYPE_DEBUG'] = "3"
|
|
|
|
PypeCommands().launch_eventservercli(
|
|
ftrack_url,
|
|
ftrack_user,
|
|
ftrack_api_key,
|
|
ftrack_events_path,
|
|
no_stored_credentials,
|
|
store_credentials,
|
|
legacy,
|
|
clockify_api_key,
|
|
clockify_workspace
|
|
)
|
|
|
|
|
|
@main.command()
|
|
@click.argument("output_json_path")
|
|
@click.option("--project", help="Project name", default=None)
|
|
@click.option("--asset", help="Asset name", default=None)
|
|
@click.option("--task", help="Task name", default=None)
|
|
@click.option("--app", help="Application name", default=None)
|
|
def extractenvironments(output_json_path, project, asset, task, app):
|
|
"""Extract environment variables for entered context to a json file.
|
|
|
|
Entered output filepath will be created if does not exists.
|
|
|
|
All context options must be passed otherwise only pype's global
|
|
environments will be extracted.
|
|
|
|
Context options are "project", "asset", "task", "app"
|
|
"""
|
|
PypeCommands.extractenvironments(
|
|
output_json_path, project, asset, task, app
|
|
)
|
|
|
|
|
|
@main.command()
|
|
@click.argument("paths", nargs=-1)
|
|
@click.option("-d", "--debug", is_flag=True, help="Print debug messages")
|
|
def publish(debug, paths):
|
|
"""Start CLI publishing.
|
|
|
|
Publish collects json from paths provided as an argument.
|
|
More than one path is allowed.
|
|
"""
|
|
if debug:
|
|
os.environ['OPENPYPE_DEBUG'] = '3'
|
|
PypeCommands.publish(list(paths))
|
|
|
|
|
|
@main.command()
|
|
@click.option("-d", "--debug", is_flag=True, help="Print debug messages")
|
|
@click.option("-p", "--project", required=True,
|
|
help="name of project asset is under")
|
|
@click.option("-a", "--asset", required=True,
|
|
help="name of asset to which we want to copy textures")
|
|
@click.option("--path", required=True,
|
|
help="path where textures are found",
|
|
type=click.Path(exists=True))
|
|
def texturecopy(debug, project, asset, path):
|
|
"""Copy specified textures to provided asset path.
|
|
|
|
It validates if project and asset exists. Then it will use speedcopy to
|
|
copy all textures found in all directories under --path to destination
|
|
folder, determined by template texture in anatomy. I will use source
|
|
filename and automatically rise version number on directory.
|
|
|
|
Result will be copied without directory structure so it will be flat then.
|
|
Nothing is written to database.
|
|
"""
|
|
if debug:
|
|
os.environ['OPENPYPE_DEBUG'] = '3'
|
|
PypeCommands().texture_copy(project, asset, path)
|
|
|
|
|
|
@main.command(context_settings={"ignore_unknown_options": True})
|
|
@click.option("--app", help="Registered application name")
|
|
@click.option("--project", help="Project name",
|
|
default=lambda: os.environ.get('AVALON_PROJECT', ''))
|
|
@click.option("--asset", help="Asset name",
|
|
default=lambda: os.environ.get('AVALON_ASSET', ''))
|
|
@click.option("--task", help="Task name",
|
|
default=lambda: os.environ.get('AVALON_TASK', ''))
|
|
@click.option("--tools", help="List of tools to add")
|
|
@click.option("--user", help="Pype user name",
|
|
default=lambda: os.environ.get('OPENPYPE_USERNAME', ''))
|
|
@click.option("-fs",
|
|
"--ftrack-server",
|
|
help="Registered application name",
|
|
default=lambda: os.environ.get('FTRACK_SERVER', ''))
|
|
@click.option("-fu",
|
|
"--ftrack-user",
|
|
help="Registered application name",
|
|
default=lambda: os.environ.get('FTRACK_API_USER', ''))
|
|
@click.option("-fk",
|
|
"--ftrack-key",
|
|
help="Registered application name",
|
|
default=lambda: os.environ.get('FTRACK_API_KEY', ''))
|
|
@click.argument('arguments', nargs=-1)
|
|
def launch(app, project, asset, task,
|
|
ftrack_server, ftrack_user, ftrack_key, tools, arguments, user):
|
|
"""Launch registered application name in Pype context.
|
|
|
|
You can define applications in pype-config toml files. Project, asset name
|
|
and task name must be provided (even if they are not used by app itself).
|
|
Optionally you can specify ftrack credentials if needed.
|
|
|
|
ARGUMENTS are passed to launched application.
|
|
|
|
"""
|
|
# TODO: this needs to switch for Settings
|
|
if ftrack_server:
|
|
os.environ["FTRACK_SERVER"] = ftrack_server
|
|
|
|
if ftrack_server:
|
|
os.environ["FTRACK_API_USER"] = ftrack_user
|
|
|
|
if ftrack_server:
|
|
os.environ["FTRACK_API_KEY"] = ftrack_key
|
|
|
|
if user:
|
|
os.environ["OPENPYPE_USERNAME"] = user
|
|
|
|
# test required
|
|
if not project or not asset or not task:
|
|
print("!!! Missing required arguments")
|
|
return
|
|
|
|
PypeCommands().run_application(app, project, asset, task, tools, arguments)
|
|
|
|
|
|
@main.command()
|
|
@click.option("-p", "--path", help="Path to zip file", default=None)
|
|
def generate_zip(path):
|
|
"""Generate Pype zip from current sources.
|
|
|
|
If PATH is not provided, it will create zip file in user data dir.
|
|
|
|
"""
|
|
PypeCommands().generate_zip(path)
|
|
|
|
|
|
@main.command(
|
|
context_settings=dict(
|
|
ignore_unknown_options=True,
|
|
allow_extra_args=True))
|
|
@click.argument("script", required=True, type=click.Path(exists=True))
|
|
def run(script):
|
|
"""Run python script in Pype context."""
|
|
import runpy
|
|
|
|
if not script:
|
|
print("Error: missing path to script file.")
|
|
else:
|
|
|
|
args = sys.argv
|
|
args.remove("run")
|
|
args.remove(script)
|
|
sys.argv = args
|
|
args_string = " ".join(args[1:])
|
|
print(f"... running: {script} {args_string}")
|
|
runpy.run_path(script, run_name="__main__", )
|