Azure / autorest

OpenAPI (f.k.a Swagger) Specification code generator. Supports C#, PowerShell, Go, Java, Node.js, TypeScript, Python
MIT License
4.54k stars 728 forks source link

Handle or at least be smarter about additionalProperties: true/false #2564

Closed carlosjpedro closed 6 years ago

carlosjpedro commented 6 years ago

When generating a client from the openbanking swagger only the delete account method is generated. https://www.openbanking.org.uk/wpcore/wp-content/uploads/2017/07/account-info-swagger.json

using http://editor.swagger.io the generated client is complete

olydis commented 6 years ago

I cannot reproduce what you see. Which version of AutoRest are you using?

What I do see: the Swagger contains "additionalProperties": false which AutoRest doesn't support currently - but it is the default behavior, so removing those lines from the Swagger makes it work as expected. Then, I get a full client with the following files and what seems to be all operations in the client.

./AccountInformationAPIs.cs
./AccountInformationAPIsExtensions.cs
./IAccountInformationAPIs.cs
./Models/Body.cs
./Models/BodyData.cs
./Models/CreateAccountRequestCreatedResponse.cs
./Models/CreateAccountRequestCreatedResponseData.cs
./Models/CreateAccountRequestHeaders.cs
./Models/DeleteAccountRequestHeaders.cs
./Models/GetAccountBalancesHeaders.cs
./Models/GetAccountBalancesOKResponse.cs
./Models/GetAccountBalancesOKResponseDataItem.cs
./Models/GetAccountBalancesOKResponseDataItemAmount.cs
./Models/GetAccountBalancesOKResponseDataItemCreditLine.cs
./Models/GetAccountBalancesOKResponseDataItemCreditLineAmount.cs
./Models/GetAccountBalancesOKResponseLinks.cs
./Models/GetAccountBalancesOKResponseMeta.cs
./Models/GetAccountBeneficiariesHeaders.cs
./Models/GetAccountBeneficiariesOKResponse.cs
./Models/GetAccountBeneficiariesOKResponseDataItem.cs
./Models/GetAccountBeneficiariesOKResponseDataItemCreditorAccount.cs
./Models/GetAccountBeneficiariesOKResponseDataItemServicer.cs
./Models/GetAccountBeneficiariesOKResponseLinks.cs
./Models/GetAccountBeneficiariesOKResponseMeta.cs
./Models/GetAccountDirectDebitsHeaders.cs
./Models/GetAccountDirectDebitsOKResponse.cs
./Models/GetAccountDirectDebitsOKResponseDataItem.cs
./Models/GetAccountDirectDebitsOKResponseDataItemPreviousPaymentAmount.cs
./Models/GetAccountDirectDebitsOKResponseLinks.cs
./Models/GetAccountDirectDebitsOKResponseMeta.cs
./Models/GetAccountHeaders.cs
./Models/GetAccountOKResponse.cs
./Models/GetAccountOKResponseDataItem.cs
./Models/GetAccountOKResponseDataItemAccount.cs
./Models/GetAccountOKResponseDataItemServicer.cs
./Models/GetAccountOKResponseLinks.cs
./Models/GetAccountOKResponseMeta.cs
./Models/GetAccountProductHeaders.cs
./Models/GetAccountProductOKResponse.cs
./Models/GetAccountProductOKResponseDataItem.cs
./Models/GetAccountProductOKResponseLinks.cs
./Models/GetAccountProductOKResponseMeta.cs
./Models/GetAccountRequestHeaders.cs
./Models/GetAccountRequestOKResponse.cs
./Models/GetAccountRequestOKResponseData.cs
./Models/GetAccountsHeaders.cs
./Models/GetAccountsOKResponse.cs
./Models/GetAccountsOKResponseDataItem.cs
./Models/GetAccountsOKResponseDataItemAccount.cs
./Models/GetAccountsOKResponseDataItemServicer.cs
./Models/GetAccountsOKResponseLinks.cs
./Models/GetAccountsOKResponseMeta.cs
./Models/GetAccountStandingOrdersHeaders.cs
./Models/GetAccountStandingOrdersOKResponse.cs
./Models/GetAccountStandingOrdersOKResponseDataItem.cs
./Models/GetAccountStandingOrdersOKResponseDataItemCreditorAccount.cs
./Models/GetAccountStandingOrdersOKResponseDataItemFinalPaymentAmount.cs
./Models/GetAccountStandingOrdersOKResponseDataItemFirstPaymentAmount.cs
./Models/GetAccountStandingOrdersOKResponseDataItemNextPaymentAmount.cs
./Models/GetAccountStandingOrdersOKResponseDataItemServicer.cs
./Models/GetAccountStandingOrdersOKResponseLinks.cs
./Models/GetAccountStandingOrdersOKResponseMeta.cs
./Models/GetAccountTransactionsHeaders.cs
./Models/GetAccountTransactionsOKResponse.cs
./Models/GetAccountTransactionsOKResponseDataItem.cs
./Models/GetAccountTransactionsOKResponseDataItemAmount.cs
./Models/GetAccountTransactionsOKResponseDataItemBalance.cs
./Models/GetAccountTransactionsOKResponseDataItemBalanceAmount.cs
./Models/GetAccountTransactionsOKResponseDataItemBankTransactionCode.cs
./Models/GetAccountTransactionsOKResponseDataItemMerchantDetails.cs
./Models/GetAccountTransactionsOKResponseDataItemProprietaryBankTransactionCode.cs
./Models/GetAccountTransactionsOKResponseLinks.cs
./Models/GetAccountTransactionsOKResponseMeta.cs
./Models/GetBalancesHeaders.cs
./Models/GetBalancesOKResponse.cs
./Models/GetBalancesOKResponseDataItem.cs
./Models/GetBalancesOKResponseDataItemAmount.cs
./Models/GetBalancesOKResponseDataItemCreditLine.cs
./Models/GetBalancesOKResponseDataItemCreditLineAmount.cs
./Models/GetBalancesOKResponseLinks.cs
./Models/GetBalancesOKResponseMeta.cs
./Models/GetBeneficiariesHeaders.cs
./Models/GetBeneficiariesOKResponse.cs
./Models/GetBeneficiariesOKResponseDataItem.cs
./Models/GetBeneficiariesOKResponseDataItemCreditorAccount.cs
./Models/GetBeneficiariesOKResponseDataItemServicer.cs
./Models/GetBeneficiariesOKResponseLinks.cs
./Models/GetBeneficiariesOKResponseMeta.cs
./Models/GetDirectDebitsHeaders.cs
./Models/GetDirectDebitsOKResponse.cs
./Models/GetDirectDebitsOKResponseDataItem.cs
./Models/GetDirectDebitsOKResponseDataItemPreviousPaymentAmount.cs
./Models/GetDirectDebitsOKResponseLinks.cs
./Models/GetDirectDebitsOKResponseMeta.cs
./Models/GetProductsHeaders.cs
./Models/GetProductsOKResponse.cs
./Models/GetProductsOKResponseDataItem.cs
./Models/GetProductsOKResponseLinks.cs
./Models/GetProductsOKResponseMeta.cs
./Models/GetStandingOrdersHeaders.cs
./Models/GetStandingOrdersOKResponse.cs
./Models/GetStandingOrdersOKResponseDataItem.cs
./Models/GetStandingOrdersOKResponseDataItemCreditorAccount.cs
./Models/GetStandingOrdersOKResponseDataItemFinalPaymentAmount.cs
./Models/GetStandingOrdersOKResponseDataItemFirstPaymentAmount.cs
./Models/GetStandingOrdersOKResponseDataItemNextPaymentAmount.cs
./Models/GetStandingOrdersOKResponseDataItemServicer.cs
./Models/GetStandingOrdersOKResponseLinks.cs
./Models/GetStandingOrdersOKResponseMeta.cs
./Models/GetTransactionsHeaders.cs
./Models/GetTransactionsOKResponse.cs
./Models/GetTransactionsOKResponseDataItem.cs
./Models/GetTransactionsOKResponseDataItemAmount.cs
./Models/GetTransactionsOKResponseDataItemBalance.cs
./Models/GetTransactionsOKResponseDataItemBalanceAmount.cs
./Models/GetTransactionsOKResponseDataItemBankTransactionCode.cs
./Models/GetTransactionsOKResponseDataItemMerchantDetails.cs
./Models/GetTransactionsOKResponseDataItemProprietaryBankTransactionCode.cs
./Models/GetTransactionsOKResponseLinks.cs
./Models/GetTransactionsOKResponseMeta.cs
carlosjpedro commented 6 years ago

