diff --git a/powershell/autorest-configuration.md b/powershell/autorest-configuration.md index 048f6282ca0..2c9dd6aacab 100644 --- a/powershell/autorest-configuration.md +++ b/powershell/autorest-configuration.md @@ -63,6 +63,7 @@ module-folder: $(current-folder)/generated cmdlet-folder: $(module-folder)/cmdlets model-cmdlet-folder: $(module-folder)/model-cmdlets custom-cmdlet-folder: $(current-folder)/custom +utils-cmdlet-folder: $(current-folder)/utils internal-cmdlet-folder: $(current-folder)/internal test-folder: $(current-folder)/test runtime-folder: $(module-folder)/runtime diff --git a/powershell/generators/nuspec.ts b/powershell/generators/nuspec.ts index fb44a1df572..598b8250418 100644 --- a/powershell/generators/nuspec.ts +++ b/powershell/generators/nuspec.ts @@ -41,6 +41,7 @@ export async function generateNuspec(project: Project | NewProject) { + `, undefined, 'source-file-other'); } diff --git a/powershell/internal/project.ts b/powershell/internal/project.ts index 1d0feb10bb0..9afaf33d7e8 100644 --- a/powershell/internal/project.ts +++ b/powershell/internal/project.ts @@ -92,6 +92,7 @@ export class Project extends codeDomProject { public cmdletFolder!: string; public customFolder!: string; + public utilsFolder!: string; public internalFolder!: string; public testFolder!: string; public runtimeFolder!: string; @@ -193,6 +194,7 @@ export class Project extends codeDomProject { this.cmdletFolder = await this.state.getValue('cmdlet-folder'); this.customFolder = await this.state.getValue('custom-cmdlet-folder'); + this.utilsFolder = await this.state.getValue('utils-cmdlet-folder'); this.internalFolder = await this.state.getValue('internal-cmdlet-folder'); this.testFolder = await this.state.getValue('test-folder'); this.runtimeFolder = await this.state.getValue('runtime-folder'); @@ -250,6 +252,7 @@ export class NewProject extends codeDomProject { public cmdletFolder!: string; public customFolder!: string; + public utilsFolder!: string; public internalFolder!: string; public testFolder!: string; public runtimeFolder!: string; @@ -353,6 +356,7 @@ export class NewProject extends codeDomProject { this.cmdletFolder = await this.state.getValue('cmdlet-folder'); this.customFolder = await this.state.getValue('custom-cmdlet-folder'); + this.utilsFolder = await this.state.getValue('utils-cmdlet-folder'); this.internalFolder = await this.state.getValue('internal-cmdlet-folder'); this.testFolder = await this.state.getValue('test-folder'); this.runtimeFolder = await this.state.getValue('runtime-folder'); diff --git a/powershell/llcsharp/model/namespace.ts b/powershell/llcsharp/model/namespace.ts index 57680266b50..58d0d0d64ac 100644 --- a/powershell/llcsharp/model/namespace.ts +++ b/powershell/llcsharp/model/namespace.ts @@ -179,6 +179,11 @@ export class NewModelsNamespace extends Namespace { this.NewResolveTypeDeclaration(schema, true, state); } } + if (schemas.dictionaries) { + for (const schema of schemas.dictionaries) { + this.NewResolveTypeDeclaration(schema, true, state); + } + } if (schemas.any) { for (const schema of schemas.any) { diff --git a/powershell/llcsharp/schema/schema-resolver.ts b/powershell/llcsharp/schema/schema-resolver.ts index fe51afa73ef..bd1eab1c708 100644 --- a/powershell/llcsharp/schema/schema-resolver.ts +++ b/powershell/llcsharp/schema/schema-resolver.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { codeModelSchema, ArraySchema, CodeModel, Schema as NewSchema, StringSchema, BooleanSchema, NumberSchema, ByteArraySchema, DateTimeSchema, ObjectSchema, GroupSchema, isObjectSchema, SchemaType, GroupProperty, ParameterLocation, Operation, Parameter, VirtualParameter, getAllProperties, ImplementationLocation, OperationGroup, Request, SchemaContext, ConstantSchema, ChoiceSchema, DurationSchema, BinarySchema, DateSchema } from '@azure-tools/codemodel'; +import { codeModelSchema, ArraySchema, UnixTimeSchema, CodeModel, Schema as NewSchema, StringSchema, BooleanSchema, NumberSchema, ByteArraySchema, DateTimeSchema, ObjectSchema, GroupSchema, isObjectSchema, SchemaType, GroupProperty, ParameterLocation, Operation, Parameter, VirtualParameter, getAllProperties, ImplementationLocation, OperationGroup, Request, SchemaContext, ConstantSchema, ChoiceSchema, DurationSchema, BinarySchema, DateSchema } from '@azure-tools/codemodel'; import { ModelState, codemodel, IntegerFormat, NumberFormat, StringFormat, JsonType } from '@azure-tools/codemodel-v3'; import { Schema } from '../code-model'; @@ -222,6 +222,9 @@ export class NewSchemaDefinitionResolver { // fallback to int if the format isn't recognized return new NewNumeric(schema, required, required ? 'int' : 'int?'); + case SchemaType.UnixTime: + return new NewUnixTime(schema, required); + case SchemaType.Number: switch ((schema).precision) { case 64: diff --git a/powershell/plugins/powershell-v2.ts b/powershell/plugins/powershell-v2.ts index 12d8802b7b1..b92c5643a41 100644 --- a/powershell/plugins/powershell-v2.ts +++ b/powershell/plugins/powershell-v2.ts @@ -32,6 +32,9 @@ async function copyRequiredFiles(project: NewProject) { // Runtime files await copyResources(join(resources, 'psruntime'), async (fname, content) => project.state.writeFile(join(project.runtimeFolder, fname), content, undefined, sourceFileCSharp), project.overrides, transformOutput); + // utils cmdlets + await copyResources(join(resources, 'utils'), async (fname, content) => project.state.writeFile(join(project.utilsFolder, fname), content, undefined, sourceFileCSharp), project.overrides, transformOutput); + // Modules files await copyBinaryResources(join(resources, 'modules'), async (fname, content) => project.state.writeFile(join(project.dependencyModuleFolder, fname), content, undefined, 'binary-file')); diff --git a/powershell/resources/utils/Unprotect-SecureString.ps1 b/powershell/resources/utils/Unprotect-SecureString.ps1 new file mode 100644 index 00000000000..cb05b51a622 --- /dev/null +++ b/powershell/resources/utils/Unprotect-SecureString.ps1 @@ -0,0 +1,16 @@ +#This script converts securestring to plaintext + +param( + [Parameter(Mandatory, ValueFromPipeline)] + [System.Security.SecureString] + ${SecureString} +) + +$ssPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString) +try { + $plaintext = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ssPtr) +} finally { + [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ssPtr) +} + +return $plaintext \ No newline at end of file diff --git a/tests-upgrade/AutoRestUpgradeTest.ps1 b/tests-upgrade/AutoRestUpgradeTest.ps1 index 938758f39bf..66c2e796052 100644 --- a/tests-upgrade/AutoRestUpgradeTest.ps1 +++ b/tests-upgrade/AutoRestUpgradeTest.ps1 @@ -66,6 +66,9 @@ function IsNeedIgnore([string]$inputFileName , [Array]$ignoreArray) { $Ignore =$True break + } elseif ($ignoreDetail.Contains("*.") -and $inputFileName.EndsWith($ignoreDetail.Split(".")[-1])) { + $Ignore =$True + break } } return $Ignore @@ -117,8 +120,8 @@ function CompareGeneratedCode([string]$inputSourcePath,[string]$inputTargetPath, #in m3Path cd $inputSourcePath $initFileList = Get-ChildItem -Recurse -force - $initIgnoreFileList = (($inputSourcePath+'\generated\modules'), ($inputSourcePath+'\.gitignore'),($inputSourcePath+'\tools\Resources\.gitignore')) - $targetIgnoreFileList = (($inputTargetPath+'\generated\modules'), ($inputTargetPath+'\.gitignore'),($inputTargetPath+'\tools\Resources\.gitignore')) + $initIgnoreFileList = (($inputSourcePath+'\generated\modules'), ($inputSourcePath+'\utils'), ($inputSourcePath+'\*.nuspec'), ($inputSourcePath+'\.gitignore'),($inputSourcePath+'\tools\Resources\.gitignore')) + $targetIgnoreFileList = (($inputTargetPath+'\generated\modules'), ($inputTargetPath+'\utils'),($inputTargetPath+'\*.nuspec'),($inputTargetPath+'\.gitignore'),($inputTargetPath+'\tools\Resources\.gitignore')) #foreach initFileList and get the hashcode of them foreach( $initFile in $initFileList) { diff --git a/tests-upgrade/Configuration.json b/tests-upgrade/Configuration.json index 9d25b6c293d..045f89ef52b 100644 --- a/tests-upgrade/Configuration.json +++ b/tests-upgrade/Configuration.json @@ -24,6 +24,7 @@ "datamodels-datatypes-integer", "datamodels-datatypes-string", "datamodels-datatypes-object", + "datamodels-datatypes-unixtime", "datamodels-combineschema", "directive-model", "directive-tableformat", diff --git a/tests-upgrade/datamodels-datatypes-unixtime/readme.md b/tests-upgrade/datamodels-datatypes-unixtime/readme.md new file mode 100644 index 00000000000..cd6b9c0ac24 --- /dev/null +++ b/tests-upgrade/datamodels-datatypes-unixtime/readme.md @@ -0,0 +1,10 @@ +### AutoRest Configuration +> see https://aka.ms/autorest + +``` yaml +require: + - $(this-folder)/../readme.azure.noprofile.md +input-file: + - $(this-folder)/swagger.json + +``` diff --git a/tests-upgrade/datamodels-datatypes-unixtime/swagger.json b/tests-upgrade/datamodels-datatypes-unixtime/swagger.json new file mode 100644 index 00000000000..27427d16396 --- /dev/null +++ b/tests-upgrade/datamodels-datatypes-unixtime/swagger.json @@ -0,0 +1,76 @@ +{ + "swagger": "2.0", + "info": { + "title": "DatabricksClient", + "version": "2018-04-01", + "description": "ARM Databricks" + }, + "host": "management.azure.com", + "schemes": [ + "https" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "security": [ + { + "azure_auth": [ + "user_impersonation" + ] + } + ], + "securityDefinitions": { + "azure_auth": { + "type": "oauth2", + "authorizationUrl": "https://login.microsoftonline.com/common/oauth2/authorize", + "flow": "implicit", + "description": "Azure Active Directory OAuth2 Flow", + "scopes": { + "user_impersonation": "impersonate your user account" + } + } + }, + "paths": { + "/subscriptions/resourceGroup": { + "get": { + "tags": [ + "Workspaces" + ], + "operationId": "Workspaces_Get", + "description": "Gets the workspace.", + "responses": { + "200": { + "description": "OK-Return workspace." + }, + "default": { + "description": "Error response describing why the operation failed.", + "schema": { + "$ref": "#/definitions/BasicErrorModel" + } + } + } + } + } + }, + "definitions": { + "BasicErrorModel": { + "type": "object", + "required": [ + "message", + "code" + ], + "properties": { + "message": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "unixtime" + } + } + } + } +} \ No newline at end of file