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

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)