This commit is contained in:
Qiaoqiao Zhang 2020-11-13 11:17:06 +08:00 коммит произвёл GitHub
Родитель 56c7edeaf6
Коммит a45f711ca2
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
24 изменённых файлов: 244 добавлений и 40 удалений

Просмотреть файл

@ -13,7 +13,7 @@ debug-output-folder: $(az-output-folder)/_az_debug
use-extension:
"@autorest/python": "5.4.0"
"@autorest/clicommon": "0.5.6"
"@autorest/clicommon": "0.5.7"
#"@autorest/python": "latest"
require:

Просмотреть файл

@ -432,3 +432,21 @@ cli:
```
In this way. we can use `--param-name value1 value2 value3` instead of `--param-name key1=value1 key2=value2 key3=value3` to input the argument.
Here if the positionalOrder hasn't been set then we will use default order. and please specify key1, key2, key3 in python underscore case.
## How to set an action argument as aws shorthand syntax
Shorthand syntax argument use space ' ' to split between objects in an array and comma ',' to split between properties
In code generation. we allow user to add configuration to declare the argument is positional like below
``` yaml
cli:
cli-directive:
- where:
group: GroupName
op: OperationName
param: paramName
set:
shorthandSyntax: true
```
In this way. we can use `--param-name key1=value1,key2=value2 key1=valuea,key2=valueb` instead of `--param-name key1=value1 key2=value2 key1=valuea key2=valueb` to suggest that we want to input
two items (value1, value2) and (valuea, valueb).

Просмотреть файл

@ -184,6 +184,7 @@ export interface CodeModelAz {
MethodParameter_DefaultConfigKey: string | undefined;
MethodParameter_Mode: string;
MethodParameter_IsPositional: boolean;
MethodParameter_IsShorthandSyntax: boolean;
MethodParameter_PositionalKeys: string[];
Parameter_Type(Parameter): string;
Schema_Type(Schema): string;
@ -207,6 +208,7 @@ export interface CodeModelAz {
Parameter_DefaultValue(Parameter): any | undefined;
Parameter_DefaultConfigKey(Parameter): string | undefined;
Parameter_IsPositional(Parameter): boolean;
Parameter_IsShorthandSyntax(Parameter): boolean;
Schema_Description(Schema): string;
Schema_FlattenedFrom(Schema): Schema;
Schema_IsPositional(Schema): boolean;

Просмотреть файл

@ -1252,6 +1252,10 @@ export class CodeModelCliImpl implements CodeModelAz {
return this.Parameter_IsPositional(this.MethodParameter);
}
public get MethodParameter_IsShorthandSyntax(): boolean {
return this.Parameter_IsShorthandSyntax(this.MethodParameter);
}
private isComplexSchema(type: string): boolean {
if (type == SchemaType.Array || type == SchemaType.Object || type == SchemaType.Dictionary || type == SchemaType.Any ||
this.MethodParameter.language['cli'].json == true)
@ -1279,6 +1283,10 @@ export class CodeModelCliImpl implements CodeModelAz {
return param['flattened'] ? true : false;
}
public Parameter_IsShorthandSyntax(param: Parameter = this.MethodParameter): boolean {
return param.language['cli']?.['shorthandSyntax'] ? true: false;
}
public Parameter_IsCliFlattened(param: Parameter = this.MethodParameter): boolean {
if (param?.language?.['cli']?.['cli-flattened'] && !param.language['cli']['cli-m4-flattened']) {
if (param['nameBaseParam']?.language?.['cli']?.['cli-m4-flattened']) {

Просмотреть файл

@ -36,6 +36,8 @@ export function GenerateAzureCliActions(model: CodeModelAz): string[] {
}
if (model.MethodParameter_IsPositional) {
outputCode = outputCode.concat(GetPositionalAction(model, subActionName, model.MethodParameter));
} else if(model.MethodParameter_IsShorthandSyntax) {
outputCode = outputCode.concat(GetShorthandSyntaxAction(model, subActionName, model.MethodParameter));
} else {
outputCode = outputCode.concat(GetAction(model, subActionName, model.MethodParameter, keyToMatch, valueToMatch));
}
@ -52,10 +54,11 @@ export function GenerateAzureCliActions(model: CodeModelAz): string[] {
}
if (model.MethodParameter_IsPositional) {
outputCode = outputCode.concat(GetPositionalAction(model, actionName, model.MethodParameter));
} else if(model.MethodParameter_IsShorthandSyntax) {
outputCode = outputCode.concat(GetShorthandSyntaxAction(model, actionName, model.MethodParameter));
} else {
outputCode = outputCode.concat(GetAction(model, actionName, model.MethodParameter))
}
}
} while (model.SelectNextMethodParameter());
}
@ -212,6 +215,104 @@ function GetPositionalAction(model: CodeModelAz, actionName: string, param: Para
}
function GetShorthandSyntaxAction(model: CodeModelAz, actionName: string, param: Parameter, keyToMatch: string = null, valueToMatch: string = null) {
let output: string[] = [];
allActions.set(actionName, true);
output.push("");
output.push("");
let baseAction = "Action";
let paramType = param?.schema?.type;
if (paramType == SchemaType.Array) baseAction = "_Append" + baseAction;
output.push("class " + actionName + "(argparse." + baseAction + "):");
output.push(" def __call__(self, parser, namespace, values, option_string=None):");
output.push(" action = self.get_action(values, option_string)");
if (paramType == SchemaType.Array) {
output.push(" super(" + actionName + ", self).__call__(parser, namespace, action, option_string)");
} else {
output.push(" namespace." + model.Parameter_MapsTo(param) + " = action");
}
output.push("");
output.push(" def get_action(self, values, option_string): # pylint: disable=no-self-use");
output.push(" ret = []");
output.push(" for item in values:")
output.push(" properties = defaultdict(list)");
output.push(" try:");
output.push(" for (k, v) in (x.split('=', 1) for x in item.split(',')):");
output.push(" properties[k].append(v)");
output.push(" properties = dict(properties)");
output.push(" except ValueError:");
output.push(" raise CLIError('usage error: {} [KEY=VALUE ...]'.format(option_string))");
output.push(" d = {}");
if (model.EnterSubMethodParameters()) {
if (model.SelectFirstMethodParameter(true)) {
do {
if (model.Parameter_DefaultValue(model.SubMethodParameter) !== undefined) {
output.push(" d['" + model.Parameter_NamePython(model.SubMethodParameter) + "'] = " + ToPythonString(model.Parameter_DefaultValue(model.SubMethodParameter), model.Parameter_Type(model.SubMethodParameter)));
}
} while (model.SelectNextMethodParameter(true));
}
model.ExitSubMethodParameters();
}
output.push(" for k in properties:");
output.push(" kl = k.lower()");
output.push(" v = properties[k]");
let foundProperties = false;
let preParamType = paramType;
if (model.EnterSubMethodParameters()) {
if (model.SelectFirstMethodParameter()) {
foundProperties = true;
let ifkv = "if";
do {
if (model.SubMethodParameter['readOnly']) {
continue;
}
if (model.SubMethodParameter['schema']?.type == SchemaType.Constant) {
continue;
}
if (!isNullOrUndefined(keyToMatch) && !isNullOrUndefined(valueToMatch) && model.Parameter_NamePython(model.SubMethodParameter) == keyToMatch) {
continue;
}
output.push(" " + ifkv + " kl == '" + model.Parameter_NameAz(model.SubMethodParameter) + "':");
if (model.MethodParameter_IsArray) {
output.push(" d['" + model.Parameter_NamePython(model.SubMethodParameter) + "'] = v");
}
else {
output.push(" d['" + model.Parameter_NamePython(model.SubMethodParameter) + "'] = v[0]");
}
ifkv = "elif";
} while (model.SelectNextMethodParameter());
}
model.ExitSubMethodParameters();
}
if (!foundProperties && preParamType == SchemaType.Dictionary) {
output.pop();
output.pop();
output.push(" v = properties[k]");
output.push(" d[k] = v[0]");
}
else if (!foundProperties && model.MethodParameter_IsArray) {
output.pop();
output.pop();
output.push(" v = properties[k]");
output.push(" d[k] = v");
}
else if (!isNullOrUndefined(keyToMatch) && !isNullOrUndefined(valueToMatch)) {
output.push(" d['" + keyToMatch + "'] = '" + valueToMatch + "'");
}
output.push(" ret.append(d)");
if (model.MethodParameter_Type == SchemaType.Array) {
output.push(" return ret");
} else {
output.push(" return ret[0]");
}
return output;
}
function generateConstructObject(model: CodeModelAz, indent: string, pythonClassName: string, keyToMatch: string, valueToMatch: string, needReturn: boolean, keys: string[]) {
let output: string[] = [];
output.push(indent + (needReturn? "return ": "") + pythonClassName + "(");

Просмотреть файл

@ -163,10 +163,12 @@ function addParameterHelp(output: string[], model: CodeModelAz, debug: boolean)
baseParam = model.MethodParameter;
continue;
}
if (!model.MethodParameter_IsPositional) {
parameter_output = parameter_output.concat(getKeyValueActionHelp(model, parameterAlias, baseParam, debug));
if (model.MethodParameter_IsPositional) {
parameter_output = parameter_output.concat(getPositionalActionHelp(model, parameterAlias, baseParam, debug));
} else if (model.MethodParameter_IsShorthandSyntax){
parameter_output = parameter_output.concat(getShorthandSyntaxAction(model, parameterAlias, baseParam, debug));
} else {
parameter_output = parameter_output.concat(getPositionalActionHelp(model, parameterAlias, baseParam, debug))
parameter_output = parameter_output.concat(getKeyValueActionHelp(model, parameterAlias, baseParam, debug));
}
}
} while (model.SelectNextMethodParameter());
@ -183,6 +185,65 @@ function addParameterHelp(output: string[], model: CodeModelAz, debug: boolean)
}
function getShorthandSyntaxAction(model: CodeModelAz, parameterAlias: string[], baseParam: Parameter, debug: boolean) {
let parameter_output: string[] = [];
let action_output: string[] = [];
ToMultiLine(` - name: ${parameterAlias.join(' ')}`, action_output, 119, true);
if (debug) {
let shortSummary = '"';
if (model.MethodParameter_Description && model.MethodParameter_Description.trim().length > 0) {
shortSummary += model.MethodParameter_Description.trim().replace(/"/g, '\\\\"');
}
if (!shortSummary.endsWith(".")) {
shortSummary += ".";
}
shortSummary += " Swagger name=" + model.MethodParameter_CliKey + '"';
ToMultiLine(` short-summary: ${shortSummary}`.replace(/\r?\n|\r/g, ''), action_output, 119, true);
} else {
if (model.MethodParameter_Description && model.MethodParameter_Description.trim().length > 0) {
const shortSummary = model.MethodParameter_Description.trim().replace(/"/g, '\\\\"');
ToMultiLine(` short-summary: "${shortSummary}"`.replace(/\r?\n|\r/g, ''), action_output, 119, true);
}
}
let options: Parameter[] = [];
if (!isNullOrUndefined(model.Schema_ActionName(model.MethodParameter.schema))) {
if (baseParam && model.MethodParameter['polyBaseParam'] == baseParam) {
let keyToMatch = baseParam.schema?.['discriminator']?.property?.language['python']?.name;
let valueToMatch = model.MethodParameter.schema?.['discriminatorValue'];
options = GetKeyValueActionOptions(model, null, keyToMatch, valueToMatch);
}
else {
options = GetKeyValueActionOptions(model, null);
}
}
if (options.length > 0) {
action_output.push(` long-summary: |`);
let optionUsage = " " + options.map(p => `${model.Parameter_NameAz(p)}=XX`).join(",");
if (model.MethodParameter_Type == SchemaType.Array) {
ToMultiLine(" Usage: " + parameterAlias[0] + optionUsage.repeat(2), action_output, 119, true);
} else {
ToMultiLine(" Usage: " + parameterAlias[0] + optionUsage, action_output, 119, true);
}
action_output.push("");
for (let p of options) {
let pDesc = model.Parameter_Description(p);
if (!pDesc || pDesc.trim().length <= 0) continue;
let line = ` ${model.Parameter_NameAz(p)}: `;
if (p.required) line += "Required. ";
line += model.Parameter_Description(p).trim().replace(/\r?\n|\r/g, '');
ToMultiLine(line, action_output, 119, true);
}
if (model.Schema_Type(model.MethodParameter.schema) == SchemaType.Array) {
action_output.push("");
ToMultiLine(` Multiple actions can be specified by using more than one ${parameterAlias[0]} argument.`, action_output, 119, true);
}
parameter_output = parameter_output.concat(action_output);
}
return parameter_output;
}
function getPositionalActionHelp(model: CodeModelAz, parameterAlias: string[], baseParam: Parameter, debug: boolean) {
let parameter_output: string[] = [];
let action_output: string[] = [];

Просмотреть файл

@ -77,6 +77,10 @@ cli:
max-api: '2020-05-01'
min-api: '2019-05-01'
resource-type: DATA_NETWORK
- where:
param: subnets
set:
shorthandSyntax: true
#cli-flatten-directive:
# - where:
# type: ResourceProviderOperation

Просмотреть файл

@ -179,7 +179,7 @@ helps['managed-network mn group create'] = """
- name: --subnets
short-summary: "The collection of subnets covered by the Managed Network"
long-summary: |
Usage: --subnets id=XX
Usage: --subnets id=XX id=XX
id: Resource Id
@ -217,7 +217,7 @@ helps['managed-network mn group update'] = """
- name: --subnets
short-summary: "The collection of subnets covered by the Managed Network"
long-summary: |
Usage: --subnets id=XX
Usage: --subnets id=XX id=XX
id: Resource Id

Просмотреть файл

@ -64,20 +64,23 @@ class AddSubnets(argparse._AppendAction):
super(AddSubnets, self).__call__(parser, namespace, action, option_string)
def get_action(self, values, option_string): # pylint: disable=no-self-use
try:
ret = []
for item in values:
properties = defaultdict(list)
for (k, v) in (x.split('=', 1) for x in values):
properties[k].append(v)
properties = dict(properties)
except ValueError:
raise CLIError('usage error: {} [KEY=VALUE ...]'.format(option_string))
d = {}
for k in properties:
kl = k.lower()
v = properties[k]
if kl == 'id':
d['id'] = v[0]
return d
try:
for (k, v) in (x.split('=', 1) for x in item.split(',')):
properties[k].append(v)
properties = dict(properties)
except ValueError:
raise CLIError('usage error: {} [KEY=VALUE ...]'.format(option_string))
d = {}
for k in properties:
kl = k.lower()
v = properties[k]
if kl == 'id':
d['id'] = v[0]
ret.append(d)
return ret
class AddHub(argparse.Action):

Просмотреть файл

@ -1060,8 +1060,8 @@ helps['synapse workspace-managed-identity-sql-control-setting create'] = """
examples:
- name: Create or update managed identity sql control settings
text: |-
az synapse workspace-managed-identity-sql-control-setting create --resource-group "resourceGroup1" \
--workspace-name "workspace1"
az synapse workspace-managed-identity-sql-control-setting create --grant-sql-control-to-managed-identity\
-desired-state "Enabled" --resource-group "resourceGroup1" --workspace-name "workspace1"
"""
helps['synapse workspace-managed-identity-sql-control-setting update'] = """

Просмотреть файл

@ -1961,8 +1961,8 @@ az synapse workspace-managed-identity-sql-control-setting show --resource-group
##### <a name="ExamplesWorkspaceManagedIdentitySqlControlSettingsCreateOrUpdate#Create">Example</a>
```
az synapse workspace-managed-identity-sql-control-setting create --resource-group "resourceGroup1" --workspace-name \
"workspace1"
az synapse workspace-managed-identity-sql-control-setting create --grant-sql-control-to-managed-identity-desired-state \
"Enabled" --resource-group "resourceGroup1" --workspace-name "workspace1"
```
##### <a name="ParametersWorkspaceManagedIdentitySqlControlSettingsCreateOrUpdate#Create">Parameters</a>
|Option|Type|Description|Path (SDK)|Swagger name|

Просмотреть файл

@ -1441,6 +1441,7 @@ def step_workspace_managed_identity(test, rg_5, rg, rg_2, rg_3, rg_4, rg_6, rg_7
if checks is None:
checks = []
test.cmd('az synapse workspace-managed-identity-sql-control-setting create '
'--grant-sql-control-to-managed-identity-desired-state "Enabled" '
'--resource-group "{rg_2}" '
'--workspace-name "{myWorkspace2}"',
checks=checks)

Просмотреть файл

@ -412,7 +412,8 @@ az synapse workspace-aad-admin delete --resource-group "resourceGroup1" --worksp
#### synapse workspace-managed-identity-sql-control-setting ####
##### Create #####
```
az synapse workspace-managed-identity-sql-control-setting create --resource-group "resourceGroup1" \
az synapse workspace-managed-identity-sql-control-setting create \
--grant-sql-control-to-managed-identity-desired-state "Enabled" --resource-group "resourceGroup1" \
--workspace-name "workspace1"
```
##### Show #####

Просмотреть файл

@ -1060,8 +1060,8 @@ helps['synapse workspace-managed-identity-sql-control-setting create'] = """
examples:
- name: Create or update managed identity sql control settings
text: |-
az synapse workspace-managed-identity-sql-control-setting create --resource-group "resourceGroup1" \
--workspace-name "workspace1"
az synapse workspace-managed-identity-sql-control-setting create --grant-sql-control-to-managed-identity\
-desired-state "Enabled" --resource-group "resourceGroup1" --workspace-name "workspace1"
"""
helps['synapse workspace-managed-identity-sql-control-setting update'] = """

Просмотреть файл

@ -1441,6 +1441,7 @@ def step_workspace_managed_identity(test, rg_5, rg, rg_2, rg_3, rg_4, rg_6, rg_7
if checks is None:
checks = []
test.cmd('az synapse workspace-managed-identity-sql-control-setting create '
'--grant-sql-control-to-managed-identity-desired-state "Enabled" '
'--resource-group "{rg_2}" '
'--workspace-name "{myWorkspace2}"',
checks=checks)

Просмотреть файл

@ -1961,8 +1961,8 @@ az synapse workspace-managed-identity-sql-control-setting show --resource-group
##### <a name="ExamplesWorkspaceManagedIdentitySqlControlSettingsCreateOrUpdate#Create">Example</a>
```
az synapse workspace-managed-identity-sql-control-setting create --resource-group "resourceGroup1" --workspace-name \
"workspace1"
az synapse workspace-managed-identity-sql-control-setting create --grant-sql-control-to-managed-identity-desired-state \
"Enabled" --resource-group "resourceGroup1" --workspace-name "workspace1"
```
##### <a name="ParametersWorkspaceManagedIdentitySqlControlSettingsCreateOrUpdate#Create">Parameters</a>
|Option|Type|Description|Path (SDK)|Swagger name|

Просмотреть файл

@ -412,7 +412,8 @@ az synapse workspace-aad-admin delete --resource-group "resourceGroup1" --worksp
#### synapse workspace-managed-identity-sql-control-setting ####
##### Create #####
```
az synapse workspace-managed-identity-sql-control-setting create --resource-group "resourceGroup1" \
az synapse workspace-managed-identity-sql-control-setting create \
--grant-sql-control-to-managed-identity-desired-state "Enabled" --resource-group "resourceGroup1" \
--workspace-name "workspace1"
```
##### Show #####

Просмотреть файл

@ -1060,8 +1060,8 @@ helps['synapse workspace-managed-identity-sql-control-setting create'] = """
examples:
- name: Create or update managed identity sql control settings
text: |-
az synapse workspace-managed-identity-sql-control-setting create --resource-group "resourceGroup1" \
--workspace-name "workspace1"
az synapse workspace-managed-identity-sql-control-setting create --grant-sql-control-to-managed-identity\
-desired-state "Enabled" --resource-group "resourceGroup1" --workspace-name "workspace1"
"""
helps['synapse workspace-managed-identity-sql-control-setting update'] = """

Просмотреть файл

@ -1441,6 +1441,7 @@ def step_workspace_managed_identity(test, rg_5, rg, rg_2, rg_3, rg_4, rg_6, rg_7
if checks is None:
checks = []
test.cmd('az synapse workspace-managed-identity-sql-control-setting create '
'--grant-sql-control-to-managed-identity-desired-state "Enabled" '
'--resource-group "{rg_2}" '
'--workspace-name "{myWorkspace2}"',
checks=checks)

Просмотреть файл

@ -1961,8 +1961,8 @@ az synapse workspace-managed-identity-sql-control-setting show --resource-group
##### <a name="ExamplesWorkspaceManagedIdentitySqlControlSettingsCreateOrUpdate#Create">Example</a>
```
az synapse workspace-managed-identity-sql-control-setting create --resource-group "resourceGroup1" --workspace-name \
"workspace1"
az synapse workspace-managed-identity-sql-control-setting create --grant-sql-control-to-managed-identity-desired-state \
"Enabled" --resource-group "resourceGroup1" --workspace-name "workspace1"
```
##### <a name="ParametersWorkspaceManagedIdentitySqlControlSettingsCreateOrUpdate#Create">Parameters</a>
|Option|Type|Description|Path (SDK)|Swagger name|

Просмотреть файл

@ -412,7 +412,8 @@ az synapse workspace-aad-admin delete --resource-group "resourceGroup1" --worksp
#### synapse workspace-managed-identity-sql-control-setting ####
##### Create #####
```
az synapse workspace-managed-identity-sql-control-setting create --resource-group "resourceGroup1" \
az synapse workspace-managed-identity-sql-control-setting create \
--grant-sql-control-to-managed-identity-desired-state "Enabled" --resource-group "resourceGroup1" \
--workspace-name "workspace1"
```
##### Show #####

Просмотреть файл

@ -1060,8 +1060,8 @@ helps['synapse workspace-managed-identity-sql-control-setting create'] = """
examples:
- name: Create or update managed identity sql control settings
text: |-
az synapse workspace-managed-identity-sql-control-setting create --resource-group "resourceGroup1" \
--workspace-name "workspace1"
az synapse workspace-managed-identity-sql-control-setting create --grant-sql-control-to-managed-identity\
-desired-state "Enabled" --resource-group "resourceGroup1" --workspace-name "workspace1"
"""
helps['synapse workspace-managed-identity-sql-control-setting update'] = """

Просмотреть файл

@ -1441,6 +1441,7 @@ def step_workspace_managed_identity(test, rg_5, rg, rg_2, rg_3, rg_4, rg_6, rg_7
if checks is None:
checks = []
test.cmd('az synapse workspace-managed-identity-sql-control-setting create '
'--grant-sql-control-to-managed-identity-desired-state "Enabled" '
'--resource-group "{rg_2}" '
'--workspace-name "{myWorkspace2}"',
checks=checks)

Просмотреть файл

@ -1961,8 +1961,8 @@ az synapse workspace-managed-identity-sql-control-setting show --resource-group
##### <a name="ExamplesWorkspaceManagedIdentitySqlControlSettingsCreateOrUpdate#Create">Example</a>
```
az synapse workspace-managed-identity-sql-control-setting create --resource-group "resourceGroup1" --workspace-name \
"workspace1"
az synapse workspace-managed-identity-sql-control-setting create --grant-sql-control-to-managed-identity-desired-state \
"Enabled" --resource-group "resourceGroup1" --workspace-name "workspace1"
```
##### <a name="ParametersWorkspaceManagedIdentitySqlControlSettingsCreateOrUpdate#Create">Parameters</a>
|Option|Type|Description|Path (SDK)|Swagger name|