mirror of https://github.com/chriskiehl/Gooey.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
4.1 KiB
106 lines
4.1 KiB
import json
|
|
from itertools import chain
|
|
|
|
from copy import deepcopy
|
|
|
|
from gooey.util.functional import compact
|
|
from typing import List, Optional
|
|
|
|
from gooey.gui.constants import VALUE_PLACEHOLDER
|
|
from gooey.gui.formatters import formatArgument
|
|
from gooey.python_bindings.types import FieldValue, Group, Item
|
|
from gooey.util.functional import merge # type: ignore
|
|
from gooey.gui.state import FullGooeyState
|
|
|
|
'''
|
|
primary :: Target -> Command -> Array Arg -> Array Arg -> Boolean -> CliString
|
|
validateForm :: Target -> Command -> Array Arg -> Array Arg -> CliString
|
|
validateField :: Target -> Command -> Array Arg -> Array Arg -> ArgId -> CliString
|
|
completed :: Target -> Command -> FromState -> CliString
|
|
failed :: Target -> Command -> FromState -> CliString
|
|
fieldAction :: Target -> Command ->
|
|
|
|
'''
|
|
|
|
|
|
def buildSuccessCmd(state: FullGooeyState):
|
|
subcommand = state['subcommands'][state['activeSelection']]
|
|
widgets = state['widgets'][subcommand]
|
|
|
|
|
|
|
|
|
|
def onSuccessCmd(target: str, subCommand: str, formState: List[str]) -> str:
|
|
command = subCommand if not subCommand == '::gooey/default' else ''
|
|
return f'{target} {command} --gooey-on-success {json.dumps(formState)}'
|
|
|
|
|
|
def onErrorCmd(target: str, subCommand: str, formState: List[str]) -> str:
|
|
command = subCommand if not subCommand == '::gooey/default' else ''
|
|
return f'{target} {command} --gooey-on-error {json.dumps(formState)}'
|
|
|
|
|
|
def formValidationCmd(target: str, subCommand: str, positionals: List[FieldValue], optionals: List[FieldValue]) -> str:
|
|
positional_args = [cmdOrPlaceholderOrNone(x) for x in positionals]
|
|
optional_args = [cmdOrPlaceholderOrNone(x) for x in optionals]
|
|
command = subCommand if not subCommand == '::gooey/default' else ''
|
|
return u' '.join(compact([
|
|
target,
|
|
command,
|
|
*optional_args,
|
|
'--gooey-validate-form',
|
|
'--' if positional_args else '',
|
|
*positional_args]))
|
|
|
|
|
|
def cliCmd(target: str,
|
|
subCommand: str,
|
|
positionals: List[FieldValue],
|
|
optionals: List[FieldValue],
|
|
suppress_gooey_flag=False) -> str:
|
|
positional_args = [arg['cmd'] for arg in positionals]
|
|
optional_args = [arg['cmd'] for arg in optionals]
|
|
command = subCommand if not subCommand == '::gooey/default' else ''
|
|
ignore_flag = '' if suppress_gooey_flag else '--ignore-gooey'
|
|
return u' '.join(compact([
|
|
target,
|
|
command,
|
|
*optional_args,
|
|
ignore_flag,
|
|
'--' if positional_args else '',
|
|
*positional_args]))
|
|
|
|
|
|
def cmdOrPlaceholderOrNone(field: FieldValue) -> Optional[str]:
|
|
# Argparse has a fail-fast-and-exit behavior for any missing
|
|
# values. This poses a problem for dynamic validation, as we
|
|
# want to collect _all_ errors to be more useful to the user.
|
|
# As such, if there is no value currently available, we pass
|
|
# through a stock placeholder values which allows GooeyParser
|
|
# to handle it being missing without Argparse exploding due to
|
|
# it actually being missing.
|
|
if field['clitype'] == 'positional':
|
|
return field['cmd'] or VALUE_PLACEHOLDER
|
|
elif field['clitype'] != 'positional' and field['meta']['required']:
|
|
# same rationale applies here. We supply the argument
|
|
# along with a fixed placeholder (when relevant i.e. `store`
|
|
# actions)
|
|
return field['cmd'] or formatArgument(field['meta'], VALUE_PLACEHOLDER)
|
|
else:
|
|
# Optional values are, well, optional. So, like usual, we send
|
|
# them if present or drop them if not.
|
|
return field['cmd']
|
|
|
|
|
|
def buildCliString(target, subCommand, positional, optional, suppress_gooey_flag=False):
|
|
positionals = deepcopy(positional)
|
|
if positionals:
|
|
positionals.insert(0, "--")
|
|
|
|
arguments = ' '.join(compact(chain(optional, positionals)))
|
|
|
|
if subCommand != '::gooey/default':
|
|
arguments = u'{} {}'.format(subCommand, arguments)
|
|
|
|
ignore_flag = '' if suppress_gooey_flag else '--ignore-gooey'
|
|
return u'{} {} {}'.format(target, ignore_flag, arguments)
|