diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaCSharpGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaCSharpGenerator.java index f4ead2412fe..5281595aca7 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaCSharpGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaCSharpGenerator.java @@ -134,7 +134,7 @@ public void processOpenAPI(OpenAPI openAPI) { @Override public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List models) { OperationsMap operations = super.postProcessOperationsWithModels(objs, models); - ModelPruner.removeOrphans(this, operations, models); + ModelPruner.removeOrphanModelFiles(this, operations, models); Helpers.removeHelpers(operations); GenericPropagator.propagateGenericsToOperations(operations, models); return operations; diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java index 821b9322f3e..788cba5aba3 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java @@ -140,7 +140,7 @@ public Map postProcessAllModels(Map objs) @Override public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List models) { OperationsMap operations = super.postProcessOperationsWithModels(objs, models); - ModelPruner.removeOrphans(this, operations, models); + ModelPruner.removeOrphanModelFiles(this, operations, models); Helpers.removeHelpers(operations); GenericPropagator.propagateGenericsToOperations(operations, models); return operations; diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java index e49d268d35d..8a09bbba4bb 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java @@ -93,7 +93,7 @@ public Map postProcessAllModels(Map objs) @Override public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List models) { OperationsMap operations = super.postProcessOperationsWithModels(objs, models); - ModelPruner.removeOrphans(this, operations, models); + ModelPruner.removeOrphanModelFiles(this, operations, models); Helpers.removeHelpers(operations); GenericPropagator.propagateGenericsToOperations(operations, models); return operations; diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaKotlinGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaKotlinGenerator.java index d7fe82fbbef..c65cb1fa62f 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaKotlinGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaKotlinGenerator.java @@ -190,7 +190,7 @@ private static void jsonParent(Map models) { @Override public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List models) { OperationsMap operations = super.postProcessOperationsWithModels(objs, models); - ModelPruner.removeOrphans(this, operations, models); + ModelPruner.removeOrphanModelFiles(this, operations, models); Helpers.removeHelpers(operations); GenericPropagator.propagateGenericsToOperations(operations, models); return operations; diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java index d9c79d715d9..e8bd30af26f 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java @@ -87,7 +87,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation @Override public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List models) { OperationsMap operations = super.postProcessOperationsWithModels(objs, models); - ModelPruner.removeOrphans(this, operations, models); + ModelPruner.removeOrphanModelFiles(this, operations, models); Helpers.removeHelpers(operations); return operations; } diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaPythonGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaPythonGenerator.java index d4355644625..a0db215c3aa 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaPythonGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaPythonGenerator.java @@ -72,8 +72,8 @@ public void processOpts() { file.getTemplateFile().equals("api_client.mustache") || file.getTemplateFile().equals("rest.mustache") || file.getTemplateFile().equals("configuration.mustache") || - file.getTemplateFile().equals("__init__.model.mustache") || - file.getTemplateFile().equals("__init__.package.mustache") || + file.getTemplateFile().equals("__init__model.mustache") || + file.getTemplateFile().equals("__init__package.mustache") || file.getTemplateFile().equals("model_anyof.mustache") || file.getTemplateFile().equals("gitlab-ci.mustache") ); @@ -83,7 +83,7 @@ public void processOpts() { supportingFiles.add(new SupportingFile("gitignore.mustache", "../", ".gitignore")); supportingFiles.add(new SupportingFile("__init__.mustache", "", "__init__.py")); supportingFiles.add(new SupportingFile("__init__.mustache", packageName, "__init__.py")); - supportingFiles.add(new SupportingFile("__init__.mustache", packageName + "/models", "__init__.py")); + supportingFiles.add(new SupportingFile("__init_model__.mustache", packageName + "/models", "__init__.py")); supportingFiles.add(new SupportingFile("__init__.mustache", "http", "__init__.py")); supportingFiles.add(new SupportingFile("config.mustache", packageName, "config.py")); @@ -122,7 +122,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation @Override public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List models) { OperationsMap operations = super.postProcessOperationsWithModels(objs, models); - ModelPruner.removeOrphans(this, operations, models); + ModelPruner.removeOrphanModelFiles(this, operations, models); Helpers.removeHelpers(operations); List> imports = operations.getImports(); @@ -157,6 +157,11 @@ public ModelsMap postProcessModels(ModelsMap objs) { return objs; } + @Override + public Map postProcessSupportingFileData(Map objs) { + return ModelPruner.removeOrphanFromModels(this, super.postProcessSupportingFileData(objs)); + } + @Override public String toEnumDefaultValue(CodegenProperty property, String value) { // always default to None in the client, to let the server handle the default value. diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaRubyGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaRubyGenerator.java index 8217c5cbf69..882546cc0f5 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaRubyGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaRubyGenerator.java @@ -96,7 +96,7 @@ public Map postProcessAllModels(Map objs) @Override public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List models) { OperationsMap operations = super.postProcessOperationsWithModels(objs, models); - ModelPruner.removeOrphans(this, operations, models); + ModelPruner.removeOrphanModelFiles(this, operations, models); Helpers.removeHelpers(operations); return operations; } diff --git a/generators/src/main/java/com/algolia/codegen/utils/ModelPruner.java b/generators/src/main/java/com/algolia/codegen/utils/ModelPruner.java index 0ad533fb883..f7c9ebe739c 100644 --- a/generators/src/main/java/com/algolia/codegen/utils/ModelPruner.java +++ b/generators/src/main/java/com/algolia/codegen/utils/ModelPruner.java @@ -103,8 +103,7 @@ private void exploreGraph(OperationsMap operations) { } } - /** remove all the unused models, most likely the sub models of allOf */ - public static void removeOrphans(CodegenConfig config, OperationsMap operations, List allModels) { + public static List getOrphanModelNames(CodegenConfig config, OperationsMap operations, List allModels) { // visit all the models that are accessible from: // - the properties of a model (needs recursive search) // - the return type of an operation @@ -123,6 +122,34 @@ public static void removeOrphans(CodegenConfig config, OperationsMap operations, } } + return toRemove; + } + + /** + * remove all the unused models from the models bundle variable, to be used in pair with + * `removeOrphanModelFiles` + */ + public static Map removeOrphanFromModels(CodegenConfig config, Map data) { + var models = (List) data.get("models"); + + List toRemove = getOrphanModelNames( + config, + ((Map>) data.get("apiInfo")).get("apis").get(0), + models + ); + + for (String modelName : toRemove) { + models.removeIf(model -> config.toModelName(model.getModel().getName()).equals(modelName)); + } + + data.put("models", models); + + return data; + } + + /** remove all the unused models files, most likely the sub models of allOf */ + public static void removeOrphanModelFiles(CodegenConfig config, OperationsMap operations, List allModels) { + List toRemove = getOrphanModelNames(config, operations, allModels); String templateName = config.modelTemplateFiles().keySet().iterator().next(); for (String modelName : toRemove) { diff --git a/templates/python/__init_model__.mustache b/templates/python/__init_model__.mustache new file mode 100644 index 00000000000..ca292c0ad88 --- /dev/null +++ b/templates/python/__init_model__.mustache @@ -0,0 +1,26 @@ +{{> __init__}} + +{{{import}}} + +{{#models}} +{{#model}} +from .{{classFilename}} import {{classname}} +{{/model}} +{{/models}} + +{{#isSearchClient}} +from .replace_all_objects_response import ReplaceAllObjectsResponse +from .secured_api_key_restrictions import SecuredApiKeyRestrictions +{{/isSearchClient}} + +__all__ = ( + {{#isSearchClient}} + "ReplaceAllObjectsResponse", + "SecuredApiKeyRestrictions", + {{/isSearchClient}} +{{#models}} +{{#model}} + "{{classname}}", +{{/model}} +{{/models}} +) \ No newline at end of file diff --git a/templates/python/api.mustache b/templates/python/api.mustache index 79dd91f1009..9083efb55be 100644 --- a/templates/python/api.mustache +++ b/templates/python/api.mustache @@ -2,21 +2,23 @@ {{> imports}} {{#isSearchClient}} -from algoliasearch.search.models.action import Action -from algoliasearch.search.models.batch_request import BatchRequest -from algoliasearch.search.models.browse_params_object import BrowseParamsObject -from algoliasearch.search.models.operation_type import OperationType -from algoliasearch.search.models.replace_all_objects_response import ReplaceAllObjectsResponse -from algoliasearch.search.models.scope_type import ScopeType -from algoliasearch.search.models.secured_api_key_restrictions import SecuredApiKeyRestrictions - -from algoliasearch.ingestion.models.watch_response import WatchResponse +from algoliasearch.search.models import ( + Action, + BatchRequest, + BrowseParamsObject, + OperationType, + ReplaceAllObjectsResponse, + ScopeType, + SecuredApiKeyRestrictions, +) + +from algoliasearch.ingestion.models import WatchResponse from algoliasearch.ingestion.config import IngestionConfig from algoliasearch.ingestion.client import (IngestionClient, IngestionClientSync) {{/isSearchClient}} {{#operations}}{{#operation}}{{#imports}} -from algoliasearch.{{packageName}}.models.{{#lambda.snakecase}}{{{.}}}{{/lambda.snakecase}} import {{{.}}} +from algoliasearch.{{packageName}}.models import {{{.}}} {{/imports}}{{/operation}}{{/operations}} diff --git a/templates/python/tests/e2e/e2e.mustache b/templates/python/tests/e2e/e2e.mustache index 8dfcfb7ccb0..d5430524b25 100644 --- a/templates/python/tests/e2e/e2e.mustache +++ b/templates/python/tests/e2e/e2e.mustache @@ -5,9 +5,11 @@ from json import loads from algoliasearch.{{{import}}}.client import {{#lambda.pascalcase}}{{{client}}}{{/lambda.pascalcase}} from algoliasearch.{{{import}}}.client import {{#lambda.pascalcase}}{{{client}}}Sync{{/lambda.pascalcase}} from algoliasearch.{{{import}}}.config import {{#lambda.pascalcase}}{{clientPrefix}}Config{{/lambda.pascalcase}} -from algoliasearch.search.models.batch_response import BatchResponse -from algoliasearch.search.models.updated_at_response import UpdatedAtResponse -from algoliasearch.search.models.get_task_response import GetTaskResponse +from algoliasearch.search.models import ( + BatchResponse, + UpdatedAtResponse, + GetTaskResponse, +) from ..helpers import Helpers from dotenv import load_dotenv diff --git a/templates/python/tests/requests/requests.mustache b/templates/python/tests/requests/requests.mustache index 6136783dd95..66dee2ff581 100644 --- a/templates/python/tests/requests/requests.mustache +++ b/templates/python/tests/requests/requests.mustache @@ -3,13 +3,15 @@ from time import time from json import loads from algoliasearch.http.transporter import EchoTransporter from algoliasearch.http.transporter_sync import EchoTransporterSync -from algoliasearch.search.models.secured_api_key_restrictions import SecuredApiKeyRestrictions from algoliasearch.{{{import}}}.client import {{#lambda.pascalcase}}{{{client}}}{{/lambda.pascalcase}} from algoliasearch.{{{import}}}.client import {{#lambda.pascalcase}}{{{client}}}Sync{{/lambda.pascalcase}} from algoliasearch.{{{import}}}.config import {{#lambda.pascalcase}}{{clientPrefix}}Config{{/lambda.pascalcase}} -from algoliasearch.search.models.batch_response import BatchResponse -from algoliasearch.search.models.updated_at_response import UpdatedAtResponse -from algoliasearch.search.models.get_task_response import GetTaskResponse +from algoliasearch.search.models import ( + BatchResponse, + UpdatedAtResponse, + GetTaskResponse, + SecuredApiKeyRestrictions, +) {{#modes}} class Test{{#lambda.pascalcase}}{{{client}}}{{/lambda.pascalcase}}{{#isSyncClient}}Sync{{/isSyncClient}}: