Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -619,10 +619,21 @@ protected void addAdditionPropertiesToCodeGenModel(CodegenModel codegenModel, Sc
@Override
public OperationsMap postProcessOperationsWithModels(
OperationsMap objs, List<ModelMap> allModels) {
List<CodegenOperation> operations = objs.getOperations().getOperation();

if (useIndependentImplicitClients) {
renameIndependentClientOperationMembers(
objs.getOperations().getOperation());
renameIndependentClientOperationMembers(operations);
}

boolean hasJsonHeader = operations.stream()
.flatMap(operation -> operation.headerParams.stream())
.anyMatch(parameter ->
parameter.vendorExtensions.containsKey("x-python-json-header"));

if (hasJsonHeader) {
objs.put("x-python-has-json-header", true);
}

return super.postProcessOperationsWithModels(objs, allModels);
}

Expand Down Expand Up @@ -1021,6 +1032,11 @@ public String toVarName(String name) {
@Override
public void postProcessParameter(CodegenParameter parameter) {
super.postProcessParameter(parameter);

if (parameter.isHeaderParam && isJsonMimeType(parameter.contentType)) {
parameter.vendorExtensions.put("x-python-json-header", true);
}

// Only operation signatures gain this control argument. Keep model
// field naming independent of the selected library.
if (usesLegacyApiCompatibility()
Expand Down
10 changes: 10 additions & 0 deletions modules/openapi-generator/src/main/resources/python/api.mustache
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{{>partial_header}}

{{#x-python-has-json-header}}
import json
Comment thread
cubic-dev-ai[bot] marked this conversation as resolved.
{{/x-python-has-json-header}}
import warnings
from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt
from typing import Any, Dict, List, Optional, Tuple, Union
Expand Down Expand Up @@ -383,7 +386,14 @@ https://github.com/OpenAPITools/openapi-generator/blob/c84b949df1a9ec04ba75989cb
# process the header parameters
{{#headerParams}}
if {{paramName}} is not None:
{{#vendorExtensions.x-python-json-header}}
_header_params['{{baseName}}'] = json.dumps(
self.api_client.sanitize_for_serialization({{paramName}})
)
{{/vendorExtensions.x-python-json-header}}
{{^vendorExtensions.x-python-json-header}}
_header_params['{{baseName}}'] = {{paramName}}
{{/vendorExtensions.x-python-json-header}}
{{/headerParams}}
# process the form parameters
{{#formParams}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,62 @@ public void testHttpx2Generation(boolean sync, Object poetry1, String backend) t
Assert.assertFalse(Files.readString(Paths.get(output, "requirements.txt")).contains("httpx >="));
}

@Test
public void testJsonImportOnlyGeneratedForJsonHeaderContent() throws IOException {
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
output.deleteOnExit();

final CodegenConfigurator configurator = new CodegenConfigurator()
.setGeneratorName("python")
.setInputSpec("src/test/resources/3_0/petstore.yaml")
.setOutputDir(output.getAbsolutePath());

DefaultGenerator generator = new DefaultGenerator();
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
files.forEach(File::deleteOnExit);

Path api = Paths.get(
output.getAbsolutePath(),
"openapi_client",
"api",
"pet_api.py");

TestUtils.assertFileNotContains(api, "import json");
}

@Test
public void testJsonContentHeaderUsesJsonSerialization() throws IOException {
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
output.deleteOnExit();

final CodegenConfigurator configurator = new CodegenConfigurator()
.setGeneratorName("python")
.setInputSpec("src/test/resources/3_1/python/json-header-content.yaml")
.setOutputDir(output.getAbsolutePath());

DefaultGenerator generator = new DefaultGenerator();
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
files.forEach(File::deleteOnExit);

Path api = Paths.get(
output.getAbsolutePath(),
"openapi_client",
"api",
"default_api.py");

TestUtils.assertFileContains(
api,
"import json",
"_header_params['X-Json-Arg'] = json.dumps(",
"self.api_client.sanitize_for_serialization(x_json_arg)",
"_header_params['X-Plain-Arg'] = x_plain_arg");

TestUtils.assertFileNotContains(
api,
"_header_params['X-Json-Arg'] = x_json_arg",
"_header_params['X-Plain-Arg'] = json.dumps(");
}

@Test
public void testInitialConfigValues() throws Exception {
final PythonClientCodegen codegen = new PythonClientCodegen();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
openapi: 3.1.0

info:
title: JSON header content test
version: 1.0.0

paths:
/test:
post:
operationId: testJsonHeader
parameters:
- name: X-Json-Arg
in: header
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/HeaderArg'

- name: X-Plain-Arg
in: header
required: false
schema:
type: string

responses:
'204':
description: No content

components:
schemas:
HeaderArg:
type: object
properties:
path:
type: string
recursive:
type: boolean
Loading