Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add enum extension #366

Merged
merged 14 commits into from
Jun 6, 2024
Merged
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions docs/pages/usage/workspace_editor.md
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,12 @@ While editing the arguments, you can hide it. The code of hidden arguments will

![hidden_arguments](../../assets/recordings/workspace_editor/hidden_arguments.gif)

### Support Entensible Enumeration Arguments

Users can set enum arguments extensible for accepting other values in the future, as denoted by [x-ms-enum](https://github.com/Azure/autorest/tree/main/docs/extensions#x-ms-enum) in swagger. If `supportExtension` is set, then argument validation will be skipped when executing cmds using azure cli.

![support_enum_extension_arguments](../../assets/recordings/workspace_editor/support_enum_arguments.gif)

### Default value for Arguments

You can set `Default` value for an argument, the `Default` value will be used when users not declare this argument in the command.
Expand Down
25 changes: 15 additions & 10 deletions src/aaz_dev/cli/controller/az_arg_group_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,12 @@ def parse_arg_enum(enum):
if item.hide:
continue
e[item.name] = item.value
return e
kwargs = {
"enum": e
}
if enum.support_extension:
kwargs['enum_support_extension'] = True
return kwargs


def parse_arg_name(arg):
Expand Down Expand Up @@ -288,9 +293,9 @@ def render_arg_base(arg, cmd_ctx, arg_kwargs=None):

if isinstance(arg, CMDStringArgBase):
arg_type = "AAZStrArg"
enum = parse_arg_enum(arg.enum)
if enum:
arg_kwargs['enum'] = enum
enum_kwargs = parse_arg_enum(arg.enum)
if enum_kwargs:
arg_kwargs.update(enum_kwargs)

if arg.fmt and isinstance(arg.fmt, CMDStringFormat):
arg_kwargs['fmt'] = fmt = {
Expand Down Expand Up @@ -358,9 +363,9 @@ def render_arg_base(arg, cmd_ctx, arg_kwargs=None):

elif isinstance(arg, CMDIntegerArgBase):
arg_type = "AAZIntArg"
enum = parse_arg_enum(arg.enum)
if enum:
arg_kwargs['enum'] = enum
enum_kwargs = parse_arg_enum(arg.enum)
if enum_kwargs:
arg_kwargs.update(enum_kwargs)

if arg.fmt and isinstance(arg.fmt, CMDIntegerFormat):
arg_kwargs['fmt'] = fmt = {
Expand Down Expand Up @@ -392,9 +397,9 @@ def render_arg_base(arg, cmd_ctx, arg_kwargs=None):

elif isinstance(arg, CMDFloatArgBase):
arg_type = "AAZFloatArg"
enum = parse_arg_enum(arg.enum)
if enum:
arg_kwargs['enum'] = enum
enum_kwargs = parse_arg_enum(arg.enum)
if enum_kwargs:
arg_kwargs.update(enum_kwargs)

if arg.fmt and isinstance(arg.fmt, CMDFloatFormat):
arg_kwargs['fmt'] = fmt = {
Expand Down
11 changes: 10 additions & 1 deletion src/aaz_dev/command/controller/workspace_helper.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from utils import exceptions

from ..model.configuration import (CMDArg, CMDBooleanArg, CMDClsArg, CMDArrayArg, CMDArgumentHelp, CMDArgDefault,
CMDPasswordArgPromptInput, CMDArgPromptInput)
CMDPasswordArgPromptInput, CMDArgPromptInput, CMDFloatArgBase, CMDIntegerArgBase,
CMDStringArgBase)


class ArgumentUpdateMixin:
Expand All @@ -10,12 +11,14 @@ class ArgumentUpdateMixin:
def _update_arg(cls, arg, **kwargs):
if isinstance(arg, CMDArg):
cls._update_cmd_arg(arg, **kwargs)
cls._update_arg_enum(arg, **kwargs)
if isinstance(arg, CMDBooleanArg):
cls._update_boolean_arg(arg, **kwargs)
if isinstance(arg, CMDClsArg):
cls._update_cls_arg(arg, **kwargs)
if isinstance(arg, CMDArrayArg):
cls._update_array_arg(arg, **kwargs)
cls._update_arg_enum(arg.item, **kwargs)
return arg

@staticmethod
Expand Down Expand Up @@ -63,3 +66,9 @@ def _update_cls_arg(arg, **kwargs):
def _update_array_arg(arg, **kwargs):
if 'singularOptions' in kwargs:
arg.singular_options = kwargs['singularOptions'] or None

@staticmethod
def _update_arg_enum(arg, **kwargs):
if 'supportEnumExtension' in kwargs and isinstance(arg, (CMDFloatArgBase, CMDIntegerArgBase, CMDStringArgBase)):
if arg.enum:
arg.enum.support_extension = kwargs['supportEnumExtension']
6 changes: 6 additions & 0 deletions src/aaz_dev/command/model/configuration/_arg.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ class CMDArgEnum(Model):

# properties as nodes
items = ListType(ModelType(CMDArgEnumItem), min_size=1)
support_extension = CMDBooleanField(
serialized_name="supportExtension",
deserialize_from="supportExtension",
)

@classmethod
def build_enum(cls, schema_enum, ref_enum):
Expand All @@ -50,6 +54,8 @@ def build_enum(cls, schema_enum, ref_enum):
break
item = CMDArgEnumItem.build_enum_item(schema_item, ref_enum_item)
enum.items.append(item)
if ref_enum:
enum.support_extension = ref_enum.support_extension
return enum

def reformat(self, **kwargs):
Expand Down
17 changes: 17 additions & 0 deletions src/web/src/views/workspace/WSEditorCommandArgumentsContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,7 @@ function ArgumentDialog(props: {
const [singularOptions, setSingularOptions] = useState<string | undefined>(undefined);
const [group, setGroup] = useState<string>("")
const [hide, setHide] = useState<boolean>(false);
const [supportEnumExtension, setSupportEnumExtension] = useState<boolean>(false);
const [shortHelp, setShortHelp] = useState<string>("");
const [longHelp, setLongHelp] = useState<string>("");
const [argSimilarTree, setArgSimilarTree] = useState<ArgSimilarTree | undefined>(undefined);
Expand Down Expand Up @@ -788,6 +789,7 @@ function ArgumentDialog(props: {
default: argDefault,
prompt: argPrompt,
configurationKey: argCfgKey,
supportEnumExtension: supportEnumExtension
}
}

Expand Down Expand Up @@ -924,6 +926,7 @@ function ArgumentDialog(props: {
setStage(props.arg.stage);
setGroup(props.arg.group);
setHide(props.arg.hide);
setSupportEnumExtension(props.arg.supportEnumExtension || false);
setShortHelp(props.arg.help?.short ?? "");
setLongHelp(props.arg.help?.lines?.join("\n") ?? "");
setConfigurationKey(props.arg.configurationKey ?? "");
Expand Down Expand Up @@ -1023,6 +1026,16 @@ function ArgumentDialog(props: {
}}
/>
</>}

{props.arg.hasEnum && <>
<InputLabel shrink sx={{ font: "inherit" }}>Support Enum Extension</InputLabel>
<Switch sx={{ ml: 4 }}
checked={supportEnumExtension}
onChange={(event: any) => {
setSupportEnumExtension(!supportEnumExtension);
}}
/>
</>}
</>}
{hasDefault !== undefined && <>
<InputLabel shrink sx={{ font: "inherit" }}>Default Value</InputLabel>
Expand Down Expand Up @@ -1792,6 +1805,8 @@ interface CMDArg extends CMDArgBase {
idPart?: string
prompt?: CMDArgPromptInput
configurationKey?: string
supportEnumExtension?: boolean
hasEnum?: boolean
}

interface CMDArgBaseT<T> extends CMDArgBase {
Expand Down Expand Up @@ -2175,6 +2190,8 @@ function decodeArg(response: any): { arg: CMDArg, clsDefineMap: ClsArgDefinition
idPart: response.idPart,
prompt: prompt,
configurationKey: response.configurationKey,
supportEnumExtension: response.enum?.supportExtension || response.item?.enum?.supportExtension || false,
hasEnum: response.enum?.items?.length > 0 || response.item?.enum?.items?.length > 0 || false
}

switch (argBase.type) {
Expand Down
Loading