From fe9636e9d93dd371d0defedee4dba962031fbb98 Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Thu, 22 Jul 2021 05:32:11 +0300 Subject: [PATCH] [php] Fix Composer 2 name error (#10002) * Fix obvious typo * Add function to build Composer package name * Add composerPackageName codegen property * Use package name if it's not empty * Refresh samples --- .../codegen/config/CodegenConfigurator.java | 2 +- .../codegen/languages/AbstractPhpCodegen.java | 31 +++++++++++++++++++ .../src/main/resources/php/composer.mustache | 4 ++- .../codegen/php/AbstractPhpCodegenTest.java | 22 +++++++++++++ .../php/OpenAPIClient-php/composer.json | 1 - 5 files changed, 57 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java index cea51acb67f..01302ab1dcd 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java @@ -301,7 +301,7 @@ public class CodegenConfigurator { public CodegenConfigurator setGitUserId(String gitUserId) { if (StringUtils.isNotEmpty(gitUserId)) { - addAdditionalProperty(CodegenConstants.GIT_HOST, gitUserId); + addAdditionalProperty(CodegenConstants.GIT_USER_ID, gitUserId); } generatorSettingsBuilder.withGitUserId(gitUserId); return this; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java index 4e1f571a709..d8327a99401 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java @@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.util.*; +import java.util.regex.Pattern; import java.util.regex.Matcher; import static org.openapitools.codegen.utils.StringUtils.camelize; import static org.openapitools.codegen.utils.StringUtils.underscore; @@ -190,6 +191,18 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg this.setParameterNamingConvention((String) additionalProperties.get(VARIABLE_NAMING_CONVENTION)); } + if (additionalProperties.containsKey(CodegenConstants.GIT_USER_ID)) { + this.setGitUserId((String) additionalProperties.get(CodegenConstants.GIT_USER_ID)); + } + + if (additionalProperties.containsKey(CodegenConstants.GIT_REPO_ID)) { + this.setGitRepoId((String) additionalProperties.get(CodegenConstants.GIT_REPO_ID)); + } + + if (!this.getComposerPackageName().isEmpty()) { + additionalProperties.put("composerPackageName", this.getComposerPackageName()); + } + additionalProperties.put("escapedInvokerPackage", invokerPackage.replace("\\", "\\\\")); // make api and model src path available in mustache template @@ -758,4 +771,22 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg } } } + + /** + * Get Composer package name based on GIT_USER_ID and GIT_REPO_ID. + * + * @return package name or empty string on fail + */ + public String getComposerPackageName() { + String packageName = this.getGitUserId() + "/" + this.getGitRepoId(); + if ( + packageName.contentEquals("/") + || packageName.contentEquals("null/null") + || !Pattern.matches("^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$", packageName) + ) { + return ""; + } + + return packageName; + } } diff --git a/modules/openapi-generator/src/main/resources/php/composer.mustache b/modules/openapi-generator/src/main/resources/php/composer.mustache index 08cd8f6bfdf..e948b9b1bf6 100644 --- a/modules/openapi-generator/src/main/resources/php/composer.mustache +++ b/modules/openapi-generator/src/main/resources/php/composer.mustache @@ -1,5 +1,7 @@ { - "name": "{{gitUserId}}/{{gitRepoId}}", + {{#composerPackageName}} + "name": "{{composerPackageName}}", + {{/composerPackageName}} {{#artifactVersion}} "version": "{{artifactVersion}}", {{/artifactVersion}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/php/AbstractPhpCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/php/AbstractPhpCodegenTest.java index 9ec97bd38ab..22ecaeb2108 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/php/AbstractPhpCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/php/AbstractPhpCodegenTest.java @@ -22,6 +22,7 @@ import org.openapitools.codegen.CodegenOperation; import org.openapitools.codegen.CodegenType; import org.openapitools.codegen.languages.AbstractPhpCodegen; import org.testng.Assert; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.util.Arrays; @@ -100,6 +101,27 @@ public class AbstractPhpCodegenTest { Assert.assertEquals(codegenOperation.produces.get(1).get("mediaType"), "application/json"); } + @Test(dataProvider = "composerNames", description = "Issue #9998") + public void testGetComposerPackageName(String gitUserId, String gitRepoId, String result) { + final AbstractPhpCodegen codegen = new P_AbstractPhpCodegen(); + codegen.processOpts(); + + codegen.setGitUserId(gitUserId); + codegen.setGitRepoId(gitRepoId); + Assert.assertEquals(codegen.getComposerPackageName(), result); + } + + @DataProvider(name = "composerNames") + public static Object[][] composerNames() { + return new Object[][] { + {"", "", ""}, + {"null", "null", ""}, + {"GIT_REPO_ID", "GIT_USER_ID", ""}, + {"git_repo_id", "git_user_id", "git_repo_id/git_user_id"}, + {"foo", "bar", "foo/bar"}, + }; + } + private static class P_AbstractPhpCodegen extends AbstractPhpCodegen { @Override public CodegenType getTag() { diff --git a/samples/client/petstore/php/OpenAPIClient-php/composer.json b/samples/client/petstore/php/OpenAPIClient-php/composer.json index bbdfc4692fd..63a8fef63e7 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/composer.json +++ b/samples/client/petstore/php/OpenAPIClient-php/composer.json @@ -1,5 +1,4 @@ { - "name": "GIT_USER_ID/GIT_REPO_ID", "description": "This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\", "keywords": [ "openapitools",