I'm unable to run the following:
java -jar ~/Downloads/openapi-generator-cli-4.0.0-20180728.030217-16.jar generate -i https://products.solace.com/download/PUBSUB_SEMPV2_SCHEMA_JSON -g go
go get -v ./...
github.com/SolaceDev/semp-v2-go
# github.com/SolaceDev/semp-v2-go
./api_msg_vpn.go:149:6: CreateMsgVpnAclProfileOpts redeclared in this block
previous declaration at ./api_acl_profile.go:41:6
./api_msg_vpn.go:260:6: CreateMsgVpnAclProfileClientConnectExceptionOpts redeclared in this block
previous declaration at ./api_acl_profile.go:152:6
./api_msg_vpn.go:372:6: CreateMsgVpnAclProfilePublishExceptionOpts redeclared in this block
previous declaration at ./api_acl_profile.go:264:6
./api_msg_vpn.go:484:6: CreateMsgVpnAclProfileSubscribeExceptionOpts redeclared in this block
previous declaration at ./api_acl_profile.go:376:6
./api_msg_vpn.go:595:6: CreateMsgVpnAuthorizationGroupOpts redeclared in this block
previous declaration at ./api_authorization_group.go:41:6
./api_msg_vpn.go:705:6: CreateMsgVpnBridgeOpts redeclared in this block
previous declaration at ./api_bridge.go:41:6
./api_msg_vpn.go:817:6: CreateMsgVpnBridgeRemoteMsgVpnOpts redeclared in this block
previous declaration at ./api_bridge.go:153:6
./api_msg_vpn.go:931:6: CreateMsgVpnBridgeRemoteSubscriptionOpts redeclared in this block
previous declaration at ./api_bridge.go:267:6
./api_msg_vpn.go:1045:6: CreateMsgVpnBridgeTlsTrustedCommonNameOpts redeclared in this block
previous declaration at ./api_bridge.go:381:6
./api_msg_vpn.go:1157:6: CreateMsgVpnClientProfileOpts redeclared in this block
previous declaration at ./api_client_profile.go:41:6
./api_msg_vpn.go:1157:6: too many errors
openapi-generator-cli-4.0.0-20180728.030217-16.jar including earlier release versions (and swagger 2.4.0 as well)
https://products.solace.com/download/PUBSUB_SEMPV2_SCHEMA_JSON
java -jar ~/Downloads/openapi-generator-cli-4.0.0-20180728.030217-16.jar generate -i https://products.solace.com/download/PUBSUB_SEMPV2_SCHEMA_JSON -g go
java -jar ~/Downloads/openapi-generator-cli-4.0.0-20180728.030217-16.jar generate -i https://products.solace.com/download/PUBSUB_SEMPV2_SCHEMA_JSON -g go
go get -v ./...
Might be similar: https://github.com/OpenAPITools/openapi-generator/issues/535
None I can think of at the moment
It's probably problem with tags. Creates the same code for acl_profile and ms_vpn tags.
A lot of the Opts struct are redeclared and it's everywhere, not just in acl_profile and msg_vpn:
$ grep -h "type .* struct" * | grep Opts | sort | uniq -c | clipcopy
2 type CreateMsgVpnAclProfileClientConnectExceptionOpts struct {
2 type CreateMsgVpnAclProfileOpts struct {
2 type CreateMsgVpnAclProfilePublishExceptionOpts struct {
2 type CreateMsgVpnAclProfileSubscribeExceptionOpts struct {
2 type CreateMsgVpnAuthorizationGroupOpts struct {
2 type CreateMsgVpnBridgeOpts struct {
2 type CreateMsgVpnBridgeRemoteMsgVpnOpts struct {
2 type CreateMsgVpnBridgeRemoteSubscriptionOpts struct {
2 type CreateMsgVpnBridgeTlsTrustedCommonNameOpts struct {
------ Lots of lines removed here ------
2 type UpdateMsgVpnReplicatedTopicOpts struct {
2 type UpdateMsgVpnRestDeliveryPointOpts struct {
2 type UpdateMsgVpnRestDeliveryPointQueueBindingOpts struct {
2 type UpdateMsgVpnRestDeliveryPointRestConsumerOpts struct {
2 type UpdateMsgVpnTopicEndpointOpts struct {
$ grep -h "type .* struct" * | sort | uniq -c | grep " 2 " | wc -l
106
The thought of manually removing those is a headache!
Workaround is commenting / removing tags. But this is not a solution…
What about an option to only generate code for the 1st tag (assuming there're multiple tags defined in the operation)?
@wari can you please also try another client generator to see if you experience similar issues?
Hi @wing328 what is the option to generate the first tag? I've tested this with Swagger (released and unreleased) and I got the same problem as well. I've not reported to swagger yet though. Are there any other client generators I can try? I only know of openapi and swagger
Sorry for client generator, I mean Python, Ruby, PHP client generators instead of the Go client generator.
If you manually clean up the tags to keep the first one only, does it solve your problem?
python setup.py test has no failuresrake spec 1056 examples, 0 failuresgradle test failed when I removed the \@Ignore lines on the test files. Not sure if that helps.As for removing the duplicates manually, it should work, as the options contain about 1 or 4 options of similar types, for example:
grep type\ GetMsgVpnTopicEndpointsOpts\ struct * -A 5
api_msg_vpn.go:type GetMsgVpnTopicEndpointsOpts struct {
api_msg_vpn.go- Count optional.Int32
api_msg_vpn.go- Cursor optional.String
api_msg_vpn.go- Where optional.Interface
api_msg_vpn.go- Select_ optional.Interface
api_msg_vpn.go-}
--
api_topic_endpoint.go:type GetMsgVpnTopicEndpointsOpts struct {
api_topic_endpoint.go- Count optional.Int32
api_topic_endpoint.go- Cursor optional.String
api_topic_endpoint.go- Where optional.Interface
api_topic_endpoint.go- Select_ optional.Interface
api_topic_endpoint.go-}
Just wondering if this will get fixed or I will have to remove the duplicates manually whenever I generate code from this particular API.
@wari I'll take another look later today
Same symptoms here with another 3.0 spec file.
Further example needed for analysis ?
(sorry, I am a beginner to openapi-generator only able to provide another example, not any further insights)
Thanks, @ity42 for reporting, I know I'm not the only here with this issue. Do you have the URL of the YAML or JSON file?
Whats about this: Create *Opts structs in model_*_opts.go files. for example:
GetAboutUserOpts move to model_about_user_opts.goGetAboutUserMsgVpnOpts move to model_about_user_msg_vpn_opts.goGetAboutUserMsgVpnsOpts move to model_about_user_msg_vpns_opts.go@wari: sorry, indirect link only; another example is:
psd2-api 1.2 Update 2018-08-17.yaml on https://www.berlin-group.org/nextgenpsd2-downloads
(I just tried it with openapi-generator-cli-3.3.1-20181008.101417-13.jar, still same symptoms)
I'm still hitting this issue with the Golang generator for the HAProxy dataplane API. You can download their OpenAPI spec file from the top of the linked page (a direct link isn't working).
Total
$ grep -h "type .* struct" *.go | grep Opts | sort | uniq -c | awk '{s+=$1} END {print s}'
255
Details
$ grep -h "type .* struct" *.go | grep Opts | sort | uniq -c | grep -v '^[[:space:]]\{0,\}1'
4 type CreateAclOpts struct {
2 type CreateBackendOpts struct {
3 type CreateBackendSwitchingRuleOpts struct {
3 type CreateBindOpts struct {
4 type CreateFilterOpts struct {
2 type CreateFrontendOpts struct {
4 type CreateHTTPRequestRuleOpts struct {
4 type CreateHTTPResponseRuleOpts struct {
4 type CreateLogTargetOpts struct {
3 type CreateServerOpts struct {
3 type CreateServerSwitchingRuleOpts struct {
3 type CreateStickRuleOpts struct {
4 type CreateTCPRequestRuleOpts struct {
4 type CreateTCPResponseRuleOpts struct {
4 type DeleteAclOpts struct {
2 type DeleteBackendOpts struct {
3 type DeleteBackendSwitchingRuleOpts struct {
3 type DeleteBindOpts struct {
4 type DeleteFilterOpts struct {
2 type DeleteFrontendOpts struct {
4 type DeleteHTTPRequestRuleOpts struct {
4 type DeleteHTTPResponseRuleOpts struct {
4 type DeleteLogTargetOpts struct {
3 type DeleteServerOpts struct {
3 type DeleteServerSwitchingRuleOpts struct {
3 type DeleteStickRuleOpts struct {
4 type DeleteTCPRequestRuleOpts struct {
4 type DeleteTCPResponseRuleOpts struct {
4 type GetAclOpts struct {
4 type GetAclsOpts struct {
2 type GetBackendOpts struct {
3 type GetBackendSwitchingRuleOpts struct {
3 type GetBackendSwitchingRulesOpts struct {
2 type GetBackendsOpts struct {
3 type GetBindOpts struct {
3 type GetBindsOpts struct {
2 type GetDefaultsOpts struct {
4 type GetFilterOpts struct {
4 type GetFiltersOpts struct {
2 type GetFrontendOpts struct {
2 type GetFrontendsOpts struct {
2 type GetGlobalOpts struct {
2 type GetHAProxyConfigurationOpts struct {
4 type GetHTTPRequestRuleOpts struct {
4 type GetHTTPRequestRulesOpts struct {
4 type GetHTTPResponseRuleOpts struct {
4 type GetHTTPResponseRulesOpts struct {
4 type GetLogTargetOpts struct {
4 type GetLogTargetsOpts struct {
3 type GetServerOpts struct {
3 type GetServerSwitchingRuleOpts struct {
3 type GetServerSwitchingRulesOpts struct {
3 type GetServersOpts struct {
3 type GetStickRuleOpts struct {
3 type GetStickRulesOpts struct {
4 type GetTCPRequestRuleOpts struct {
4 type GetTCPRequestRulesOpts struct {
4 type GetTCPResponseRuleOpts struct {
4 type GetTCPResponseRulesOpts struct {
2 type PostHAProxyConfigurationOpts struct {
4 type ReplaceAclOpts struct {
2 type ReplaceBackendOpts struct {
3 type ReplaceBackendSwitchingRuleOpts struct {
3 type ReplaceBindOpts struct {
2 type ReplaceDefaultsOpts struct {
4 type ReplaceFilterOpts struct {
2 type ReplaceFrontendOpts struct {
2 type ReplaceGlobalOpts struct {
4 type ReplaceHTTPRequestRuleOpts struct {
4 type ReplaceHTTPResponseRuleOpts struct {
4 type ReplaceLogTargetOpts struct {
3 type ReplaceServerOpts struct {
3 type ReplaceServerSwitchingRuleOpts struct {
3 type ReplaceStickRuleOpts struct {
4 type ReplaceTCPRequestRuleOpts struct {
4 type ReplaceTCPResponseRuleOpts struct {
FWIW, I wrote a quick Makefile target to remove the duplicate options and fix any vestigial imports:
remove-dupe-opts: ## Removes duplicate Opt structs from the generated code
@for struct in $$(grep -h 'type .\{1,\} struct' $(OUTPUT_DIR)/*.go | grep Opts | sort | uniq -c | grep -v '^ 1' | awk '{print $$3}'); do \
for f in $$(/bin/ls $(OUTPUT_DIR)/*.go); do \
if grep -qF "type $${struct} struct" "$${f}"; then \
if eval "test -z \$${$${struct}}"; then \
echo "skipping first appearance of $${struct} in file $${f}"; \
eval "export $${struct}=1"; \
else \
echo "removing dupe $${struct} from file $${f}"; \
tr '\n' '\r' <"$${f}" | sed 's~// '"$${struct}"'.\{1,\}type '"$${struct}"' struct {[^}]\{1,\}}~~' | tr '\r' '\n' >"$${f}.tmp"; \
mv -f "$${f}.tmp" "$${f}"; \
fi; \
fi \
done \
done
@$(GOLANGCI_LINT) run -v --no-config --fast=false --fix --disable-all --enable goimports $(OUTPUT_DIR)