Skip to content
GitLab
    • Explore Projects Groups Snippets
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • O openapi-generator
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 3,476
    • Issues 3,476
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 402
    • Merge requests 402
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • OpenAPI Tools
  • openapi-generator
  • Merge requests
  • !14816
An error occurred while fetching the assigned milestone of the selected merge_request.

[python-nextgen] Fix unique items

  • Review changes

  • Download
  • Email patches
  • Plain diff
Merged William Cheng requested to merge fix-unique-item into master 2 years ago
  • Overview 2
  • Commits 1
  • Pipelines 0
  • Changes 30

To fix https://github.com/OpenAPITools/openapi-generator/issues/14780

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package 
    ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    Commit all changed files. This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master. These must match the expectations made by your contribution. You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*. For Windows users, please run the script in Git BASH.
  • In case you are adding a new generator, run the following additional script :
    ./bin/utils/ensure-up-to-date.sh
    Commit all changed files.
  • File the PR against the correct branch: master (6.3.0) (minor release - breaking changes with fallbacks), 7.0.x (breaking changes without fallbacks)
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

FYI @taxpon (2017/07) @frol (2017/07) @mbohlool (2017/07) @cbornet (2017/09) @kenjones-cisco (2017/11) @tomplus (2018/10) @arun-nalla (2019/11) @spacether (2019/11) @krjakbrjak (2023/02)

Compare
  • master (base)

and
  • latest version
    60e42e1d
    1 commit, 2 years ago

30 files
+ 111
- 126

    Preferences

    File browser
    Compare changes
modules/openap‎i-generator/src‎
main/java/org/…/‎codegen/languages‎
PythonNextgenCl‎ientCodegen.java‎ +27 -39
test/resourc‎es/3_0/python‎
petstore-with-fake-endpoin‎ts-models-for-testing.yaml‎ +1 -0
sam‎ples‎
client/echo_api/…/o‎penapi_client/models‎
default_‎value.py‎ +8 -8
pet‎.py‎ +3 -3
quer‎y.py‎ +2 -2
test_query_style_form_explode_true_a‎rray_string_query_object_parameter.py‎ +2 -2
openapi3/cli‎ent/petstore‎
python-nextgen-ai‎ohttp/petstore_api‎
a‎pi‎
fake_‎api.py‎ +4 -4
pet_a‎pi.py‎ +5 -5
user_‎api.py‎ +5 -7
mod‎els‎
any_of_‎color.py‎ +1 -1
array_of_array_o‎f_number_only.py‎ +2 -2
array_of_nu‎mber_only.py‎ +2 -2
array_‎test.py‎ +2 -2
enum_ar‎rays.py‎ +2 -2
file_schema_‎test_class.py‎ +2 -2
nullable‎_class.py‎ +4 -4
object_with_depr‎ecated_fields.py‎ +2 -2
pet‎.py‎ +3 -3
python-nextge‎n/petstore_api‎
a‎pi‎
fake_‎api.py‎ +4 -4
pet_a‎pi.py‎ +5 -5
user_‎api.py‎ +5 -7
mod‎els‎
any_of_‎color.py‎ +1 -1
array_of_array_o‎f_number_only.py‎ +2 -2
array_of_nu‎mber_only.py‎ +2 -2
array_‎test.py‎ +2 -2
enum_ar‎rays.py‎ +2 -2
file_schema_‎test_class.py‎ +2 -2
nullable‎_class.py‎ +4 -4
object_with_depr‎ecated_fields.py‎ +2 -2
pet‎.py‎ +3 -3
modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonNextgenClientCodegen.java
+ 27
- 39
  • View file @ 60e42e1d

  • Edit in single-file editor

  • Open in Web IDE