I am using version 1.1.2 - I think its the latest version. I am calling autorest with the following parameters: Autorest --input-file="account-info-swagger.json" --output-folder=generated --csharp --namespace=Org.Openbanking --verbose

Listing the generated files I get this: Volume in drive C is WINDOWS Volume Serial Number is 6040-4015

Directory of C:\Code\Open Banking\generated

04/09/2017 10:30

. 04/09/2017 10:30 .. 04/09/2017 10:30 13,614 AccountInformationAPIs.cs 04/09/2017 10:30 3,303 AccountInformationAPIsExtensions.cs 04/09/2017 10:30 2,293 IAccountInformationAPIs.cs 04/09/2017 10:30 Models 3 File(s) 19,210 bytes

Directory of C:\Code\Open Banking\generated\Models

04/09/2017 10:30

. 04/09/2017 10:30 .. 04/09/2017 10:30 1,544 DeleteAccountRequestHeaders.cs 1 File(s) 1,544 bytes

 Total Files Listed:
           4 File(s)         20,754 bytes
           5 Dir(s)  108,564,459,520 bytes free

But you are right, removing "additionalProperties" properties from the swagger results in all the generated code being generated.

olydis commented 6 years ago

Most recent version is 1.2.2, but that small difference should not matter. I'm surprised that it generates anything at all for you if the additionalProperties are present - but glad that removing them makes it work 👍 Note that AutoRest handles additionalProperties as per the spec, which expects a schema instead of a boolean (which is the JSON schema way, but seems to be overridden by the Swagger 2.0 spec). OpenAPI 3.0 explicitly supports both boolean and schema. I'll leave this issue open as a reminder for us, maybe we'll add support for booleans prior to as a preparation for accepting OpenAPI 3.0.