@@ -403,23 +403,20 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
}
if (cp.isArray) {
if (cp.maxItems != null || cp.minItems != null) {
String maxOrMinItems = "";
if (cp.maxItems != null) {
maxOrMinItems += String.format(Locale.ROOT, ", max_items=%d", cp.maxItems);
}
if (cp.minItems != null) {
maxOrMinItems += String.format(Locale.ROOT, ", min_items=%d", cp.minItems);
}
pydanticImports.add("conlist");
return String.format(Locale.ROOT, "conlist(%s%s)",
getPydanticType(cp.items, typingImports, pydanticImports, datetimeImports, modelImports),
maxOrMinItems);
} else {
typingImports.add("List");
return String.format(Locale.ROOT, "List[%s]", getPydanticType(cp.items, typingImports, pydanticImports, datetimeImports, modelImports));
String constraints = "";
if (cp.maxItems != null) {
constraints += String.format(Locale.ROOT, ", max_items=%d", cp.maxItems);
}
if (cp.minItems != null) {
constraints += String.format(Locale.ROOT, ", min_items=%d", cp.minItems);
}
if (cp.getUniqueItems()) {
constraints += ", unique_items=True";
}
pydanticImports.add("conlist");
return String.format(Locale.ROOT, "conlist(%s%s)",
getPydanticType(cp.items, typingImports, pydanticImports, datetimeImports, modelImports),
constraints);
} else if (cp.isMap) {
typingImports.add("Dict");
return String.format(Locale.ROOT, "Dict[str, %s]", getPydanticType(cp.items, typingImports, pydanticImports, datetimeImports, modelImports));
@@ -653,22 +650,21 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
return String.format(Locale.ROOT, "%sEnum", cp.nameInCamelCase);
} else*/
if (cp.isArray) {
if (cp.maxItems != null || cp.minItems != null) {
String maxOrMinItems = "";
if (cp.maxItems != null) {
maxOrMinItems += String.format(Locale.ROOT, ", max_items=%d", cp.maxItems);
}
if (cp.minItems != null) {
maxOrMinItems += String.format(Locale.ROOT, ", min_items=%d", cp.minItems);
}
pydanticImports.add("conlist");
return String.format(Locale.ROOT, "conlist(%s%s)",
getPydanticType(cp.items, typingImports, pydanticImports, datetimeImports, modelImports),
maxOrMinItems);
} else {
typingImports.add("List");
return String.format(Locale.ROOT, "List[%s]", getPydanticType(cp.items, typingImports, pydanticImports, datetimeImports, modelImports));
String constraints = "";
if (cp.maxItems != null) {
constraints += String.format(Locale.ROOT, ", max_items=%d", cp.maxItems);
}
if (cp.minItems != null) {
constraints += String.format(Locale.ROOT, ", min_items=%d", cp.minItems);
}
if (cp.getUniqueItems()) {
constraints += ", unique_items=True";
}
pydanticImports.add("conlist");
typingImports.add("List"); // for return type
return String.format(Locale.ROOT, "conlist(%s%s)",
getPydanticType(cp.items, typingImports, pydanticImports, datetimeImports, modelImports),
constraints);
} else if (cp.isMap) {
typingImports.add("Dict");
return String.format(Locale.ROOT, "Dict[str, %s]", getPydanticType(cp.items, typingImports, pydanticImports, datetimeImports, modelImports));
@@ -884,10 +880,6 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
fields.add(String.format(Locale.ROOT, "description=\"%s\"", param.description));
}
if (param.isArray && param.getUniqueItems()) { // a set
fields.add("unique_items=True");
}
/* TODO support example
if (!StringUtils.isEmpty(cp.getExample())) { // has example
fields.add(String.format(Locale.ROOT, "example=%s", cp.getExample()));
@@ -1071,10 +1063,6 @@ public class PythonNextgenClientCodegen extends AbstractPythonCodegen implements
fields.add(String.format(Locale.ROOT, "description=\"%s\"", cp.description));
}
if (cp.isArray && cp.getUniqueItems()) { // a set
fields.add("unique_items=True");
}
/* TODO review as example may break the build
if (!StringUtils.isEmpty(cp.getExample())) { // has example
fields.add(String.format(Locale.ROOT, "example=%s", cp.getExample()));
modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing.yaml
+ 1
- 0
  • View file @ 60e42e1d

  • Edit in single-file editor

  • Open in Web IDE


@@ -1417,6 +1417,7 @@ components:
type: string
example: doggie
photoUrls:
minItems: 0
type: array
xml:
name: photoUrl
samples/client/echo_api/python-nextgen/openapi_client/models/default_value.py
+ 8
- 8
  • View file @ 60e42e1d

  • Edit in single-file editor

  • Open in Web IDE


@@ -19,7 +19,7 @@ import json
from typing import List, Optional
from pydantic import BaseModel, StrictInt, StrictStr, validator
from pydantic import BaseModel, StrictInt, StrictStr, conlist, validator
from openapi_client.models.string_enum_ref import StringEnumRef
class DefaultValue(BaseModel):
@@ -28,13 +28,13 @@ class DefaultValue(BaseModel):
Do not edit the class manually.
"""
array_string_enum_ref_default: Optional[List[StringEnumRef]] = None
array_string_enum_default: Optional[List[StrictStr]] = None
array_string_default: Optional[List[StrictStr]] = None
array_integer_default: Optional[List[StrictInt]] = None
array_string: Optional[List[StrictStr]] = None
array_string_nullable: Optional[List[StrictStr]] = None
array_string_extension_nullable: Optional[List[StrictStr]] = None
array_string_enum_ref_default: Optional[conlist(StringEnumRef)] = None
array_string_enum_default: Optional[conlist(StrictStr)] = None
array_string_default: Optional[conlist(StrictStr)] = None
array_integer_default: Optional[conlist(StrictInt)] = None
array_string: Optional[conlist(StrictStr)] = None
array_string_nullable: Optional[conlist(StrictStr)] = None
array_string_extension_nullable: Optional[conlist(StrictStr)] = None
string_nullable: Optional[StrictStr] = None
__properties = ["array_string_enum_ref_default", "array_string_enum_default", "array_string_default", "array_integer_default", "array_string", "array_string_nullable", "array_string_extension_nullable", "string_nullable"]
samples/client/echo_api/python-nextgen/openapi_client/models/pet.py
+ 3
- 3
  • View file @ 60e42e1d

  • Edit in single-file editor

  • Open in Web IDE


@@ -19,7 +19,7 @@ import json
from typing import List, Optional
from pydantic import BaseModel, Field, StrictInt, StrictStr, validator
from pydantic import BaseModel, Field, StrictInt, StrictStr, conlist, validator
from openapi_client.models.category import Category
from openapi_client.models.tag import Tag
@@ -32,8 +32,8 @@ class Pet(BaseModel):
id: Optional[StrictInt] = None
name: StrictStr = ...
category: Optional[Category] = None
photo_urls: List[StrictStr] = Field(..., alias="photoUrls")
tags: Optional[List[Tag]] = None
photo_urls: conlist(StrictStr) = Field(..., alias="photoUrls")
tags: Optional[conlist(Tag)] = None
status: Optional[StrictStr] = Field(None, description="pet status in the store")
__properties = ["id", "name", "category", "photoUrls", "tags", "status"]
samples/client/echo_api/python-nextgen/openapi_client/models/query.py
+ 2
- 2
  • View file @ 60e42e1d

  • Edit in single-file editor

  • Open in Web IDE


@@ -19,7 +19,7 @@ import json
from typing import List, Optional
from pydantic import BaseModel, Field, StrictInt, StrictStr, validator
from pydantic import BaseModel, Field, StrictInt, StrictStr, conlist, validator
class Query(BaseModel):
"""NOTE: This class is auto generated by OpenAPI Generator.
@@ -28,7 +28,7 @@ class Query(BaseModel):
Do not edit the class manually.
"""
id: Optional[StrictInt] = Field(None, description="Query")
outcomes: Optional[List[StrictStr]] = None
outcomes: Optional[conlist(StrictStr)] = None
__properties = ["id", "outcomes"]
@validator('outcomes')
0 Assignees
None
Assign to
0 Reviewers
None
Request review from
Labels
0
None
0
None
    Assign labels
  • Manage project labels

Milestone
No milestone
None
None
Time tracking
No estimate or time spent
Lock merge request
Unlocked
0
0 participants
Reference:
Source branch: fix-unique-item

Menu

Explore Projects Groups Snippets