From 2adca932040e15e72d6fe87d7c07efb21a15f026 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 17:57:05 +0000 Subject: [PATCH 01/17] feat: Replace Optional with Union type hints for improved type clarity --- src/datamodel_code_generator/__init__.py | 2 +- src/datamodel_code_generator/__main__.py | 2 +- src/datamodel_code_generator/arguments.py | 4 +- src/datamodel_code_generator/cli_options.py | 2 +- .../data/expected/main/frozen_dataclasses.py | 3 +- .../main/frozen_dataclasses_keyword_only.py | 3 +- .../main/graphql/additional_imports.py | 4 +- tests/data/expected/main/graphql/annotated.py | 12 +- .../main/graphql/annotated_field_aliases.py | 4 +- .../graphql/annotated_use_default_kwarg.py | 12 +- .../annotated_use_standard_collections.py | 12 +- tests/data/expected/main/graphql/casing.py | 10 +- .../main/graphql/custom_formatters.py | 4 +- .../main/graphql/custom_scalar_types.py | 4 +- .../main/graphql/different_types_of_fields.py | 28 ++--- .../expected/main/graphql/field_aliases.py | 4 +- .../expected/main/graphql/simple_star_wars.py | 110 +++++++++--------- .../graphql/simple_star_wars_dataclass.py | 110 +++++++++--------- .../simple_star_wars_dataclass_arguments.py | 110 +++++++++--------- ...mple_star_wars_dataclass_frozen_kw_only.py | 110 +++++++++--------- .../simple_star_wars_extra_fields_allow.py | 110 +++++++++--------- .../data/expected/main/graphql/type_alias.py | 14 +-- .../expected/main/graphql/type_alias_py312.py | 14 +-- tests/data/expected/main/graphql/union.py | 12 +- .../main/graphql/use_standard_collections.py | 4 +- .../main/json/json_array_include_null.py | 4 +- .../alias_import_alias/date_schema.py | 5 +- .../main/jsonschema/all_of_any_of/direct.py | 4 +- .../jsonschema/all_of_any_of/reference.py | 4 +- .../all_of_any_of_base_class_ref.py | 10 +- .../all_of_merge_boolean_property.py | 10 +- .../jsonschema/all_of_merge_same_property.py | 10 +- .../main/jsonschema/all_of_one_of/direct.py | 4 +- .../jsonschema/all_of_one_of/reference.py | 4 +- .../main/jsonschema/all_of_ref_self.py | 4 +- .../all_of_ref_with_property_override.py | 8 +- .../main/jsonschema/all_of_use_default.py | 6 +- .../main/jsonschema/all_of_with_object.py | 14 +-- .../allof_root_model_constraints.py | 48 ++++---- .../allof_root_model_constraints_merge.py | 48 ++++---- .../jsonschema/anyof_const_enum_nested.py | 5 +- .../anyof_const_enum_nested_literal.py | 6 +- .../expected/main/jsonschema/autodetect.py | 10 +- .../main/jsonschema/boolean_property.py | 4 +- .../main/jsonschema/bundled_schema_with_id.py | 7 +- .../main/jsonschema/circular_reference.py | 18 ++- .../main/jsonschema/combine_any_of_object.py | 22 ++-- .../combine_any_of_object_left_to_right.py | 24 ++-- .../jsonschema/combine_any_of_object_v2.py | 24 ++-- .../main/jsonschema/combine_one_of_object.py | 22 ++-- .../main/jsonschema/complex_any_of.py | 4 +- .../main/jsonschema/complex_one_of.py | 4 +- .../complicated_enum_default_member.py | 9 +- ...mplicated_enum_default_member_dataclass.py | 10 +- .../main/jsonschema/custom_base_path.py | 20 ++-- .../main/jsonschema/custom_formatters.py | 10 +- .../main/jsonschema/dataclass_field.py | 6 +- .../jsonschema/dataclass_field_default.py | 8 +- .../main/jsonschema/dataclass_field_py312.py | 6 +- .../main/jsonschema/discriminator_literals.py | 6 +- .../discriminator_literals_msgspec.py | 10 +- ...riminator_literals_msgspec_keyword_only.py | 10 +- ...rals_msgspec_keyword_only_omit_defaults.py | 10 +- .../jsonschema/discriminator_no_mapping.py | 4 +- .../discriminator_with_external_reference.py | 6 +- ...minator_with_external_reference_msgspec.py | 10 +- .../inner_folder/schema.py | 4 +- .../inner_folder/type_2.py | 4 +- .../inner_folder/schema.py | 4 +- .../inner_folder/type_2.py | 8 +- .../discriminator_with_meta_msgspec.py | 4 +- .../discriminator_with_type_string_msgspec.py | 4 +- ...r_with_type_string_msgspec_no_annotated.py | 4 +- .../main/jsonschema/duration_msgspec.py | 4 +- .../main/jsonschema/duration_pydantic_v2.py | 4 +- .../main/jsonschema/enum_specialized.py | 13 +-- .../jsonschema/enum_specialized_disable.py | 13 +-- .../main/jsonschema/external_files.py | 4 +- .../jsonschema/external_files_in_directory.py | 31 +++-- .../main/jsonschema/external_other_ref2.py | 4 +- .../expected/main/jsonschema/external_ref0.py | 6 +- .../main/jsonschema/extra_fields_allow.py | 12 +- .../main/jsonschema/extra_fields_forbid.py | 12 +- .../main/jsonschema/extra_fields_ignore.py | 12 +- .../main/jsonschema/extra_fields_v2_allow.py | 12 +- .../main/jsonschema/extra_fields_v2_forbid.py | 12 +- .../main/jsonschema/extra_fields_v2_ignore.py | 12 +- .../main/jsonschema/extras_in_oneof.py | 20 ++-- .../expected/main/jsonschema/field_extras.py | 6 +- .../field_extras_field_extra_keys.py | 6 +- .../field_extras_field_extra_keys_v2.py | 8 +- .../field_extras_field_include_all_keys.py | 6 +- .../field_extras_field_include_all_keys_v2.py | 6 +- .../main/jsonschema/field_extras_v2.py | 8 +- .../main/jsonschema/field_has_same_name.py | 6 +- .../main/jsonschema/field_has_same_name_v2.py | 6 +- .../field_name_shadows_class_name.py | 4 +- .../data/expected/main/jsonschema/general.py | 10 +- .../general_dataclass_frozen_kw_only.py | 10 +- .../main/jsonschema/has_default_value.py | 17 ++- tests/data/expected/main/jsonschema/id.py | 6 +- .../data/expected/main/jsonschema/id_stdin.py | 6 +- .../main/jsonschema/ids/ContactPoint.py | 5 +- .../expected/main/jsonschema/ids/__init__.py | 9 +- .../jsonschema/inheritance_forward_ref.py | 24 ++-- ...nheritance_forward_ref_keep_model_order.py | 24 ++-- .../main/jsonschema/invalid_model_name.py | 10 +- .../expected/main/jsonschema/items_boolean.py | 4 +- .../expected/main/jsonschema/json_pointer.py | 6 +- .../main/jsonschema/json_pointer_array.py | 4 +- .../main/jsonschema/json_reuse_enum.py | 9 +- .../json_reuse_enum_default_member.py | 9 +- .../jsonschema/jsonschema_allof_enum_ref.py | 4 +- ...hema_collapse_root_models_with_optional.py | 4 +- .../jsonschema_empty_items_array.py | 6 +- .../jsonschema_enum_object_values.py | 11 +- .../jsonschema_hierarchical_aliases_scoped.py | 16 ++- .../jsonschema_multiple_types_with_object.py | 16 ++- .../jsonschema_root_model_ordering.py | 18 +-- ...ma_root_model_ordering_keep_model_order.py | 18 +-- .../keep_model_order_field_references.py | 6 +- .../main/jsonschema/long_description.py | 8 +- .../long_description_wrap_string_literal.py | 8 +- .../modular_default_enum_member/foo.py | 8 +- .../jsonschema/module_split_single/order.py | 6 +- .../jsonschema/module_split_single/user.py | 6 +- .../main/jsonschema/multiple_files/file_a.py | 6 +- .../main/jsonschema/multiple_files/file_c.py | 6 +- .../main/jsonschema/multiple_files/file_d.py | 6 +- .../multiple_files_json_pointer/file_a.py | 6 +- .../multiple_files_json_pointer/file_c.py | 6 +- .../main/jsonschema/nested_deep/__init__.py | 8 +- .../nested_deep/empty_parent/nested/deep.py | 4 +- .../jsonschema/nested_deep/nested/deep.py | 6 +- .../jsonschema/nested_directory/_internal.py | 22 ++-- .../nested_directory/definitions/friends.py | 6 +- .../definitions/relative/animal/pet/pet.py | 8 +- .../main/jsonschema/nested_json_pointer.py | 26 ++--- .../main/jsonschema/nested_skip/a/b/c/d.py | 4 +- tests/data/expected/main/jsonschema/null.py | 8 +- .../main/jsonschema/null_and_array.py | 4 +- .../main/jsonschema/null_and_array_v2.py | 4 +- .../main/jsonschema/nullable_any_of.py | 10 +- .../main/jsonschema/nullable_object.py | 6 +- .../main/jsonschema/object_has_one_of.py | 3 +- .../one_of_with_sub_schema_array_item.py | 4 +- .../jsonschema/oneof_const_enum_nested.py | 5 +- .../oneof_const_enum_nested_literal.py | 6 +- .../jsonschema/oneof_const_enum_nullable.py | 3 +- .../jsonschema/oneof_const_enum_type_list.py | 3 +- .../jsonschema/oneof_const_mixed_with_ref.py | 6 +- .../jsonschema/oneof_const_with_properties.py | 6 +- .../data/expected/main/jsonschema/pattern.py | 17 ++- .../main/jsonschema/pattern_properties.py | 4 +- .../pattern_properties_by_reference.py | 14 +-- .../pattern_properties_field_constraints.py | 4 +- .../pydantic_v2_model_rebuild_inheritance.py | 6 +- .../require_referenced_field/referenced.py | 5 +- .../referenced.py | 6 +- .../referenced.py | 6 +- .../referenced.py | 6 +- .../required_and_any_of_required.py | 8 +- .../jsonschema/reuse_scope_tree/schema_a.py | 4 +- .../jsonschema/reuse_scope_tree/schema_b.py | 4 +- .../jsonschema/reuse_scope_tree/shared.py | 6 +- .../reuse_scope_tree_branch/aaa_first.py | 6 +- .../reuse_scope_tree_branch/bbb_second.py | 6 +- .../reuse_scope_tree_branch/shared.py | 4 +- .../reuse_scope_tree_branch/yyy_duplicate.py | 4 +- .../reuse_scope_tree_branch/zzz_last.py | 4 +- .../reuse_scope_tree_dataclass/schema_a.py | 3 +- .../reuse_scope_tree_dataclass/schema_b.py | 3 +- .../reuse_scope_tree_dataclass/shared.py | 5 +- .../reuse_scope_tree_enum/schema_a.py | 4 +- .../reuse_scope_tree_enum/schema_b.py | 4 +- .../reuse_scope_tree_multi/schema_a.py | 8 +- .../reuse_scope_tree_multi/schema_b.py | 4 +- .../reuse_scope_tree_multi/schema_c.py | 6 +- .../reuse_scope_tree_multi/schema_d.py | 4 +- .../reuse_scope_tree_multi/shared.py | 6 +- .../reuse_scope_tree_no_conflict_dir/other.py | 6 +- .../shared/schema.py | 6 +- .../reuse_scope_tree_no_dup/schema_a.py | 4 +- .../reuse_scope_tree_no_dup/schema_b.py | 4 +- .../reuse_scope_tree_self_ref/schema_a.py | 4 +- .../reuse_scope_tree_self_ref/schema_b.py | 4 +- .../reuse_scope_tree_self_ref/shared.py | 6 +- .../data/expected/main/jsonschema/root_id.py | 14 +-- .../main/jsonschema/root_id_absolute_url.py | 14 +-- .../expected/main/jsonschema/root_in_enum.py | 6 +- .../jsonschema/root_model_default_value.py | 8 +- .../root_model_default_value_branches.py | 8 +- .../root_model_default_value_no_annotated.py | 7 +- .../root_model_default_value_non_root.py | 10 +- .../root_model_with_additional_properties.py | 21 ++-- ...additional_properties_custom_class_name.py | 21 ++-- ...odel_with_additional_properties_literal.py | 22 ++-- ..._properties_use_generic_container_types.py | 21 ++-- ...nal_properties_use_standard_collections.py | 21 ++-- .../main/jsonschema/root_one_of/bar.py | 4 +- .../main/jsonschema/root_one_of/foo.py | 6 +- .../main/jsonschema/root_one_of/union.py | 6 +- .../main/jsonschema/self_reference.py | 6 +- .../main/jsonschema/similar_nested_array.py | 22 ++-- .../space_field_enum_snake_case_field.py | 3 +- .../expected/main/jsonschema/special_enum.py | 3 +- .../special_enum_empty_enum_field_name.py | 3 +- .../special_enum_special_field_name_prefix.py | 3 +- ..._special_field_name_prefix_keep_private.py | 3 +- .../main/jsonschema/special_field_name.py | 14 +-- ..._model_remove_special_field_name_prefix.py | 8 +- .../main/jsonschema/stdin_oneof_ref.py | 4 +- .../expected/main/jsonschema/strict_types.py | 24 ++-- .../strict_types_all_field_constraints.py | 24 ++-- .../expected/main/jsonschema/subclass_enum.py | 13 +-- .../main/jsonschema/time_delta_msgspec.py | 4 +- .../main/jsonschema/time_delta_pydantic_v2.py | 4 +- .../main/jsonschema/title_with_dots.py | 8 +- tests/data/expected/main/jsonschema/titles.py | 21 ++-- .../jsonschema/titles_use_title_as_name.py | 21 ++-- .../complex/directory/api/path/basic_enum.py | 5 +- .../complex/directory/api/path/input.py | 6 +- .../complex/directory/api/path/output.py | 4 +- .../complex/directory/schema.py | 4 +- .../model/schema.py | 4 +- .../complex.directory/api_path_basic_enum.py | 5 +- .../complex.directory/api_path_input.py | 6 +- .../complex.directory/api_path_output.py | 4 +- .../complex.directory/schema.py | 4 +- .../expected/main/jsonschema/type_alias.py | 14 +-- .../main/jsonschema/type_alias_py312.py | 14 +-- ...lias_with_circular_ref_to_class_msgspec.py | 4 +- .../type_alias_with_field_description.py | 16 ++- ...type_alias_with_field_description_py312.py | 14 +-- .../typed_dict_not_required_nullable.py | 6 +- .../jsonschema/use_frozen_field_dataclass.py | 3 +- .../use_frozen_field_no_readonly.py | 6 +- .../main/jsonschema/use_frozen_field_v1.py | 3 +- .../main/jsonschema/use_frozen_field_v2.py | 4 +- .../without_titles_use_title_as_name.py | 21 ++-- .../main/openapi/additional_properties.py | 22 ++-- .../all_exports_no_child/parent/__init__.py | 4 +- .../all_exports_no_child/parent/child/deep.py | 4 +- .../pkg/__init__.py | 6 +- .../all_exports_with_local_models/pkg/sub.py | 4 +- .../main/openapi/all_of_with_relative_ref.py | 5 +- .../expected/main/openapi/allof_enum_ref.py | 3 +- .../openapi/allof_materialize_defaults.py | 10 +- .../main/openapi/allof_merge_mode_none.py | 6 +- .../allof_multiple_parents_same_property.py | 12 +- .../openapi/allof_parent_bool_property.py | 8 +- .../openapi/allof_parent_no_properties.py | 4 +- .../allof_partial_override_array_items.py | 10 +- ..._partial_override_array_items_no_parent.py | 6 +- ...of_partial_override_deeply_nested_array.py | 6 +- .../allof_partial_override_inherited_types.py | 10 +- ...lof_partial_override_nested_array_items.py | 6 +- .../allof_partial_override_non_array_field.py | 10 +- .../allof_partial_override_simple_list_any.py | 6 +- .../allof_partial_override_unique_items.py | 6 +- ...rtial_override_unique_items_pydantic_v2.py | 6 +- .../openapi/allof_property_bool_schema.py | 8 +- .../expected/main/openapi/allof_required.py | 4 +- .../main/openapi/allof_with_anyof_ref.py | 9 +- .../main/openapi/allof_with_oneof_ref.py | 10 +- ...f_with_required_inherited_complex_allof.py | 20 ++-- ...f_with_required_inherited_comprehensive.py | 58 ++++----- .../allof_with_required_inherited_coverage.py | 62 +++++----- ...llof_with_required_inherited_edge_cases.py | 48 ++++---- .../allof_with_required_inherited_fields.py | 8 +- ...equired_inherited_fields_force_optional.py | 10 +- ...f_with_required_inherited_nested_object.py | 28 ++--- .../main/openapi/allow_extra_fields.py | 18 ++- .../openapi/allow_extra_fields_pydantic_v2.py | 18 ++- .../openapi/allow_population_by_field_name.py | 18 ++- ...ow_population_by_field_name_pydantic_v2.py | 18 ++- .../data/expected/main/openapi/base_class.py | 18 ++- .../openapi/body_and_parameters/general.py | 15 ++- .../openapi/body_and_parameters/only_paths.py | 15 ++- .../body_and_parameters/only_schemas.py | 8 +- .../openapi/body_and_parameters/remote_ref.py | 8 +- .../circular_imports_acyclic/__init__.py | 4 +- .../openapi/circular_imports_acyclic/sub.py | 8 +- .../_internal.py | 30 +++-- .../_internal.py | 18 ++- .../_internal.py | 22 ++-- .../circular_imports_small_cycle/_internal.py | 10 +- .../circular_imports_stripe_like/_internal.py | 38 +++--- .../_internal.py | 22 ++-- .../main/openapi/collapse_root_models.py | 10 +- .../collapse_root_models_field_constraints.py | 6 +- ...ot_models_with_references_to_flat_types.py | 4 +- .../main/openapi/complex_reference.py | 4 +- .../main/openapi/content_in_parameters.py | 8 +- .../main/openapi/custom_file_header.py | 18 ++- .../custom_file_header_comments_only.py | 18 ++- .../main/openapi/custom_file_header_empty.py | 18 ++- .../custom_file_header_invalid_syntax.py | 18 ++- .../openapi/custom_file_header_no_future.py | 18 ++- .../custom_file_header_with_docstring.py | 18 ++- ...m_file_header_with_docstring_and_import.py | 18 ++- .../openapi/custom_file_header_with_import.py | 18 ++- .../main/openapi/custom_id_pydantic_v2.py | 3 +- .../main/openapi/custom_template_dir.py | 18 ++- tests/data/expected/main/openapi/dataclass.py | 18 +-- .../main/openapi/dataclass_base_class.py | 18 +-- ...aclass_inheritance_field_ordering_py310.py | 5 +- .../main/openapi/dataclass_keyword_only.py | 7 +- .../main/openapi/default_object/Another.py | 6 +- .../main/openapi/default_object/Nested.py | 10 +- .../main/openapi/default_object/__init__.py | 10 +- .../openapi/disable_appending_item_suffix.py | 30 +++-- .../main/openapi/disable_timestamp.py | 18 ++- .../discriminator/allof_no_subtypes.py | 6 +- .../dataclass_enum_one_literal_as_default.py | 4 +- ...class_enum_one_literal_as_default_py310.py | 4 +- .../main/openapi/discriminator/enum.py | 6 +- .../openapi/discriminator/enum_duplicate.py | 8 +- .../enum_one_literal_as_default.py | 6 +- .../discriminator/enum_single_value_anyof.py | 6 +- .../enum_single_value_anyof_use_enum.py | 6 +- .../discriminator/enum_use_enum_values.py | 6 +- .../enum_use_enum_values_sanitized.py | 6 +- .../main/openapi/discriminator/general.py | 6 +- .../main/openapi/discriminator/in_array.py | 6 +- .../in_array_collapse_root_models.py | 6 +- .../openapi/discriminator/with_properties.py | 12 +- .../openapi/discriminator/without_mapping.py | 6 +- .../v0/__init__.py | 4 +- .../v0/mammal/__init__.py | 4 +- .../v0/mammal/canine.py | 4 +- .../dot_notation_inheritance/v0/__init__.py | 8 +- .../dot_notation_inheritance/v0/animal.py | 4 +- .../main/openapi/duplicate_models2.py | 14 +-- .../main/openapi/enable_command_header.py | 18 ++- .../main/openapi/enable_faux_immutability.py | 18 ++- .../enable_faux_immutability_pydantic_v2.py | 18 ++- .../main/openapi/enable_version_header.py | 18 ++- .../expected/main/openapi/enum_models/one.py | 20 ++-- .../enum_models/one_literal_as_default.py | 20 ++-- .../expected/main/openapi/enum_specialized.py | 3 +- .../module_openapi/model_a.py | 8 +- .../modules/quality_evaluation.py | 4 +- .../openapi/extra_template_data_config.py | 18 ++- .../extra_template_data_config_pydantic_v2.py | 18 ++- .../expected/main/openapi/force_optional.py | 40 +++---- tests/data/expected/main/openapi/general.py | 18 ++- tests/data/expected/main/openapi/http_refs.py | 12 +- .../expected/main/openapi/json_pointer.py | 8 +- .../expected/main/openapi/max_items_enum.py | 3 +- .../expected/main/openapi/max_min_number.py | 4 +- .../expected/main/openapi/modular/__init__.py | 4 +- .../main/openapi/modular/_internal.py | 34 +++--- .../main/openapi/modular/collections.py | 11 +- .../expected/main/openapi/modular/foo/bar.py | 10 +- .../expected/main/openapi/modular/models.py | 10 +- .../expected/main/openapi/modular/woo/boo.py | 10 +- .../modular_all_exports_children/__init__.py | 4 +- .../modular_all_exports_children/_internal.py | 34 +++--- .../collections.py | 11 +- .../modular_all_exports_children/foo/bar.py | 10 +- .../modular_all_exports_children/models.py | 10 +- .../modular_all_exports_children/woo/boo.py | 10 +- .../__init__.py | 4 +- .../_internal.py | 34 +++--- .../collections.py | 11 +- .../foo/bar.py | 10 +- .../models.py | 10 +- .../woo/boo.py | 10 +- .../modular_all_exports_recursive/__init__.py | 4 +- .../_internal.py | 34 +++--- .../collections.py | 11 +- .../modular_all_exports_recursive/foo/bar.py | 10 +- .../modular_all_exports_recursive/models.py | 10 +- .../modular_all_exports_recursive/woo/boo.py | 10 +- .../__init__.py | 4 +- .../_internal.py | 34 +++--- .../collections.py | 11 +- .../foo/bar.py | 10 +- .../models.py | 10 +- .../woo/boo.py | 10 +- .../modular_custom_class_name/_internal.py | 32 +++-- .../modular_custom_class_name/collections.py | 11 +- .../modular_custom_class_name/foo/bar.py | 10 +- .../modular_custom_class_name/models.py | 10 +- .../modular_custom_class_name/woo/boo.py | 10 +- .../openapi/modular_reuse_model/__init__.py | 4 +- .../openapi/modular_reuse_model/_internal.py | 28 +++-- .../modular_reuse_model/collections.py | 11 +- .../openapi/modular_reuse_model/foo/bar.py | 10 +- .../openapi/modular_reuse_model/models.py | 10 +- .../openapi/modular_reuse_model/woo/boo.py | 10 +- .../main/openapi/modular_typed_dict/models.py | 4 +- .../openapi/module_class_name_collision/A.py | 4 +- .../module_class_name_collision_deep/A/B.py | 4 +- .../expected/main/openapi/msgspec_anyof.py | 22 ++-- .../openapi/msgspec_default_object/Another.py | 6 +- .../openapi/msgspec_default_object/Nested.py | 8 +- .../msgspec_default_object/__init__.py | 10 +- .../main/openapi/msgspec_keyword_only.py | 8 +- .../msgspec_keyword_only_omit_defaults.py | 8 +- .../main/openapi/msgspec_mutual_type_alias.py | 6 +- .../expected/main/openapi/msgspec_nullable.py | 56 ++++----- .../main/openapi/msgspec_oneof_with_null.py | 28 ++--- .../expected/main/openapi/msgspec_struct.py | 42 +++---- .../main/openapi/msgspec_struct_snake_case.py | 42 +++---- ...ec_use_annotated_with_field_constraints.py | 58 +++++---- .../main/openapi/multiple_required_any_of.py | 7 +- .../namespace_subns_ref/ns/__init__.py | 4 +- .../openapi/namespace_subns_ref/ns/subns.py | 4 +- .../io/example/api/v1.py | 7 +- tests/data/expected/main/openapi/no_file.py | 18 ++- tests/data/expected/main/openapi/nullable.py | 26 ++--- .../main/openapi/nullable_strict_nullable.py | 26 ++--- .../main/openapi/oas_response_reference.py | 4 +- .../openapi_non_operations_and_security.py | 6 +- .../expected/main/openapi/openapi_webhooks.py | 10 +- .../openapi_webhooks_with_parameters.py | 4 +- .../main/openapi/override_required_all_of.py | 13 +-- .../main/openapi/paths_external_ref.py | 6 +- .../openapi/paths_ref_with_external_schema.py | 4 +- .../expected/main/openapi/pattern/general.py | 17 ++- .../main/openapi/pattern/msgspec_pattern.py | 24 ++-- .../main/openapi/pattern/pydantic_v2.py | 16 +-- .../pattern_with_lookaround_pydantic_v2.py | 4 +- ...ookaround_pydantic_v2_field_constraints.py | 4 +- .../data/expected/main/openapi/pydantic_v2.py | 18 ++- .../pydantic_v2_default_object/Another.py | 6 +- .../pydantic_v2_default_object/Nested.py | 8 +- .../pydantic_v2_default_object/__init__.py | 10 +- .../main/openapi/pyproject_not_found.py | 18 ++- .../main/openapi/read_only_write_only_all.py | 10 +- .../openapi/read_only_write_only_allof.py | 24 ++-- .../read_only_write_only_allof_order.py | 20 ++-- ..._only_write_only_allof_request_response.py | 14 +-- ...ead_only_write_only_allof_required_only.py | 10 +- .../read_only_write_only_allof_url_ref.py | 20 ++-- .../openapi/read_only_write_only_anyof.py | 10 +- .../openapi/read_only_write_only_collision.py | 8 +- .../openapi/read_only_write_only_default.py | 6 +- .../read_only_write_only_double_collision.py | 10 +- ...ead_only_write_only_duplicate_allof_ref.py | 28 +++-- .../read_only_write_only_empty_base.py | 8 +- .../openapi/read_only_write_only_mixed.py | 10 +- .../read_only_write_only_nested_allof.py | 14 +-- ...read_only_write_only_nested_allof_order.py | 20 ++-- .../main/openapi/read_only_write_only_ref.py | 6 +- .../read_only_write_only_ref_with_desc.py | 18 ++- .../read_only_write_only_request_response.py | 6 +- .../read_only_write_only_shared_base_ref.py | 42 ++++--- .../openapi/read_only_write_only_union.py | 6 +- .../openapi/read_only_write_only_url_ref.py | 10 +- .../reference_same_hierarchy_directory.py | 4 +- .../openapi/reference_to_object_properties.py | 20 ++-- ..._object_properties_collapse_root_models.py | 20 ++-- .../main/openapi/referenced_default.py | 6 +- .../referenced_default_use_annotated.py | 6 +- .../main/openapi/same_name_objects.py | 6 +- .../expected/main/openapi/shadowed_imports.py | 5 +- .../expected/main/openapi/subclass_enum.py | 3 +- .../main/openapi/target_python_version.py | 18 ++- ...thon_version_313_has_future_annotations.py | 18 ++- ...ython_version_314_no_future_annotations.py | 18 ++- .../data/expected/main/openapi/type_alias.py | 16 ++- .../type_alias_forward_ref_multiple.py | 6 +- .../openapi/type_alias_mutual_recursive.py | 6 +- .../expected/main/openapi/type_alias_py312.py | 14 +-- .../main/openapi/type_alias_recursive.py | 22 ++-- .../openapi/type_alias_recursive_py311.py | 22 ++-- .../main/openapi/typed_dict_nullable.py | 10 +- .../typed_dict_nullable_strict_nullable.py | 18 +-- .../unique_items_default_set_dataclass.py | 7 +- .../unique_items_default_set_msgspec.py | 8 +- .../unique_items_default_set_pydantic.py | 8 +- .../unique_items_default_set_pydantic_v2.py | 8 +- .../expected/main/openapi/unquoted_null.py | 4 +- .../main/openapi/unsorted_optional_fields.py | 3 +- .../use_annotated_with_field_constraints.py | 30 ++--- ...ated_with_field_constraints_pydantic_v2.py | 30 ++--- .../data/expected/main/openapi/use_default.py | 20 ++-- .../main/openapi/use_default_kwarg.py | 26 ++--- .../main/openapi/use_operation_id_as_name.py | 20 ++-- .../use_standard_collections/__init__.py | 4 +- .../use_standard_collections/_internal.py | 34 +++--- .../use_standard_collections/collections.py | 11 +- .../use_standard_collections/foo/bar.py | 10 +- .../use_standard_collections/models.py | 10 +- .../use_standard_collections/woo/boo.py | 10 +- .../use_status_code_in_response_name.py | 12 +- .../expected/main/openapi/with_aliases.py | 18 ++- .../main/openapi/with_aliases_msgspec.py | 42 +++---- .../expected/main/openapi/with_exclusive.py | 10 +- .../main/openapi/with_field_constraints.py | 30 +++-- .../with_field_constraints_pydantic_v2.py | 30 +++-- ...pydantic_v2_use_generic_container_types.py | 29 +++-- ...ntic_v2_use_generic_container_types_set.py | 29 +++-- ...ts_pydantic_v2_use_standard_collections.py | 30 +++-- ...ydantic_v2_use_standard_collections_set.py | 30 +++-- ...eld_constraints_use_unique_items_as_set.py | 30 +++-- .../main/openapi/with_snake_case_field.py | 18 ++- .../main/openapi/with_strip_default_none.py | 18 ++- .../main/openapi/without_field_constraints.py | 30 +++-- .../without_field_constraints_pydantic_v2.py | 30 +++-- tests/data/expected/main/skip_root_model.py | 4 +- .../expected/main/use_attribute_docstrings.py | 4 +- .../main_kr/custom_file_header/with_option.py | 4 +- .../data/expected/main_kr/encoding/output.py | 6 +- .../expected/main_kr/formatters/output.py | 8 +- .../main_kr/ignore_pyproject/output.py | 6 +- .../main_kr/include_path_parameters/output.py | 10 +- .../expected/main_kr/input_output/output.py | 8 +- tests/data/expected/main_kr/main/output.py | 18 ++- .../output.py | 4 +- .../main_kr/main_base_class/output.py | 18 ++- .../main_custom_template_dir/output.py | 18 ++- .../expected/main_kr/main_modular/__init__.py | 4 +- .../main_kr/main_modular/_internal.py | 34 +++--- .../main_kr/main_modular/collections.py | 11 +- .../expected/main_kr/main_modular/foo/bar.py | 10 +- .../expected/main_kr/main_modular/models.py | 10 +- .../expected/main_kr/main_modular/woo/boo.py | 10 +- .../expected/main_kr/main_no_file/output.py | 18 ++- .../main_use_field_description/output.py | 18 ++- .../output.py | 18 ++- .../main_use_schema_description/output.py | 18 ++- .../expected/main_kr/no_alias/with_option.py | 4 +- .../main_kr/pyproject/output.strictstr.py | 18 ++- .../pyproject_profile/ignore_pyproject.py | 6 +- .../pyproject_profile/inherits_base.py | 4 +- .../pyproject_profile/shallow_merge.py | 4 +- .../main_kr/pyproject_profile/with_profile.py | 6 +- .../main_kr/target_python_version/output.py | 18 ++- .../main_kr/target_python_version/py310.py | 10 +- .../main_kr/url_with_headers/output.py | 8 +- .../use_decimal_for_multiple_of/output.py | 10 +- .../use_non_positive_negative/output.py | 10 +- .../expected/main_kr/use_pendulum/output.py | 6 +- .../parser/graphql/field-default-enum.py | 8 +- .../parser/graphql/union-aliased-bug.py | 8 +- .../parser/graphql/union-commented.py | 8 +- tests/main/jsonschema/test_main_jsonschema.py | 40 +++---- 541 files changed, 3016 insertions(+), 3705 deletions(-) diff --git a/src/datamodel_code_generator/__init__.py b/src/datamodel_code_generator/__init__.py index e5cb32b47..6b61d92c1 100644 --- a/src/datamodel_code_generator/__init__.py +++ b/src/datamodel_code_generator/__init__.py @@ -448,7 +448,7 @@ def generate( # noqa: PLR0912, PLR0913, PLR0914, PLR0915 use_decimal_for_multiple_of: bool = False, original_field_name_delimiter: str | None = None, use_double_quotes: bool = False, - use_union_operator: bool = False, + use_union_operator: bool = True, collapse_root_models: bool = False, skip_root_model: bool = False, use_type_alias: bool = False, diff --git a/src/datamodel_code_generator/__main__.py b/src/datamodel_code_generator/__main__.py index 8fb76e497..02d6fc74d 100644 --- a/src/datamodel_code_generator/__main__.py +++ b/src/datamodel_code_generator/__main__.py @@ -413,7 +413,7 @@ def validate_all_exports_collision_strategy(cls, values: dict[str, Any]) -> dict use_specialized_enum: bool = True strict_nullable: bool = False use_generic_container_types: bool = False - use_union_operator: bool = False + use_union_operator: bool = True enable_faux_immutability: bool = False url: Optional[ParseResult] = None # noqa: UP045 disable_appending_item_suffix: bool = False diff --git a/src/datamodel_code_generator/arguments.py b/src/datamodel_code_generator/arguments.py index f41610ad1..d6ad800f5 100644 --- a/src/datamodel_code_generator/arguments.py +++ b/src/datamodel_code_generator/arguments.py @@ -436,8 +436,8 @@ def start_section(self, heading: str | None) -> None: ) typing_options.add_argument( "--use-union-operator", - help="Use | operator for Union type (PEP 604).", - action="store_true", + help="Use | operator for Union type (PEP 604). Default: enabled", + action=BooleanOptionalAction, default=None, ) typing_options.add_argument( diff --git a/src/datamodel_code_generator/cli_options.py b/src/datamodel_code_generator/cli_options.py index 408c24cb7..22be083a7 100644 --- a/src/datamodel_code_generator/cli_options.py +++ b/src/datamodel_code_generator/cli_options.py @@ -133,7 +133,7 @@ class CLIOptionMeta: # ========================================================================== # Typing Customization # ========================================================================== - "--use-union-operator": CLIOptionMeta(name="--use-union-operator", category=OptionCategory.TYPING), + "--no-use-union-operator": CLIOptionMeta(name="--no-use-union-operator", category=OptionCategory.TYPING), "--no-use-standard-collections": CLIOptionMeta( name="--no-use-standard-collections", category=OptionCategory.TYPING ), diff --git a/tests/data/expected/main/frozen_dataclasses.py b/tests/data/expected/main/frozen_dataclasses.py index 6946ddc76..e0efb9db5 100644 --- a/tests/data/expected/main/frozen_dataclasses.py +++ b/tests/data/expected/main/frozen_dataclasses.py @@ -5,11 +5,10 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional @dataclass(frozen=True) class User: name: str age: int - email: Optional[str] = None + email: str | None = None diff --git a/tests/data/expected/main/frozen_dataclasses_keyword_only.py b/tests/data/expected/main/frozen_dataclasses_keyword_only.py index 62eb51640..de754d6ea 100644 --- a/tests/data/expected/main/frozen_dataclasses_keyword_only.py +++ b/tests/data/expected/main/frozen_dataclasses_keyword_only.py @@ -5,11 +5,10 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional @dataclass(frozen=True, kw_only=True) class User: name: str age: int - email: Optional[str] = None + email: str | None = None diff --git a/tests/data/expected/main/graphql/additional_imports.py b/tests/data/expected/main/graphql/additional_imports.py index 911123a0e..497268c61 100644 --- a/tests/data/expected/main/graphql/additional_imports.py +++ b/tests/data/expected/main/graphql/additional_imports.py @@ -5,7 +5,7 @@ from __future__ import annotations from datetime import date, datetime -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias from mymodule.myclass import MyCustomPythonClass from pydantic import BaseModel, Field @@ -38,4 +38,4 @@ class A(BaseModel): a: Date b: DateTime c: MyCustomClass - typename__: Optional[Literal['A']] = Field('A', alias='__typename') + typename__: Literal['A'] | None = Field('A', alias='__typename') diff --git a/tests/data/expected/main/graphql/annotated.py b/tests/data/expected/main/graphql/annotated.py index ba875e678..f86ff97ab 100644 --- a/tests/data/expected/main/graphql/annotated.py +++ b/tests/data/expected/main/graphql/annotated.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import BaseModel, Field from typing_extensions import TypeAliasType @@ -25,8 +25,8 @@ class A(BaseModel): field: String listField: list[String] listListField: list[list[String]] - listOptionalField: list[Optional[String]] - optionalField: Optional[String] = None - optionalListField: Optional[list[String]] = None - optionalListOptionalField: Optional[list[Optional[String]]] = None - typename__: Annotated[Optional[Literal['A']], Field(alias='__typename')] = 'A' + listOptionalField: list[String | None] + optionalField: String | None = None + optionalListField: list[String] | None = None + optionalListOptionalField: list[String | None] | None = None + typename__: Annotated[Literal['A'] | None, Field(alias='__typename')] = 'A' diff --git a/tests/data/expected/main/graphql/annotated_field_aliases.py b/tests/data/expected/main/graphql/annotated_field_aliases.py index 67f388b21..bda775eaa 100644 --- a/tests/data/expected/main/graphql/annotated_field_aliases.py +++ b/tests/data/expected/main/graphql/annotated_field_aliases.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import BaseModel, Field from typing_extensions import TypeAliasType @@ -28,5 +28,5 @@ class DateTimePeriod(BaseModel): periodFrom: Annotated[DateTime, Field(alias='from')] periodTo: Annotated[DateTime, Field(alias='to')] typename__: Annotated[ - Optional[Literal['DateTimePeriod']], Field(alias='__typename') + Literal['DateTimePeriod'] | None, Field(alias='__typename') ] = 'DateTimePeriod' diff --git a/tests/data/expected/main/graphql/annotated_use_default_kwarg.py b/tests/data/expected/main/graphql/annotated_use_default_kwarg.py index 0771b5a28..316f6eca3 100644 --- a/tests/data/expected/main/graphql/annotated_use_default_kwarg.py +++ b/tests/data/expected/main/graphql/annotated_use_default_kwarg.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias from pydantic import BaseModel, Field @@ -24,8 +24,8 @@ class A(BaseModel): field: String listField: list[String] listListField: list[list[String]] - listOptionalField: list[Optional[String]] - optionalField: Optional[String] = None - optionalListField: Optional[list[String]] = None - optionalListOptionalField: Optional[list[Optional[String]]] = None - typename__: Optional[Literal['A']] = Field(default='A', alias='__typename') + listOptionalField: list[String | None] + optionalField: String | None = None + optionalListField: list[String] | None = None + optionalListOptionalField: list[String | None] | None = None + typename__: Literal['A'] | None = Field(default='A', alias='__typename') diff --git a/tests/data/expected/main/graphql/annotated_use_standard_collections.py b/tests/data/expected/main/graphql/annotated_use_standard_collections.py index ba875e678..f86ff97ab 100644 --- a/tests/data/expected/main/graphql/annotated_use_standard_collections.py +++ b/tests/data/expected/main/graphql/annotated_use_standard_collections.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import BaseModel, Field from typing_extensions import TypeAliasType @@ -25,8 +25,8 @@ class A(BaseModel): field: String listField: list[String] listListField: list[list[String]] - listOptionalField: list[Optional[String]] - optionalField: Optional[String] = None - optionalListField: Optional[list[String]] = None - optionalListOptionalField: Optional[list[Optional[String]]] = None - typename__: Annotated[Optional[Literal['A']], Field(alias='__typename')] = 'A' + listOptionalField: list[String | None] + optionalField: String | None = None + optionalListField: list[String] | None = None + optionalListOptionalField: list[String | None] | None = None + typename__: Annotated[Literal['A'] | None, Field(alias='__typename')] = 'A' diff --git a/tests/data/expected/main/graphql/casing.py b/tests/data/expected/main/graphql/casing.py index dc24185e2..bbc8cb587 100644 --- a/tests/data/expected/main/graphql/casing.py +++ b/tests/data/expected/main/graphql/casing.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias from pydantic import BaseModel, Field @@ -34,18 +34,18 @@ class Lowercase(Enum): class Conflict(BaseModel): Bar: Int bar: String - typename__: Optional[Literal['Conflict']] = Field('Conflict', alias='__typename') + typename__: Literal['Conflict'] | None = Field('Conflict', alias='__typename') class ConflictModel(BaseModel): Foo: Int foo: String - typename__: Optional[Literal['conflict']] = Field('conflict', alias='__typename') + typename__: Literal['conflict'] | None = Field('conflict', alias='__typename') class Lowercasetype(BaseModel): foo: Int - typename__: Optional[Literal['lowercasetype']] = Field( + typename__: Literal['lowercasetype'] | None = Field( 'lowercasetype', alias='__typename' ) @@ -55,4 +55,4 @@ class Ref(BaseModel): baz: Lowercasetype eggs: Conflict spam: ConflictModel - typename__: Optional[Literal['Ref']] = Field('Ref', alias='__typename') + typename__: Literal['Ref'] | None = Field('Ref', alias='__typename') diff --git a/tests/data/expected/main/graphql/custom_formatters.py b/tests/data/expected/main/graphql/custom_formatters.py index 914c2ef6a..ad4075839 100644 --- a/tests/data/expected/main/graphql/custom_formatters.py +++ b/tests/data/expected/main/graphql/custom_formatters.py @@ -5,7 +5,7 @@ # a comment from __future__ import annotations -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias from pydantic import BaseModel, Field @@ -33,4 +33,4 @@ class A(BaseModel): duration: Long id: ID - typename__: Optional[Literal['A']] = Field('A', alias='__typename') + typename__: Literal['A'] | None = Field('A', alias='__typename') diff --git a/tests/data/expected/main/graphql/custom_scalar_types.py b/tests/data/expected/main/graphql/custom_scalar_types.py index 0f6bc6df9..a78061287 100644 --- a/tests/data/expected/main/graphql/custom_scalar_types.py +++ b/tests/data/expected/main/graphql/custom_scalar_types.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias from pydantic import BaseModel, Field @@ -32,4 +32,4 @@ class A(BaseModel): duration: Long id: ID - typename__: Optional[Literal['A']] = Field('A', alias='__typename') + typename__: Literal['A'] | None = Field('A', alias='__typename') diff --git a/tests/data/expected/main/graphql/different_types_of_fields.py b/tests/data/expected/main/graphql/different_types_of_fields.py index 380c0e87c..c3843dad2 100644 --- a/tests/data/expected/main/graphql/different_types_of_fields.py +++ b/tests/data/expected/main/graphql/different_types_of_fields.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias from pydantic import BaseModel, Field @@ -24,16 +24,16 @@ class A(BaseModel): field: String listField: list[String] listListField: list[list[String]] - listListOptionalField: list[list[Optional[String]]] - listOptionalField: list[Optional[String]] - listOptionalListField: list[Optional[list[String]]] - listOptionalListOptionalField: list[Optional[list[Optional[String]]]] - optionalField: Optional[String] = None - optionalListListField: Optional[list[list[String]]] = None - optionalListListOptionalField: Optional[list[list[Optional[String]]]] = None - optionalListOptionalField: Optional[list[Optional[String]]] = None - optionalListOptionalListField: Optional[list[Optional[list[String]]]] = None - optionalListOptionalListOptionalField: Optional[ - list[Optional[list[Optional[String]]]] - ] = None - typename__: Optional[Literal['A']] = Field('A', alias='__typename') + listListOptionalField: list[list[String | None]] + listOptionalField: list[String | None] + listOptionalListField: list[list[String] | None] + listOptionalListOptionalField: list[list[String | None] | None] + optionalField: String | None = None + optionalListListField: list[list[String]] | None = None + optionalListListOptionalField: list[list[String | None]] | None = None + optionalListOptionalField: list[String | None] | None = None + optionalListOptionalListField: list[list[String] | None] | None = None + optionalListOptionalListOptionalField: list[list[String | None] | None] | None = ( + None + ) + typename__: Literal['A'] | None = Field('A', alias='__typename') diff --git a/tests/data/expected/main/graphql/field_aliases.py b/tests/data/expected/main/graphql/field_aliases.py index 669d08aa3..f5abba448 100644 --- a/tests/data/expected/main/graphql/field_aliases.py +++ b/tests/data/expected/main/graphql/field_aliases.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias from pydantic import BaseModel, Field @@ -26,6 +26,6 @@ class DateTimePeriod(BaseModel): periodFrom: DateTime = Field(..., alias='from') periodTo: DateTime = Field(..., alias='to') - typename__: Optional[Literal['DateTimePeriod']] = Field( + typename__: Literal['DateTimePeriod'] | None = Field( 'DateTimePeriod', alias='__typename' ) diff --git a/tests/data/expected/main/graphql/simple_star_wars.py b/tests/data/expected/main/graphql/simple_star_wars.py index 0654b0321..ccd9cc8c2 100644 --- a/tests/data/expected/main/graphql/simple_star_wars.py +++ b/tests/data/expected/main/graphql/simple_star_wars.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias from pydantic import BaseModel, Field @@ -41,7 +41,7 @@ class Film(BaseModel): opening_crawl: String planets: list[Planet] planets_ids: list[ID] - producer: Optional[String] = None + producer: String | None = None release_date: String species: list[Species] species_ids: list[ID] @@ -50,108 +50,108 @@ class Film(BaseModel): title: String vehicles: list[Vehicle] vehicles_ids: list[ID] - typename__: Optional[Literal['Film']] = Field('Film', alias='__typename') + typename__: Literal['Film'] | None = Field('Film', alias='__typename') class Person(BaseModel): - birth_year: Optional[String] = None - eye_color: Optional[String] = None + birth_year: String | None = None + eye_color: String | None = None films: list[Film] films_ids: list[ID] - gender: Optional[String] = None - hair_color: Optional[String] = None - height: Optional[Int] = None - homeworld: Optional[Planet] = None - homeworld_id: Optional[ID] = None + gender: String | None = None + hair_color: String | None = None + height: Int | None = None + homeworld: Planet | None = None + homeworld_id: ID | None = None id: ID - mass: Optional[Int] = None + mass: Int | None = None name: String - skin_color: Optional[String] = None + skin_color: String | None = None species: list[Species] species_ids: list[ID] starships: list[Starship] starships_ids: list[ID] vehicles: list[Vehicle] vehicles_ids: list[ID] - typename__: Optional[Literal['Person']] = Field('Person', alias='__typename') + typename__: Literal['Person'] | None = Field('Person', alias='__typename') class Planet(BaseModel): - climate: Optional[String] = None - diameter: Optional[String] = None + climate: String | None = None + diameter: String | None = None films: list[Film] films_ids: list[ID] - gravity: Optional[String] = None + gravity: String | None = None id: ID name: String - orbital_period: Optional[String] = None - population: Optional[String] = None + orbital_period: String | None = None + population: String | None = None residents: list[Person] residents_ids: list[ID] - rotation_period: Optional[String] = None - surface_water: Optional[String] = None - terrain: Optional[String] = None - typename__: Optional[Literal['Planet']] = Field('Planet', alias='__typename') + rotation_period: String | None = None + surface_water: String | None = None + terrain: String | None = None + typename__: Literal['Planet'] | None = Field('Planet', alias='__typename') class Species(BaseModel): - average_height: Optional[String] = None - average_lifespan: Optional[String] = None - classification: Optional[String] = None - designation: Optional[String] = None - eye_colors: Optional[String] = None + average_height: String | None = None + average_lifespan: String | None = None + classification: String | None = None + designation: String | None = None + eye_colors: String | None = None films: list[Film] films_ids: list[ID] - hair_colors: Optional[String] = None + hair_colors: String | None = None id: ID - language: Optional[String] = None + language: String | None = None name: String people: list[Person] people_ids: list[ID] - skin_colors: Optional[String] = None - typename__: Optional[Literal['Species']] = Field('Species', alias='__typename') + skin_colors: String | None = None + typename__: Literal['Species'] | None = Field('Species', alias='__typename') class Starship(BaseModel): - MGLT: Optional[String] = None - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None + MGLT: String | None = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None films: list[Film] films_ids: list[ID] - hyperdrive_rating: Optional[String] = None + hyperdrive_rating: String | None = None id: ID - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None name: String - passengers: Optional[String] = None + passengers: String | None = None pilots: list[Person] pilots_ids: list[ID] - starship_class: Optional[String] = None - typename__: Optional[Literal['Starship']] = Field('Starship', alias='__typename') + starship_class: String | None = None + typename__: Literal['Starship'] | None = Field('Starship', alias='__typename') class Vehicle(BaseModel): - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None films: list[Film] films_ids: list[ID] id: ID - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None name: String - passengers: Optional[String] = None + passengers: String | None = None pilots: list[Person] pilots_ids: list[ID] - vehicle_class: Optional[String] = None - typename__: Optional[Literal['Vehicle']] = Field('Vehicle', alias='__typename') + vehicle_class: String | None = None + typename__: Literal['Vehicle'] | None = Field('Vehicle', alias='__typename') Film.update_forward_refs() diff --git a/tests/data/expected/main/graphql/simple_star_wars_dataclass.py b/tests/data/expected/main/graphql/simple_star_wars_dataclass.py index 73f90affd..8fa8d3d0f 100644 --- a/tests/data/expected/main/graphql/simple_star_wars_dataclass.py +++ b/tests/data/expected/main/graphql/simple_star_wars_dataclass.py @@ -5,7 +5,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias Boolean: TypeAlias = bool """ @@ -49,8 +49,8 @@ class Film: title: String vehicles: list[Vehicle] vehicles_ids: list[ID] - producer: Optional[String] = None - typename__: Optional[Literal['Film']] = 'Film' + producer: String | None = None + typename__: Literal['Film'] | None = 'Film' @dataclass @@ -65,16 +65,16 @@ class Person: starships_ids: list[ID] vehicles: list[Vehicle] vehicles_ids: list[ID] - birth_year: Optional[String] = None - eye_color: Optional[String] = None - gender: Optional[String] = None - hair_color: Optional[String] = None - height: Optional[Int] = None - homeworld: Optional[Planet] = None - homeworld_id: Optional[ID] = None - mass: Optional[Int] = None - skin_color: Optional[String] = None - typename__: Optional[Literal['Person']] = 'Person' + birth_year: String | None = None + eye_color: String | None = None + gender: String | None = None + hair_color: String | None = None + height: Int | None = None + homeworld: Planet | None = None + homeworld_id: ID | None = None + mass: Int | None = None + skin_color: String | None = None + typename__: Literal['Person'] | None = 'Person' @dataclass @@ -85,15 +85,15 @@ class Planet: name: String residents: list[Person] residents_ids: list[ID] - climate: Optional[String] = None - diameter: Optional[String] = None - gravity: Optional[String] = None - orbital_period: Optional[String] = None - population: Optional[String] = None - rotation_period: Optional[String] = None - surface_water: Optional[String] = None - terrain: Optional[String] = None - typename__: Optional[Literal['Planet']] = 'Planet' + climate: String | None = None + diameter: String | None = None + gravity: String | None = None + orbital_period: String | None = None + population: String | None = None + rotation_period: String | None = None + surface_water: String | None = None + terrain: String | None = None + typename__: Literal['Planet'] | None = 'Planet' @dataclass @@ -104,15 +104,15 @@ class Species: name: String people: list[Person] people_ids: list[ID] - average_height: Optional[String] = None - average_lifespan: Optional[String] = None - classification: Optional[String] = None - designation: Optional[String] = None - eye_colors: Optional[String] = None - hair_colors: Optional[String] = None - language: Optional[String] = None - skin_colors: Optional[String] = None - typename__: Optional[Literal['Species']] = 'Species' + average_height: String | None = None + average_lifespan: String | None = None + classification: String | None = None + designation: String | None = None + eye_colors: String | None = None + hair_colors: String | None = None + language: String | None = None + skin_colors: String | None = None + typename__: Literal['Species'] | None = 'Species' @dataclass @@ -123,19 +123,19 @@ class Starship: name: String pilots: list[Person] pilots_ids: list[ID] - MGLT: Optional[String] = None - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - hyperdrive_rating: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - starship_class: Optional[String] = None - typename__: Optional[Literal['Starship']] = 'Starship' + MGLT: String | None = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + hyperdrive_rating: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + starship_class: String | None = None + typename__: Literal['Starship'] | None = 'Starship' @dataclass @@ -146,14 +146,14 @@ class Vehicle: name: String pilots: list[Person] pilots_ids: list[ID] - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - vehicle_class: Optional[String] = None - typename__: Optional[Literal['Vehicle']] = 'Vehicle' + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + vehicle_class: String | None = None + typename__: Literal['Vehicle'] | None = 'Vehicle' diff --git a/tests/data/expected/main/graphql/simple_star_wars_dataclass_arguments.py b/tests/data/expected/main/graphql/simple_star_wars_dataclass_arguments.py index 717ce2966..9df4fe776 100644 --- a/tests/data/expected/main/graphql/simple_star_wars_dataclass_arguments.py +++ b/tests/data/expected/main/graphql/simple_star_wars_dataclass_arguments.py @@ -5,7 +5,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias Boolean: TypeAlias = bool """ @@ -49,8 +49,8 @@ class Film: title: String vehicles: list[Vehicle] vehicles_ids: list[ID] - producer: Optional[String] = None - typename__: Optional[Literal['Film']] = 'Film' + producer: String | None = None + typename__: Literal['Film'] | None = 'Film' @dataclass(order=True, slots=True) @@ -65,16 +65,16 @@ class Person: starships_ids: list[ID] vehicles: list[Vehicle] vehicles_ids: list[ID] - birth_year: Optional[String] = None - eye_color: Optional[String] = None - gender: Optional[String] = None - hair_color: Optional[String] = None - height: Optional[Int] = None - homeworld: Optional[Planet] = None - homeworld_id: Optional[ID] = None - mass: Optional[Int] = None - skin_color: Optional[String] = None - typename__: Optional[Literal['Person']] = 'Person' + birth_year: String | None = None + eye_color: String | None = None + gender: String | None = None + hair_color: String | None = None + height: Int | None = None + homeworld: Planet | None = None + homeworld_id: ID | None = None + mass: Int | None = None + skin_color: String | None = None + typename__: Literal['Person'] | None = 'Person' @dataclass(order=True, slots=True) @@ -85,15 +85,15 @@ class Planet: name: String residents: list[Person] residents_ids: list[ID] - climate: Optional[String] = None - diameter: Optional[String] = None - gravity: Optional[String] = None - orbital_period: Optional[String] = None - population: Optional[String] = None - rotation_period: Optional[String] = None - surface_water: Optional[String] = None - terrain: Optional[String] = None - typename__: Optional[Literal['Planet']] = 'Planet' + climate: String | None = None + diameter: String | None = None + gravity: String | None = None + orbital_period: String | None = None + population: String | None = None + rotation_period: String | None = None + surface_water: String | None = None + terrain: String | None = None + typename__: Literal['Planet'] | None = 'Planet' @dataclass(order=True, slots=True) @@ -104,15 +104,15 @@ class Species: name: String people: list[Person] people_ids: list[ID] - average_height: Optional[String] = None - average_lifespan: Optional[String] = None - classification: Optional[String] = None - designation: Optional[String] = None - eye_colors: Optional[String] = None - hair_colors: Optional[String] = None - language: Optional[String] = None - skin_colors: Optional[String] = None - typename__: Optional[Literal['Species']] = 'Species' + average_height: String | None = None + average_lifespan: String | None = None + classification: String | None = None + designation: String | None = None + eye_colors: String | None = None + hair_colors: String | None = None + language: String | None = None + skin_colors: String | None = None + typename__: Literal['Species'] | None = 'Species' @dataclass(order=True, slots=True) @@ -123,19 +123,19 @@ class Starship: name: String pilots: list[Person] pilots_ids: list[ID] - MGLT: Optional[String] = None - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - hyperdrive_rating: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - starship_class: Optional[String] = None - typename__: Optional[Literal['Starship']] = 'Starship' + MGLT: String | None = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + hyperdrive_rating: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + starship_class: String | None = None + typename__: Literal['Starship'] | None = 'Starship' @dataclass(order=True, slots=True) @@ -146,14 +146,14 @@ class Vehicle: name: String pilots: list[Person] pilots_ids: list[ID] - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - vehicle_class: Optional[String] = None - typename__: Optional[Literal['Vehicle']] = 'Vehicle' + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + vehicle_class: String | None = None + typename__: Literal['Vehicle'] | None = 'Vehicle' diff --git a/tests/data/expected/main/graphql/simple_star_wars_dataclass_frozen_kw_only.py b/tests/data/expected/main/graphql/simple_star_wars_dataclass_frozen_kw_only.py index 4f304026d..24d920fa6 100644 --- a/tests/data/expected/main/graphql/simple_star_wars_dataclass_frozen_kw_only.py +++ b/tests/data/expected/main/graphql/simple_star_wars_dataclass_frozen_kw_only.py @@ -5,7 +5,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias Boolean: TypeAlias = bool """ @@ -49,8 +49,8 @@ class Film: title: String vehicles: list[Vehicle] vehicles_ids: list[ID] - producer: Optional[String] = None - typename__: Optional[Literal['Film']] = 'Film' + producer: String | None = None + typename__: Literal['Film'] | None = 'Film' @dataclass(frozen=True, kw_only=True) @@ -65,16 +65,16 @@ class Person: starships_ids: list[ID] vehicles: list[Vehicle] vehicles_ids: list[ID] - birth_year: Optional[String] = None - eye_color: Optional[String] = None - gender: Optional[String] = None - hair_color: Optional[String] = None - height: Optional[Int] = None - homeworld: Optional[Planet] = None - homeworld_id: Optional[ID] = None - mass: Optional[Int] = None - skin_color: Optional[String] = None - typename__: Optional[Literal['Person']] = 'Person' + birth_year: String | None = None + eye_color: String | None = None + gender: String | None = None + hair_color: String | None = None + height: Int | None = None + homeworld: Planet | None = None + homeworld_id: ID | None = None + mass: Int | None = None + skin_color: String | None = None + typename__: Literal['Person'] | None = 'Person' @dataclass(frozen=True, kw_only=True) @@ -85,15 +85,15 @@ class Planet: name: String residents: list[Person] residents_ids: list[ID] - climate: Optional[String] = None - diameter: Optional[String] = None - gravity: Optional[String] = None - orbital_period: Optional[String] = None - population: Optional[String] = None - rotation_period: Optional[String] = None - surface_water: Optional[String] = None - terrain: Optional[String] = None - typename__: Optional[Literal['Planet']] = 'Planet' + climate: String | None = None + diameter: String | None = None + gravity: String | None = None + orbital_period: String | None = None + population: String | None = None + rotation_period: String | None = None + surface_water: String | None = None + terrain: String | None = None + typename__: Literal['Planet'] | None = 'Planet' @dataclass(frozen=True, kw_only=True) @@ -104,15 +104,15 @@ class Species: name: String people: list[Person] people_ids: list[ID] - average_height: Optional[String] = None - average_lifespan: Optional[String] = None - classification: Optional[String] = None - designation: Optional[String] = None - eye_colors: Optional[String] = None - hair_colors: Optional[String] = None - language: Optional[String] = None - skin_colors: Optional[String] = None - typename__: Optional[Literal['Species']] = 'Species' + average_height: String | None = None + average_lifespan: String | None = None + classification: String | None = None + designation: String | None = None + eye_colors: String | None = None + hair_colors: String | None = None + language: String | None = None + skin_colors: String | None = None + typename__: Literal['Species'] | None = 'Species' @dataclass(frozen=True, kw_only=True) @@ -123,19 +123,19 @@ class Starship: name: String pilots: list[Person] pilots_ids: list[ID] - MGLT: Optional[String] = None - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - hyperdrive_rating: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - starship_class: Optional[String] = None - typename__: Optional[Literal['Starship']] = 'Starship' + MGLT: String | None = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + hyperdrive_rating: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + starship_class: String | None = None + typename__: Literal['Starship'] | None = 'Starship' @dataclass(frozen=True, kw_only=True) @@ -146,14 +146,14 @@ class Vehicle: name: String pilots: list[Person] pilots_ids: list[ID] - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - vehicle_class: Optional[String] = None - typename__: Optional[Literal['Vehicle']] = 'Vehicle' + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + vehicle_class: String | None = None + typename__: Literal['Vehicle'] | None = 'Vehicle' diff --git a/tests/data/expected/main/graphql/simple_star_wars_extra_fields_allow.py b/tests/data/expected/main/graphql/simple_star_wars_extra_fields_allow.py index 45903d199..b479c8737 100644 --- a/tests/data/expected/main/graphql/simple_star_wars_extra_fields_allow.py +++ b/tests/data/expected/main/graphql/simple_star_wars_extra_fields_allow.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias from pydantic import BaseModel, Extra, Field @@ -44,7 +44,7 @@ class Config: opening_crawl: String planets: list[Planet] planets_ids: list[ID] - producer: Optional[String] = None + producer: String | None = None release_date: String species: list[Species] species_ids: list[ID] @@ -53,123 +53,123 @@ class Config: title: String vehicles: list[Vehicle] vehicles_ids: list[ID] - typename__: Optional[Literal['Film']] = Field('Film', alias='__typename') + typename__: Literal['Film'] | None = Field('Film', alias='__typename') class Person(BaseModel): class Config: extra = Extra.allow - birth_year: Optional[String] = None - eye_color: Optional[String] = None + birth_year: String | None = None + eye_color: String | None = None films: list[Film] films_ids: list[ID] - gender: Optional[String] = None - hair_color: Optional[String] = None - height: Optional[Int] = None - homeworld: Optional[Planet] = None - homeworld_id: Optional[ID] = None + gender: String | None = None + hair_color: String | None = None + height: Int | None = None + homeworld: Planet | None = None + homeworld_id: ID | None = None id: ID - mass: Optional[Int] = None + mass: Int | None = None name: String - skin_color: Optional[String] = None + skin_color: String | None = None species: list[Species] species_ids: list[ID] starships: list[Starship] starships_ids: list[ID] vehicles: list[Vehicle] vehicles_ids: list[ID] - typename__: Optional[Literal['Person']] = Field('Person', alias='__typename') + typename__: Literal['Person'] | None = Field('Person', alias='__typename') class Planet(BaseModel): class Config: extra = Extra.allow - climate: Optional[String] = None - diameter: Optional[String] = None + climate: String | None = None + diameter: String | None = None films: list[Film] films_ids: list[ID] - gravity: Optional[String] = None + gravity: String | None = None id: ID name: String - orbital_period: Optional[String] = None - population: Optional[String] = None + orbital_period: String | None = None + population: String | None = None residents: list[Person] residents_ids: list[ID] - rotation_period: Optional[String] = None - surface_water: Optional[String] = None - terrain: Optional[String] = None - typename__: Optional[Literal['Planet']] = Field('Planet', alias='__typename') + rotation_period: String | None = None + surface_water: String | None = None + terrain: String | None = None + typename__: Literal['Planet'] | None = Field('Planet', alias='__typename') class Species(BaseModel): class Config: extra = Extra.allow - average_height: Optional[String] = None - average_lifespan: Optional[String] = None - classification: Optional[String] = None - designation: Optional[String] = None - eye_colors: Optional[String] = None + average_height: String | None = None + average_lifespan: String | None = None + classification: String | None = None + designation: String | None = None + eye_colors: String | None = None films: list[Film] films_ids: list[ID] - hair_colors: Optional[String] = None + hair_colors: String | None = None id: ID - language: Optional[String] = None + language: String | None = None name: String people: list[Person] people_ids: list[ID] - skin_colors: Optional[String] = None - typename__: Optional[Literal['Species']] = Field('Species', alias='__typename') + skin_colors: String | None = None + typename__: Literal['Species'] | None = Field('Species', alias='__typename') class Starship(BaseModel): class Config: extra = Extra.allow - MGLT: Optional[String] = None - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None + MGLT: String | None = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None films: list[Film] films_ids: list[ID] - hyperdrive_rating: Optional[String] = None + hyperdrive_rating: String | None = None id: ID - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None name: String - passengers: Optional[String] = None + passengers: String | None = None pilots: list[Person] pilots_ids: list[ID] - starship_class: Optional[String] = None - typename__: Optional[Literal['Starship']] = Field('Starship', alias='__typename') + starship_class: String | None = None + typename__: Literal['Starship'] | None = Field('Starship', alias='__typename') class Vehicle(BaseModel): class Config: extra = Extra.allow - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None films: list[Film] films_ids: list[ID] id: ID - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None name: String - passengers: Optional[String] = None + passengers: String | None = None pilots: list[Person] pilots_ids: list[ID] - vehicle_class: Optional[String] = None - typename__: Optional[Literal['Vehicle']] = Field('Vehicle', alias='__typename') + vehicle_class: String | None = None + typename__: Literal['Vehicle'] | None = Field('Vehicle', alias='__typename') Film.update_forward_refs() diff --git a/tests/data/expected/main/graphql/type_alias.py b/tests/data/expected/main/graphql/type_alias.py index c811d6764..bf84246d7 100644 --- a/tests/data/expected/main/graphql/type_alias.py +++ b/tests/data/expected/main/graphql/type_alias.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, TypeAlias, Union +from typing import Literal, TypeAlias, Union from pydantic import BaseModel, Field @@ -32,13 +32,13 @@ class Person(BaseModel): age: Int name: String - typename__: Optional[Literal['Person']] = Field('Person', alias='__typename') + typename__: Literal['Person'] | None = Field('Person', alias='__typename') class Pet(BaseModel): name: String type: String - typename__: Optional[Literal['Pet']] = Field('Pet', alias='__typename') + typename__: Literal['Pet'] | None = Field('Pet', alias='__typename') UnionType: TypeAlias = Union[ @@ -48,9 +48,9 @@ class Pet(BaseModel): class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - string_field: Optional[String] = None - union_field: Optional[UnionType] = None - typename__: Optional[Literal['ModelWithTypeAliasField']] = Field( + simple_field: SimpleString | None = None + string_field: String | None = None + union_field: UnionType | None = None + typename__: Literal['ModelWithTypeAliasField'] | None = Field( 'ModelWithTypeAliasField', alias='__typename' ) diff --git a/tests/data/expected/main/graphql/type_alias_py312.py b/tests/data/expected/main/graphql/type_alias_py312.py index b0b8fdedb..cc7dc4aa8 100644 --- a/tests/data/expected/main/graphql/type_alias_py312.py +++ b/tests/data/expected/main/graphql/type_alias_py312.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, Union +from typing import Literal, Union from pydantic import BaseModel, Field @@ -32,13 +32,13 @@ class Person(BaseModel): age: Int name: String - typename__: Optional[Literal['Person']] = Field('Person', alias='__typename') + typename__: Literal['Person'] | None = Field('Person', alias='__typename') class Pet(BaseModel): name: String type: String - typename__: Optional[Literal['Pet']] = Field('Pet', alias='__typename') + typename__: Literal['Pet'] | None = Field('Pet', alias='__typename') type UnionType = Union[ @@ -48,9 +48,9 @@ class Pet(BaseModel): class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - string_field: Optional[String] = None - union_field: Optional[UnionType] = None - typename__: Optional[Literal['ModelWithTypeAliasField']] = Field( + simple_field: SimpleString | None = None + string_field: String | None = None + union_field: UnionType | None = None + typename__: Literal['ModelWithTypeAliasField'] | None = Field( 'ModelWithTypeAliasField', alias='__typename' ) diff --git a/tests/data/expected/main/graphql/union.py b/tests/data/expected/main/graphql/union.py index b0e208887..e66cd2180 100644 --- a/tests/data/expected/main/graphql/union.py +++ b/tests/data/expected/main/graphql/union.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, TypeAlias, Union +from typing import Literal, TypeAlias, Union from pydantic import BaseModel, Field @@ -34,20 +34,20 @@ class IResource(BaseModel): id: ID - typename__: Optional[Literal['IResource']] = Field('IResource', alias='__typename') + typename__: Literal['IResource'] | None = Field('IResource', alias='__typename') class Car(IResource): id: ID passengerCapacity: Int - typename__: Optional[Literal['Car']] = Field('Car', alias='__typename') + typename__: Literal['Car'] | None = Field('Car', alias='__typename') class Employee(IResource): - firstName: Optional[String] = None + firstName: String | None = None id: ID - lastName: Optional[String] = None - typename__: Optional[Literal['Employee']] = Field('Employee', alias='__typename') + lastName: String | None = None + typename__: Literal['Employee'] | None = Field('Employee', alias='__typename') Resource: TypeAlias = Union[ diff --git a/tests/data/expected/main/graphql/use_standard_collections.py b/tests/data/expected/main/graphql/use_standard_collections.py index c89f239cb..3c228bae0 100644 --- a/tests/data/expected/main/graphql/use_standard_collections.py +++ b/tests/data/expected/main/graphql/use_standard_collections.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, TypeAlias +from typing import Literal, TypeAlias from pydantic import BaseModel, Field @@ -24,4 +24,4 @@ class A(BaseModel): field: String listField: list[String] listListField: list[list[String]] - typename__: Optional[Literal['A']] = Field('A', alias='__typename') + typename__: Literal['A'] | None = Field('A', alias='__typename') diff --git a/tests/data/expected/main/json/json_array_include_null.py b/tests/data/expected/main/json/json_array_include_null.py index e55c0163f..2134e5417 100644 --- a/tests/data/expected/main/json/json_array_include_null.py +++ b/tests/data/expected/main/json/json_array_include_null.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Item(BaseModel): - oofield: Optional[list[int]] + oofield: list[int] | None class Model(BaseModel): diff --git a/tests/data/expected/main/jsonschema/alias_import_alias/date_schema.py b/tests/data/expected/main/jsonschema/alias_import_alias/date_schema.py index 61206a474..4621e9e36 100644 --- a/tests/data/expected/main/jsonschema/alias_import_alias/date_schema.py +++ b/tests/data/expected/main/jsonschema/alias_import_alias/date_schema.py @@ -6,11 +6,10 @@ from datetime import date as date_aliased from datetime import datetime as datetime_aliased -from typing import Optional from pydantic import BaseModel class TypeDate(BaseModel): - date: Optional[date_aliased] - datetime: Optional[datetime_aliased] = None + date: date_aliased | None + datetime: datetime_aliased | None = None diff --git a/tests/data/expected/main/jsonschema/all_of_any_of/direct.py b/tests/data/expected/main/jsonschema/all_of_any_of/direct.py index 46e796061..3de99b09e 100644 --- a/tests/data/expected/main/jsonschema/all_of_any_of/direct.py +++ b/tests/data/expected/main/jsonschema/all_of_any_of/direct.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Union +from typing import Any from pydantic import BaseModel @@ -34,4 +34,4 @@ class Target5(Target2, Target3): class Target(BaseModel): - __root__: Union[Target4, Target5] + __root__: Target4 | Target5 diff --git a/tests/data/expected/main/jsonschema/all_of_any_of/reference.py b/tests/data/expected/main/jsonschema/all_of_any_of/reference.py index 26640ab69..95e007e0e 100644 --- a/tests/data/expected/main/jsonschema/all_of_any_of/reference.py +++ b/tests/data/expected/main/jsonschema/all_of_any_of/reference.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Union +from typing import Any from pydantic import BaseModel @@ -34,4 +34,4 @@ class Target9(Second, Target): class Target6(BaseModel): - __root__: Union[Target8, Target9] + __root__: Target8 | Target9 diff --git a/tests/data/expected/main/jsonschema/all_of_any_of_base_class_ref.py b/tests/data/expected/main/jsonschema/all_of_any_of_base_class_ref.py index 1ecb4a67c..95485b283 100644 --- a/tests/data/expected/main/jsonschema/all_of_any_of_base_class_ref.py +++ b/tests/data/expected/main/jsonschema/all_of_any_of_base_class_ref.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, Field, confloat @@ -16,10 +14,10 @@ class MapState1(BaseModel): class MapState2(BaseModel): latitude: Latitude longitude: Longitude - zoom: Optional[Zoom] = Field(default_factory=lambda: Zoom.parse_obj(0)) - bearing: Optional[Bearing] = None + zoom: Zoom | None = Field(default_factory=lambda: Zoom.parse_obj(0)) + bearing: Bearing | None = None pitch: Pitch - drag_rotate: Optional[DragRotate] = Field(None, alias="dragRotate") + drag_rotate: DragRotate | None = Field(None, alias="dragRotate") map_split_mode: str = Field("SWIPE_COMPARE", alias="mapSplitMode", const=True) is_split: bool = Field(True, alias="isSplit", const=True) @@ -45,7 +43,7 @@ class MapState7(MapState5): class MapState(BaseModel): - __root__: Union[MapState4, MapState5, MapState6, MapState7] = Field( + __root__: MapState4 | MapState5 | MapState6 | MapState7 = Field( ..., title="MapState" ) diff --git a/tests/data/expected/main/jsonschema/all_of_merge_boolean_property.py b/tests/data/expected/main/jsonschema/all_of_merge_boolean_property.py index 5db783306..7a3574551 100644 --- a/tests/data/expected/main/jsonschema/all_of_merge_boolean_property.py +++ b/tests/data/expected/main/jsonschema/all_of_merge_boolean_property.py @@ -4,22 +4,22 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Model(BaseModel): - data: Optional[Any] = None + data: Any | None = None class Data(BaseModel): - value: Optional[str] = None + value: str | None = None class Base1(BaseModel): - data: Optional[Data] = None + data: Data | None = None class Base2(BaseModel): - data: Optional[Any] = None + data: Any | None = None diff --git a/tests/data/expected/main/jsonschema/all_of_merge_same_property.py b/tests/data/expected/main/jsonschema/all_of_merge_same_property.py index 40ee1a7b7..c4cf766bd 100644 --- a/tests/data/expected/main/jsonschema/all_of_merge_same_property.py +++ b/tests/data/expected/main/jsonschema/all_of_merge_same_property.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Links(BaseModel): - self: Optional[str] = None - collection: Optional[str] = None + self: str | None = None + collection: str | None = None class Model(BaseModel): @@ -19,7 +17,7 @@ class Model(BaseModel): class Links1(BaseModel): - self: Optional[str] = None + self: str | None = None class SelfLink(BaseModel): @@ -27,7 +25,7 @@ class SelfLink(BaseModel): class Links2(BaseModel): - collection: Optional[str] = None + collection: str | None = None class CollectionLink(BaseModel): diff --git a/tests/data/expected/main/jsonschema/all_of_one_of/direct.py b/tests/data/expected/main/jsonschema/all_of_one_of/direct.py index 46e796061..3de99b09e 100644 --- a/tests/data/expected/main/jsonschema/all_of_one_of/direct.py +++ b/tests/data/expected/main/jsonschema/all_of_one_of/direct.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Union +from typing import Any from pydantic import BaseModel @@ -34,4 +34,4 @@ class Target5(Target2, Target3): class Target(BaseModel): - __root__: Union[Target4, Target5] + __root__: Target4 | Target5 diff --git a/tests/data/expected/main/jsonschema/all_of_one_of/reference.py b/tests/data/expected/main/jsonschema/all_of_one_of/reference.py index 26640ab69..95e007e0e 100644 --- a/tests/data/expected/main/jsonschema/all_of_one_of/reference.py +++ b/tests/data/expected/main/jsonschema/all_of_one_of/reference.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Union +from typing import Any from pydantic import BaseModel @@ -34,4 +34,4 @@ class Target9(Second, Target): class Target6(BaseModel): - __root__: Union[Target8, Target9] + __root__: Target8 | Target9 diff --git a/tests/data/expected/main/jsonschema/all_of_ref_self.py b/tests/data/expected/main/jsonschema/all_of_ref_self.py index cd67eb8f5..d1ca519ef 100644 --- a/tests/data/expected/main/jsonschema/all_of_ref_self.py +++ b/tests/data/expected/main/jsonschema/all_of_ref_self.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel @@ -14,4 +12,4 @@ class Version(BaseModel): class Model(BaseModel): - version: Optional[Version] = None + version: Version | None = None diff --git a/tests/data/expected/main/jsonschema/all_of_ref_with_property_override.py b/tests/data/expected/main/jsonschema/all_of_ref_with_property_override.py index 75876318e..4557f0942 100644 --- a/tests/data/expected/main/jsonschema/all_of_ref_with_property_override.py +++ b/tests/data/expected/main/jsonschema/all_of_ref_with_property_override.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, constr @@ -15,6 +13,6 @@ class Thing(BaseModel): class Person(Thing): - type: Optional[str] = 'playground:Person' - name: Optional[constr(min_length=1)] = None - age: Optional[int] = None + type: str | None = 'playground:Person' + name: constr(min_length=1) | None = None + age: int | None = None diff --git a/tests/data/expected/main/jsonschema/all_of_use_default.py b/tests/data/expected/main/jsonschema/all_of_use_default.py index 86988f6ec..d69714287 100644 --- a/tests/data/expected/main/jsonschema/all_of_use_default.py +++ b/tests/data/expected/main/jsonschema/all_of_use_default.py @@ -4,11 +4,9 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Item(BaseModel): - test: Optional[str] = 'test123' - testarray: Optional[list[str]] = Field(['test123'], min_items=1, title='test array') + test: str | None = 'test123' + testarray: list[str] | None = Field(['test123'], min_items=1, title='test array') diff --git a/tests/data/expected/main/jsonschema/all_of_with_object.py b/tests/data/expected/main/jsonschema/all_of_with_object.py index ffd41493d..c57c4610c 100644 --- a/tests/data/expected/main/jsonschema/all_of_with_object.py +++ b/tests/data/expected/main/jsonschema/all_of_with_object.py @@ -4,24 +4,22 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Home(BaseModel): - address: Optional[str] = None - zip: Optional[str] = None + address: str | None = None + zip: str | None = None class Kind(BaseModel): - description: Optional[str] = None + description: str | None = None class Id(BaseModel): - id: Optional[int] = None + id: int | None = None class Pet(Home, Kind, Id): - name: Optional[str] = None - age: Optional[int] = None + name: str | None = None + age: int | None = None diff --git a/tests/data/expected/main/jsonschema/allof_root_model_constraints.py b/tests/data/expected/main/jsonschema/allof_root_model_constraints.py index e7e2356d2..a69bd9fa0 100644 --- a/tests/data/expected/main/jsonschema/allof_root_model_constraints.py +++ b/tests/data/expected/main/jsonschema/allof_root_model_constraints.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, EmailStr, Field, conint, constr @@ -44,11 +44,11 @@ class FormattedStringDatatype(BaseModel): class ObjectBase(BaseModel): - id: Optional[int] = None + id: int | None = None class ObjectWithAllOf(ObjectBase): - name: Optional[str] = None + name: str | None = None class MultiRefAllOf(BaseModel): @@ -64,7 +64,7 @@ class IncompatibleTypeAllOf(BaseModel): class ConstraintWithProperties(BaseModel): - extra: Optional[str] = None + extra: str | None = None class ConstraintWithItems(BaseModel): @@ -140,23 +140,23 @@ class ConflictingFormatAllOf(BaseModel): class Model(BaseModel): - name: Optional[ConstrainedStringDatatype] = None - count: Optional[NonNegativeIntegerDatatype] = None - percentage: Optional[BoundedIntegerDatatype] = None - email: Optional[EmailDatatype] = None - obj: Optional[ObjectWithAllOf] = None - multi: Optional[MultiRefAllOf] = None - noconstraint: Optional[NoConstraintAllOf] = None - incompatible: Optional[IncompatibleTypeAllOf] = None - withprops: Optional[ConstraintWithProperties] = None - withitems: Optional[ConstraintWithItems] = None - numint: Optional[NumberIntegerCompatible] = None - refwithkw: Optional[RefWithSchemaKeywords] = None - refarr: Optional[RefToArrayAllOf] = None - refobjnoprops: Optional[RefToObjectNoPropsAllOf] = None - refpatternprops: Optional[RefToPatternPropsAllOf] = None - refnestedallof: Optional[RefToNestedAllOfAllOf] = None - refconstraintsonly: Optional[RefToConstraintsOnlyAllOf] = None - nodescription: Optional[NoDescriptionAllOf] = None - emptyconstraint: Optional[EmptyConstraintItemAllOf] = None - conflictingformat: Optional[ConflictingFormatAllOf] = None + name: ConstrainedStringDatatype | None = None + count: NonNegativeIntegerDatatype | None = None + percentage: BoundedIntegerDatatype | None = None + email: EmailDatatype | None = None + obj: ObjectWithAllOf | None = None + multi: MultiRefAllOf | None = None + noconstraint: NoConstraintAllOf | None = None + incompatible: IncompatibleTypeAllOf | None = None + withprops: ConstraintWithProperties | None = None + withitems: ConstraintWithItems | None = None + numint: NumberIntegerCompatible | None = None + refwithkw: RefWithSchemaKeywords | None = None + refarr: RefToArrayAllOf | None = None + refobjnoprops: RefToObjectNoPropsAllOf | None = None + refpatternprops: RefToPatternPropsAllOf | None = None + refnestedallof: RefToNestedAllOfAllOf | None = None + refconstraintsonly: RefToConstraintsOnlyAllOf | None = None + nodescription: NoDescriptionAllOf | None = None + emptyconstraint: EmptyConstraintItemAllOf | None = None + conflictingformat: ConflictingFormatAllOf | None = None diff --git a/tests/data/expected/main/jsonschema/allof_root_model_constraints_merge.py b/tests/data/expected/main/jsonschema/allof_root_model_constraints_merge.py index d4b1702be..9240b335b 100644 --- a/tests/data/expected/main/jsonschema/allof_root_model_constraints_merge.py +++ b/tests/data/expected/main/jsonschema/allof_root_model_constraints_merge.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, EmailStr, Field, conint, constr @@ -44,11 +44,11 @@ class FormattedStringDatatype(BaseModel): class ObjectBase(BaseModel): - id: Optional[int] = None + id: int | None = None class ObjectWithAllOf(ObjectBase): - name: Optional[str] = None + name: str | None = None class MultiRefAllOf(BaseModel): @@ -64,7 +64,7 @@ class IncompatibleTypeAllOf(BaseModel): class ConstraintWithProperties(BaseModel): - extra: Optional[str] = None + extra: str | None = None class ConstraintWithItems(BaseModel): @@ -140,23 +140,23 @@ class ConflictingFormatAllOf(BaseModel): class Model(BaseModel): - name: Optional[ConstrainedStringDatatype] = None - count: Optional[NonNegativeIntegerDatatype] = None - percentage: Optional[BoundedIntegerDatatype] = None - email: Optional[EmailDatatype] = None - obj: Optional[ObjectWithAllOf] = None - multi: Optional[MultiRefAllOf] = None - noconstraint: Optional[NoConstraintAllOf] = None - incompatible: Optional[IncompatibleTypeAllOf] = None - withprops: Optional[ConstraintWithProperties] = None - withitems: Optional[ConstraintWithItems] = None - numint: Optional[NumberIntegerCompatible] = None - refwithkw: Optional[RefWithSchemaKeywords] = None - refarr: Optional[RefToArrayAllOf] = None - refobjnoprops: Optional[RefToObjectNoPropsAllOf] = None - refpatternprops: Optional[RefToPatternPropsAllOf] = None - refnestedallof: Optional[RefToNestedAllOfAllOf] = None - refconstraintsonly: Optional[RefToConstraintsOnlyAllOf] = None - nodescription: Optional[NoDescriptionAllOf] = None - emptyconstraint: Optional[EmptyConstraintItemAllOf] = None - conflictingformat: Optional[ConflictingFormatAllOf] = None + name: ConstrainedStringDatatype | None = None + count: NonNegativeIntegerDatatype | None = None + percentage: BoundedIntegerDatatype | None = None + email: EmailDatatype | None = None + obj: ObjectWithAllOf | None = None + multi: MultiRefAllOf | None = None + noconstraint: NoConstraintAllOf | None = None + incompatible: IncompatibleTypeAllOf | None = None + withprops: ConstraintWithProperties | None = None + withitems: ConstraintWithItems | None = None + numint: NumberIntegerCompatible | None = None + refwithkw: RefWithSchemaKeywords | None = None + refarr: RefToArrayAllOf | None = None + refobjnoprops: RefToObjectNoPropsAllOf | None = None + refpatternprops: RefToPatternPropsAllOf | None = None + refnestedallof: RefToNestedAllOfAllOf | None = None + refconstraintsonly: RefToConstraintsOnlyAllOf | None = None + nodescription: NoDescriptionAllOf | None = None + emptyconstraint: EmptyConstraintItemAllOf | None = None + conflictingformat: ConflictingFormatAllOf | None = None diff --git a/tests/data/expected/main/jsonschema/anyof_const_enum_nested.py b/tests/data/expected/main/jsonschema/anyof_const_enum_nested.py index e97568a56..ea5a676f9 100644 --- a/tests/data/expected/main/jsonschema/anyof_const_enum_nested.py +++ b/tests/data/expected/main/jsonschema/anyof_const_enum_nested.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, Field @@ -21,5 +20,5 @@ class Mode1(Enum): class Config(BaseModel): - mode: Optional[Mode] = Field(None, title='Mode') - modes: Optional[list[Mode1]] = None + mode: Mode | None = Field(None, title='Mode') + modes: list[Mode1] | None = None diff --git a/tests/data/expected/main/jsonschema/anyof_const_enum_nested_literal.py b/tests/data/expected/main/jsonschema/anyof_const_enum_nested_literal.py index 43439c965..81f8d9d17 100644 --- a/tests/data/expected/main/jsonschema/anyof_const_enum_nested_literal.py +++ b/tests/data/expected/main/jsonschema/anyof_const_enum_nested_literal.py @@ -4,11 +4,11 @@ from __future__ import annotations -from typing import Literal, Optional +from typing import Literal from pydantic import BaseModel, Field class Config(BaseModel): - mode: Optional[Literal['fast', 'slow']] = Field(None, title='Mode') - modes: Optional[list[Literal['a', 'b']]] = None + mode: Literal['fast', 'slow'] | None = Field(None, title='Mode') + modes: list[Literal['a', 'b']] | None = None diff --git a/tests/data/expected/main/jsonschema/autodetect.py b/tests/data/expected/main/jsonschema/autodetect.py index f126ebc73..68021f588 100644 --- a/tests/data/expected/main/jsonschema/autodetect.py +++ b/tests/data/expected/main/jsonschema/autodetect.py @@ -4,16 +4,16 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field, conint class Person(BaseModel): - firstName: Optional[str] = Field(None, description="The person's first name.") - lastName: Optional[str] = Field(None, description="The person's last name.") - age: Optional[conint(ge=0)] = Field( + firstName: str | None = Field(None, description="The person's first name.") + lastName: str | None = Field(None, description="The person's last name.") + age: conint(ge=0) | None = Field( None, description='Age in years which must be equal to or greater than zero.' ) - friends: Optional[list[Any]] = None + friends: list[Any] | None = None comment: None = None diff --git a/tests/data/expected/main/jsonschema/boolean_property.py b/tests/data/expected/main/jsonschema/boolean_property.py index 4168834c7..09aa06c2b 100644 --- a/tests/data/expected/main/jsonschema/boolean_property.py +++ b/tests/data/expected/main/jsonschema/boolean_property.py @@ -4,10 +4,10 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Model(BaseModel): - field: Optional[Any] = None + field: Any | None = None diff --git a/tests/data/expected/main/jsonschema/bundled_schema_with_id.py b/tests/data/expected/main/jsonschema/bundled_schema_with_id.py index 0dc0059e4..5c0355ff2 100644 --- a/tests/data/expected/main/jsonschema/bundled_schema_with_id.py +++ b/tests/data/expected/main/jsonschema/bundled_schema_with_id.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -23,9 +22,9 @@ class Pet(BaseModel): class User(BaseModel): name: str - pet: Optional[Pet] = None + pet: Pet | None = None class BundledSchema(BaseModel): - user: Optional[User] = None - pet: Optional[Pet] = None + user: User | None = None + pet: Pet | None = None diff --git a/tests/data/expected/main/jsonschema/circular_reference.py b/tests/data/expected/main/jsonschema/circular_reference.py index b5da105f0..2aab4b2cb 100644 --- a/tests/data/expected/main/jsonschema/circular_reference.py +++ b/tests/data/expected/main/jsonschema/circular_reference.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field @@ -14,20 +12,20 @@ class Member(BaseModel): class User(BaseModel): - name: Optional[str] = None - pet: Optional[Animal] = None - home: Optional[House] = None + name: str | None = None + pet: Animal | None = None + home: House | None = None class Animal(BaseModel): - name: Optional[str] = None - breeder: Optional[User] = None - home: Optional[House] = None + name: str | None = None + breeder: User | None = None + home: House | None = None class House(BaseModel): - address: Optional[str] = None - owner: Optional[User] = None + address: str | None = None + owner: User | None = None Member.update_forward_refs() diff --git a/tests/data/expected/main/jsonschema/combine_any_of_object.py b/tests/data/expected/main/jsonschema/combine_any_of_object.py index 6cb76d3d5..d3f976ac4 100644 --- a/tests/data/expected/main/jsonschema/combine_any_of_object.py +++ b/tests/data/expected/main/jsonschema/combine_any_of_object.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, Extra, Field @@ -14,9 +12,9 @@ class Config: extra = Extra.allow AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None - State: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None + State: str | None = None ZipCode: str @@ -25,14 +23,14 @@ class Config: extra = Extra.allow AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None - County: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None + County: str | None = None PostCode: str class US(BaseModel): - County: Optional[str] = None + County: str | None = None PostCode: str @@ -41,12 +39,12 @@ class Config: extra = Extra.allow AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None class MySchema(BaseModel): class Config: extra = Extra.allow - __root__: Union[MySchema1, MySchema2, MySchema3] = Field(..., title='My schema') + __root__: MySchema1 | MySchema2 | MySchema3 = Field(..., title='My schema') diff --git a/tests/data/expected/main/jsonschema/combine_any_of_object_left_to_right.py b/tests/data/expected/main/jsonschema/combine_any_of_object_left_to_right.py index b3987a2d1..25b866e95 100644 --- a/tests/data/expected/main/jsonschema/combine_any_of_object_left_to_right.py +++ b/tests/data/expected/main/jsonschema/combine_any_of_object_left_to_right.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, ConfigDict, Field, RootModel @@ -14,9 +12,9 @@ class MySchema1(BaseModel): extra='allow', ) AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None - State: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None + State: str | None = None ZipCode: str @@ -25,14 +23,14 @@ class MySchema2(BaseModel): extra='allow', ) AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None - County: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None + County: str | None = None PostCode: str class US(BaseModel): - County: Optional[str] = None + County: str | None = None PostCode: str @@ -41,11 +39,11 @@ class MySchema3(US): extra='allow', ) AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None -class MySchema(RootModel[Union[MySchema1, MySchema2, MySchema3]]): - root: Union[MySchema1, MySchema2, MySchema3] = Field( +class MySchema(RootModel[MySchema1 | MySchema2 | MySchema3]): + root: MySchema1 | MySchema2 | MySchema3 = Field( ..., title='My schema', union_mode='left_to_right' ) diff --git a/tests/data/expected/main/jsonschema/combine_any_of_object_v2.py b/tests/data/expected/main/jsonschema/combine_any_of_object_v2.py index be22ef9e3..96a935cb5 100644 --- a/tests/data/expected/main/jsonschema/combine_any_of_object_v2.py +++ b/tests/data/expected/main/jsonschema/combine_any_of_object_v2.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, ConfigDict, Field, RootModel @@ -14,9 +12,9 @@ class MySchema1(BaseModel): extra='allow', ) AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None - State: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None + State: str | None = None ZipCode: str @@ -25,14 +23,14 @@ class MySchema2(BaseModel): extra='allow', ) AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None - County: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None + County: str | None = None PostCode: str class US(BaseModel): - County: Optional[str] = None + County: str | None = None PostCode: str @@ -41,9 +39,9 @@ class MySchema3(US): extra='allow', ) AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None -class MySchema(RootModel[Union[MySchema1, MySchema2, MySchema3]]): - root: Union[MySchema1, MySchema2, MySchema3] = Field(..., title='My schema') +class MySchema(RootModel[MySchema1 | MySchema2 | MySchema3]): + root: MySchema1 | MySchema2 | MySchema3 = Field(..., title='My schema') diff --git a/tests/data/expected/main/jsonschema/combine_one_of_object.py b/tests/data/expected/main/jsonschema/combine_one_of_object.py index 432f19dc4..c182b906b 100644 --- a/tests/data/expected/main/jsonschema/combine_one_of_object.py +++ b/tests/data/expected/main/jsonschema/combine_one_of_object.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, Extra, Field @@ -14,9 +12,9 @@ class Config: extra = Extra.allow AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None - State: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None + State: str | None = None ZipCode: str @@ -25,14 +23,14 @@ class Config: extra = Extra.allow AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None - County: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None + County: str | None = None PostCode: str class US(BaseModel): - County: Optional[str] = None + County: str | None = None PostCode: str @@ -41,12 +39,12 @@ class Config: extra = Extra.allow AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None class MySchema(BaseModel): class Config: extra = Extra.allow - __root__: Union[MySchema1, MySchema2, MySchema3] = Field(..., title='My schema') + __root__: MySchema1 | MySchema2 | MySchema3 = Field(..., title='My schema') diff --git a/tests/data/expected/main/jsonschema/complex_any_of.py b/tests/data/expected/main/jsonschema/complex_any_of.py index a76038ce2..18ed1d568 100644 --- a/tests/data/expected/main/jsonschema/complex_any_of.py +++ b/tests/data/expected/main/jsonschema/complex_any_of.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Union - from pydantic import BaseModel, Extra @@ -26,4 +24,4 @@ class Config: class Model(BaseModel): - __root__: Union[int, list[ModelItem]] + __root__: int | list[ModelItem] diff --git a/tests/data/expected/main/jsonschema/complex_one_of.py b/tests/data/expected/main/jsonschema/complex_one_of.py index 95db6f841..a9c18b907 100644 --- a/tests/data/expected/main/jsonschema/complex_one_of.py +++ b/tests/data/expected/main/jsonschema/complex_one_of.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Union - from pydantic import BaseModel, Extra @@ -26,4 +24,4 @@ class Config: class Model(BaseModel): - __root__: Union[int, list[ModelItem]] + __root__: int | list[ModelItem] diff --git a/tests/data/expected/main/jsonschema/complicated_enum_default_member.py b/tests/data/expected/main/jsonschema/complicated_enum_default_member.py index 01592be6f..71abafeb4 100644 --- a/tests/data/expected/main/jsonschema/complicated_enum_default_member.py +++ b/tests/data/expected/main/jsonschema/complicated_enum_default_member.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -21,7 +20,7 @@ class Kind(BaseModel): class ProcessingTask(BaseModel): - processing_status_union: Optional[ProcessingStatus] = ProcessingStatus.COMPLETED - processing_status: Optional[ProcessingStatus] = ProcessingStatus.COMPLETED - name: Optional[str] = None - kind: Optional[Kind] = None + processing_status_union: ProcessingStatus | None = ProcessingStatus.COMPLETED + processing_status: ProcessingStatus | None = ProcessingStatus.COMPLETED + name: str | None = None + kind: Kind | None = None diff --git a/tests/data/expected/main/jsonschema/complicated_enum_default_member_dataclass.py b/tests/data/expected/main/jsonschema/complicated_enum_default_member_dataclass.py index 635c74859..65c396a59 100644 --- a/tests/data/expected/main/jsonschema/complicated_enum_default_member_dataclass.py +++ b/tests/data/expected/main/jsonschema/complicated_enum_default_member_dataclass.py @@ -6,7 +6,7 @@ from dataclasses import dataclass from enum import Enum -from typing import Optional, TypeAlias +from typing import TypeAlias class ProcessingStatus(Enum): @@ -20,7 +20,7 @@ class ProcessingStatus(Enum): @dataclass class ProcessingTask: - processing_status_union: Optional[ProcessingStatus] = ProcessingStatus.COMPLETED - processing_status: Optional[ProcessingStatus] = ProcessingStatus.COMPLETED - name: Optional[str] = None - kind: Optional[Kind] = None + processing_status_union: ProcessingStatus | None = ProcessingStatus.COMPLETED + processing_status: ProcessingStatus | None = ProcessingStatus.COMPLETED + name: str | None = None + kind: Kind | None = None diff --git a/tests/data/expected/main/jsonschema/custom_base_path.py b/tests/data/expected/main/jsonschema/custom_base_path.py index f64cd4efe..c6a459df3 100644 --- a/tests/data/expected/main/jsonschema/custom_base_path.py +++ b/tests/data/expected/main/jsonschema/custom_base_path.py @@ -4,31 +4,29 @@ from __future__ import annotations -from typing import Optional - from custom.models import Animal, Person, Property class Spouse(Person): - job: Optional[str] = None + job: str | None = None class Pet(Animal): - name: Optional[str] = None + name: str | None = None class Child(Person): - school: Optional[str] = None - grade: Optional[float] = None - pets: Optional[list[Pet]] = None + school: str | None = None + grade: float | None = None + pets: list[Pet] | None = None class Owner(Person): - job: Optional[str] = None - spouse: Optional[Spouse] = None - children: Optional[list[Child]] = None + job: str | None = None + spouse: Spouse | None = None + children: list[Child] | None = None class House(Property): address: str - owner: Optional[Owner] = None + owner: Owner | None = None diff --git a/tests/data/expected/main/jsonschema/custom_formatters.py b/tests/data/expected/main/jsonschema/custom_formatters.py index 3951f87c1..926b72bf5 100644 --- a/tests/data/expected/main/jsonschema/custom_formatters.py +++ b/tests/data/expected/main/jsonschema/custom_formatters.py @@ -8,16 +8,16 @@ # from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field, conint class Person(BaseModel): - firstName: Optional[str] = Field(None, description="The person's first name.") - lastName: Optional[str] = Field(None, description="The person's last name.") - age: Optional[conint(ge=0)] = Field( + firstName: str | None = Field(None, description="The person's first name.") + lastName: str | None = Field(None, description="The person's last name.") + age: conint(ge=0) | None = Field( None, description='Age in years which must be equal to or greater than zero.' ) - friends: Optional[list[Any]] = None + friends: list[Any] | None = None comment: None = None diff --git a/tests/data/expected/main/jsonschema/dataclass_field.py b/tests/data/expected/main/jsonschema/dataclass_field.py index c7e364eb5..b6857cd01 100644 --- a/tests/data/expected/main/jsonschema/dataclass_field.py +++ b/tests/data/expected/main/jsonschema/dataclass_field.py @@ -5,17 +5,17 @@ from __future__ import annotations from dataclasses import dataclass, field -from typing import Any, Optional, TypeAlias +from typing import Any, TypeAlias Model: TypeAlias = Any @dataclass class User: - name: Optional[str] = None + name: str | None = None pets: list[User] = field(default_factory=list) @dataclass class Pet: - name: Optional[str] = None + name: str | None = None diff --git a/tests/data/expected/main/jsonschema/dataclass_field_default.py b/tests/data/expected/main/jsonschema/dataclass_field_default.py index 98c94024f..708db505c 100644 --- a/tests/data/expected/main/jsonschema/dataclass_field_default.py +++ b/tests/data/expected/main/jsonschema/dataclass_field_default.py @@ -5,17 +5,17 @@ from __future__ import annotations from dataclasses import dataclass, field -from typing import Any, Optional, TypeAlias +from typing import Any, TypeAlias Model: TypeAlias = Any @dataclass class User: - name: Optional[str] = None - pets: Optional[list[User]] = field(default_factory=lambda: ['dog', 'cat']) + name: str | None = None + pets: list[User] | None = field(default_factory=lambda: ['dog', 'cat']) @dataclass class Pet: - name: Optional[str] = 'dog' + name: str | None = 'dog' diff --git a/tests/data/expected/main/jsonschema/dataclass_field_py312.py b/tests/data/expected/main/jsonschema/dataclass_field_py312.py index 226bae19b..adc66719b 100644 --- a/tests/data/expected/main/jsonschema/dataclass_field_py312.py +++ b/tests/data/expected/main/jsonschema/dataclass_field_py312.py @@ -5,17 +5,17 @@ from __future__ import annotations from dataclasses import dataclass, field -from typing import Any, Optional +from typing import Any type Model = Any @dataclass class User: - name: Optional[str] = None + name: str | None = None pets: list[User] = field(default_factory=list) @dataclass class Pet: - name: Optional[str] = None + name: str | None = None diff --git a/tests/data/expected/main/jsonschema/discriminator_literals.py b/tests/data/expected/main/jsonschema/discriminator_literals.py index 8cc9bf6e5..e874c0a28 100644 --- a/tests/data/expected/main/jsonschema/discriminator_literals.py +++ b/tests/data/expected/main/jsonschema/discriminator_literals.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -18,11 +18,11 @@ class Type2(BaseModel): class UnrelatedType(BaseModel): - info: Optional[str] = Field( + info: str | None = Field( 'Unrelated type, not involved in the discriminated union', title='A way to check for side effects', ) class Response(BaseModel): - inner: Union[Type1, Type2] = Field(..., discriminator='type_', title='Inner') + inner: Type1 | Type2 = Field(..., discriminator='type_', title='Inner') diff --git a/tests/data/expected/main/jsonschema/discriminator_literals_msgspec.py b/tests/data/expected/main/jsonschema/discriminator_literals_msgspec.py index aad67ebfe..47bb22245 100644 --- a/tests/data/expected/main/jsonschema/discriminator_literals_msgspec.py +++ b/tests/data/expected/main/jsonschema/discriminator_literals_msgspec.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Union +from typing import Annotated from msgspec import Meta, Struct, UnsetType @@ -18,10 +18,10 @@ class Type2(Struct, tag_field='type_', tag='b'): class UnrelatedType(Struct): - info: Union[ - Annotated[str, Meta(title='A way to check for side effects')], UnsetType - ] = 'Unrelated type, not involved in the discriminated union' + info: Annotated[str, Meta(title='A way to check for side effects')] | UnsetType = ( + 'Unrelated type, not involved in the discriminated union' + ) class Response(Struct): - inner: Annotated[Union[Type1, Type2], Meta(title='Inner')] + inner: Annotated[Type1 | Type2, Meta(title='Inner')] diff --git a/tests/data/expected/main/jsonschema/discriminator_literals_msgspec_keyword_only.py b/tests/data/expected/main/jsonschema/discriminator_literals_msgspec_keyword_only.py index 75a058e21..e7439ff16 100644 --- a/tests/data/expected/main/jsonschema/discriminator_literals_msgspec_keyword_only.py +++ b/tests/data/expected/main/jsonschema/discriminator_literals_msgspec_keyword_only.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Union +from typing import Annotated from msgspec import Meta, Struct, UnsetType @@ -18,10 +18,10 @@ class Type2(Struct, kw_only=True, tag_field='type_', tag='b'): class UnrelatedType(Struct, kw_only=True): - info: Union[ - Annotated[str, Meta(title='A way to check for side effects')], UnsetType - ] = 'Unrelated type, not involved in the discriminated union' + info: Annotated[str, Meta(title='A way to check for side effects')] | UnsetType = ( + 'Unrelated type, not involved in the discriminated union' + ) class Response(Struct, kw_only=True): - inner: Annotated[Union[Type1, Type2], Meta(title='Inner')] + inner: Annotated[Type1 | Type2, Meta(title='Inner')] diff --git a/tests/data/expected/main/jsonschema/discriminator_literals_msgspec_keyword_only_omit_defaults.py b/tests/data/expected/main/jsonschema/discriminator_literals_msgspec_keyword_only_omit_defaults.py index 92db16d2a..2d4b0836a 100644 --- a/tests/data/expected/main/jsonschema/discriminator_literals_msgspec_keyword_only_omit_defaults.py +++ b/tests/data/expected/main/jsonschema/discriminator_literals_msgspec_keyword_only_omit_defaults.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Union +from typing import Annotated from msgspec import Meta, Struct, UnsetType @@ -18,10 +18,10 @@ class Type2(Struct, omit_defaults=True, kw_only=True, tag_field='type_', tag='b' class UnrelatedType(Struct, omit_defaults=True, kw_only=True): - info: Union[ - Annotated[str, Meta(title='A way to check for side effects')], UnsetType - ] = 'Unrelated type, not involved in the discriminated union' + info: Annotated[str, Meta(title='A way to check for side effects')] | UnsetType = ( + 'Unrelated type, not involved in the discriminated union' + ) class Response(Struct, omit_defaults=True, kw_only=True): - inner: Annotated[Union[Type1, Type2], Meta(title='Inner')] + inner: Annotated[Type1 | Type2, Meta(title='Inner')] diff --git a/tests/data/expected/main/jsonschema/discriminator_no_mapping.py b/tests/data/expected/main/jsonschema/discriminator_no_mapping.py index 5ca009df7..b2f188641 100644 --- a/tests/data/expected/main/jsonschema/discriminator_no_mapping.py +++ b/tests/data/expected/main/jsonschema/discriminator_no_mapping.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Union +from typing import Literal from pydantic import BaseModel, Field @@ -18,4 +18,4 @@ class Dog(BaseModel): class Animal(BaseModel): - pet: Union[Cat, Dog] = Field(..., discriminator='pet_type', title='Pet') + pet: Cat | Dog = Field(..., discriminator='pet_type', title='Pet') diff --git a/tests/data/expected/main/jsonschema/discriminator_with_external_reference.py b/tests/data/expected/main/jsonschema/discriminator_with_external_reference.py index 0dd125253..4431958ef 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_external_reference.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_external_reference.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -15,7 +15,7 @@ class Type1(BaseModel): class Type2(BaseModel): type_: Literal['b'] = Field('b', title='Type ') - ref_type: Optional[Type1] = Field(None, description='A referenced type.') + ref_type: Type1 | None = Field(None, description='A referenced type.') class Type4(BaseModel): @@ -31,6 +31,6 @@ class Type3(BaseModel): class Response(BaseModel): - inner: Union[Type1, Type2, Type3, Type4, Type5] = Field( + inner: Type1 | Type2 | Type3 | Type4 | Type5 = Field( ..., discriminator='type_', title='Inner' ) diff --git a/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py b/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py index 061f1ec0e..38d04cf4b 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Union +from typing import Annotated from msgspec import UNSET, Meta, Struct, UnsetType @@ -14,9 +14,9 @@ class Type1(Struct, tag_field='type_', tag='a'): class Type2(Struct, tag_field='type_', tag='b'): - ref_type: Union[ - Annotated[Type1, Meta(description='A referenced type.')], UnsetType - ] = UNSET + ref_type: Annotated[Type1, Meta(description='A referenced type.')] | UnsetType = ( + UNSET + ) class Type4(Struct, tag_field='type_', tag='d'): @@ -32,4 +32,4 @@ class Type3(Struct, tag_field='type_', tag='c'): class Response(Struct): - inner: Annotated[Union[Type1, Type2, Type3, Type4, Type5], Meta(title='Inner')] + inner: Annotated[Type1 | Type2 | Type3 | Type4 | Type5, Meta(title='Inner')] diff --git a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder/inner_folder/schema.py b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder/inner_folder/schema.py index 87d9e336a..40abf2172 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder/inner_folder/schema.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder/inner_folder/schema.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Union +from typing import Literal from pydantic import BaseModel, Field @@ -19,6 +19,6 @@ class Type3(BaseModel): class Response(BaseModel): - inner: Union[type_1.Type1, type_2.Type2, Type3, type_4.Type4, type_5.Type5] = Field( + inner: type_1.Type1 | type_2.Type2 | Type3 | type_4.Type4 | type_5.Type5 = Field( ..., discriminator='type_', title='Inner' ) diff --git a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder/inner_folder/type_2.py b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder/inner_folder/type_2.py index 02d3e3f5f..6e8f28cd9 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder/inner_folder/type_2.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder/inner_folder/type_2.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional +from typing import Literal from pydantic import BaseModel, Field @@ -13,4 +13,4 @@ class Type2(BaseModel): type_: Literal['b'] = Field(..., const=True, title='Type ') - ref_type: Optional[type_1.Type1] = Field(None, description='A referenced type.') + ref_type: type_1.Type1 | None = Field(None, description='A referenced type.') diff --git a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/schema.py b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/schema.py index d2575a789..5e10d75c7 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/schema.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/schema.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Union +from typing import Annotated from msgspec import Meta, Struct @@ -20,6 +20,6 @@ class Type3(Struct, tag_field='type_', tag='c'): class Response(Struct): inner: Annotated[ - Union[type_1.Type1, type_2.Type2, Type3, type_4.Type4, type_5.Type5], + type_1.Type1 | type_2.Type2 | Type3 | type_4.Type4 | type_5.Type5, Meta(title='Inner'), ] diff --git a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py index d947d3633..d149545c8 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Union +from typing import Annotated from msgspec import UNSET, Meta, Struct, UnsetType @@ -12,6 +12,6 @@ class Type2(Struct, tag_field='type_', tag='b'): - ref_type: Union[ - Annotated[type_1.Type1, Meta(description='A referenced type.')], UnsetType - ] = UNSET + ref_type: ( + Annotated[type_1.Type1, Meta(description='A referenced type.')] | UnsetType + ) = UNSET diff --git a/tests/data/expected/main/jsonschema/discriminator_with_meta_msgspec.py b/tests/data/expected/main/jsonschema/discriminator_with_meta_msgspec.py index 6e1a2b4d4..b4df5ccfa 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_meta_msgspec.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_meta_msgspec.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Union - from msgspec import UNSET, Struct, UnsetType @@ -18,4 +16,4 @@ class UserMessage(Struct, tag_field='role', tag='user'): class Model(Struct): - message: Union[SystemMessage, UserMessage, UnsetType] = UNSET + message: SystemMessage | UserMessage | UnsetType = UNSET diff --git a/tests/data/expected/main/jsonschema/discriminator_with_type_string_msgspec.py b/tests/data/expected/main/jsonschema/discriminator_with_type_string_msgspec.py index a356b7fda..1cd00a614 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_type_string_msgspec.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_type_string_msgspec.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Union - from msgspec import UNSET, Struct, UnsetType @@ -18,4 +16,4 @@ class UserMessage(Struct, tag_field='role', tag='user'): class Model(Struct): - message: Union[SystemMessage, UserMessage, UnsetType] = UNSET + message: SystemMessage | UserMessage | UnsetType = UNSET diff --git a/tests/data/expected/main/jsonschema/discriminator_with_type_string_msgspec_no_annotated.py b/tests/data/expected/main/jsonschema/discriminator_with_type_string_msgspec_no_annotated.py index a356b7fda..1cd00a614 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_type_string_msgspec_no_annotated.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_type_string_msgspec_no_annotated.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Union - from msgspec import UNSET, Struct, UnsetType @@ -18,4 +16,4 @@ class UserMessage(Struct, tag_field='role', tag='user'): class Model(Struct): - message: Union[SystemMessage, UserMessage, UnsetType] = UNSET + message: SystemMessage | UserMessage | UnsetType = UNSET diff --git a/tests/data/expected/main/jsonschema/duration_msgspec.py b/tests/data/expected/main/jsonschema/duration_msgspec.py index 09526b542..68c1105b2 100644 --- a/tests/data/expected/main/jsonschema/duration_msgspec.py +++ b/tests/data/expected/main/jsonschema/duration_msgspec.py @@ -5,7 +5,7 @@ from __future__ import annotations from datetime import timedelta -from typing import Any, TypeAlias, Union +from typing import Any, TypeAlias from msgspec import UNSET, Struct, UnsetType @@ -13,4 +13,4 @@ class Test(Struct): - s_duration: Union[timedelta, UnsetType] = UNSET + s_duration: timedelta | UnsetType = UNSET diff --git a/tests/data/expected/main/jsonschema/duration_pydantic_v2.py b/tests/data/expected/main/jsonschema/duration_pydantic_v2.py index f7f2c5e82..37d89a55c 100644 --- a/tests/data/expected/main/jsonschema/duration_pydantic_v2.py +++ b/tests/data/expected/main/jsonschema/duration_pydantic_v2.py @@ -5,7 +5,7 @@ from __future__ import annotations from datetime import timedelta -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field, RootModel @@ -15,4 +15,4 @@ class Model(RootModel[Any]): class Test(BaseModel): - s_duration: Optional[timedelta] = Field(None, examples=['PT2H33M3S']) + s_duration: timedelta | None = Field(None, examples=['PT2H33M3S']) diff --git a/tests/data/expected/main/jsonschema/enum_specialized.py b/tests/data/expected/main/jsonschema/enum_specialized.py index d517a0fd3..186eff866 100644 --- a/tests/data/expected/main/jsonschema/enum_specialized.py +++ b/tests/data/expected/main/jsonschema/enum_specialized.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum, IntEnum, StrEnum -from typing import Optional from pydantic import BaseModel @@ -45,9 +44,9 @@ class UnknownEnum(Enum): class Model(BaseModel): - IntEnum: Optional[IntEnumModel] = None - FloatEnum: Optional[FloatEnum] = None - StrEnum: Optional[StrEnumModel] = None - NonTypedEnum: Optional[NonTypedEnum] = None - BooleanEnum: Optional[BooleanEnum] = None - UnknownEnum: Optional[UnknownEnum] = None + IntEnum: IntEnumModel | None = None + FloatEnum: FloatEnum | None = None + StrEnum: StrEnumModel | None = None + NonTypedEnum: NonTypedEnum | None = None + BooleanEnum: BooleanEnum | None = None + UnknownEnum: UnknownEnum | None = None diff --git a/tests/data/expected/main/jsonschema/enum_specialized_disable.py b/tests/data/expected/main/jsonschema/enum_specialized_disable.py index 3671f677b..d4b185087 100644 --- a/tests/data/expected/main/jsonschema/enum_specialized_disable.py +++ b/tests/data/expected/main/jsonschema/enum_specialized_disable.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -45,9 +44,9 @@ class UnknownEnum(Enum): class Model(BaseModel): - IntEnum: Optional[IntEnum] = None - FloatEnum: Optional[FloatEnum] = None - StrEnum: Optional[StrEnum] = None - NonTypedEnum: Optional[NonTypedEnum] = None - BooleanEnum: Optional[BooleanEnum] = None - UnknownEnum: Optional[UnknownEnum] = None + IntEnum: IntEnum | None = None + FloatEnum: FloatEnum | None = None + StrEnum: StrEnum | None = None + NonTypedEnum: NonTypedEnum | None = None + BooleanEnum: BooleanEnum | None = None + UnknownEnum: UnknownEnum | None = None diff --git a/tests/data/expected/main/jsonschema/external_files.py b/tests/data/expected/main/jsonschema/external_files.py index e80735774..7dcb2a830 100644 --- a/tests/data/expected/main/jsonschema/external_files.py +++ b/tests/data/expected/main/jsonschema/external_files.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class ExternalChildRoot(BaseModel): - somefield: Optional[int] = None + somefield: int | None = None class Object(BaseModel): diff --git a/tests/data/expected/main/jsonschema/external_files_in_directory.py b/tests/data/expected/main/jsonschema/external_files_in_directory.py index 66dc0c0cd..0a202c4b8 100644 --- a/tests/data/expected/main/jsonschema/external_files_in_directory.py +++ b/tests/data/expected/main/jsonschema/external_files_in_directory.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional, Union from pydantic import BaseModel, Extra, Field, conint @@ -37,9 +36,9 @@ class Tea(Enum): class Pet(BaseModel): - name: Optional[str] = None - age: Optional[int] = None - fur: Optional[Fur] = None + name: str | None = None + age: int | None = None + fur: Fur | None = None class Friend(BaseModel): @@ -47,8 +46,8 @@ class Config: extra = Extra.allow name: str = Field(..., example='John Doe') - phone_number: Optional[str] = Field(None, example='(555) 555-1234') - food: Optional[list[Union[Noodle, Soup]]] = None + phone_number: str | None = Field(None, example='(555) 555-1234') + food: list[Noodle | Soup] | None = None class Friends(BaseModel): @@ -58,20 +57,20 @@ class Friends(BaseModel): class Person(BaseModel): first_name: str = Field(..., description="The person's first name.") last_name: str = Field(..., description="The person's last name.") - age: Optional[conint(ge=0)] = Field(None, description='Age in years.') - pets: Optional[list[Pet]] = None - friends: Optional[Friends] = None - robot: Optional[Robot] = None + age: conint(ge=0) | None = Field(None, description='Age in years.') + pets: list[Pet] | None = None + friends: Friends | None = None + robot: Robot | None = None comment: None = None - drink: Optional[list[Union[Coffee, Tea]]] = None - food: Optional[list[Union[Noodle, Soup]]] = None + drink: list[Coffee | Tea] | None = None + food: list[Noodle | Soup] | None = None class Robot(Pet): - friends: Optional[Person] = None - drink: Optional[Coffee] = None - food: Optional[Noodle] = None - pet: Optional[Pet] = None + friends: Person | None = None + drink: Coffee | None = None + food: Noodle | None = None + pet: Pet | None = None Person.update_forward_refs() diff --git a/tests/data/expected/main/jsonschema/external_other_ref2.py b/tests/data/expected/main/jsonschema/external_other_ref2.py index 4bc0afe0f..08da5c502 100644 --- a/tests/data/expected/main/jsonschema/external_other_ref2.py +++ b/tests/data/expected/main/jsonschema/external_other_ref2.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Other(BaseModel): - key: Optional[str] = None + key: str | None = None diff --git a/tests/data/expected/main/jsonschema/external_ref0.py b/tests/data/expected/main/jsonschema/external_ref0.py index b60220286..3178459f5 100644 --- a/tests/data/expected/main/jsonschema/external_ref0.py +++ b/tests/data/expected/main/jsonschema/external_ref0.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import ref2 @@ -13,5 +11,5 @@ class Model(BaseModel): - ref1: Optional[ref2.Model] = None - other_ref1: Optional[ref2_1.Other] = None + ref1: ref2.Model | None = None + other_ref1: ref2_1.Other | None = None diff --git a/tests/data/expected/main/jsonschema/extra_fields_allow.py b/tests/data/expected/main/jsonschema/extra_fields_allow.py index c699c8981..3158caf64 100644 --- a/tests/data/expected/main/jsonschema/extra_fields_allow.py +++ b/tests/data/expected/main/jsonschema/extra_fields_allow.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Extra @@ -13,21 +11,21 @@ class Foo(BaseModel): class Config: extra = Extra.allow - x: Optional[int] = None + x: int | None = None class Bar(BaseModel): class Config: extra = Extra.allow - y: Optional[int] = None + y: int | None = None class Baz(BaseModel): class Config: extra = Extra.allow - z: Optional[int] = None + z: int | None = None class Test(BaseModel): @@ -35,5 +33,5 @@ class Config: extra = Extra.allow foo: Foo - bar: Optional[Bar] = None - baz: Optional[Baz] = None + bar: Bar | None = None + baz: Baz | None = None diff --git a/tests/data/expected/main/jsonschema/extra_fields_forbid.py b/tests/data/expected/main/jsonschema/extra_fields_forbid.py index 2b9a2a46b..11d957789 100644 --- a/tests/data/expected/main/jsonschema/extra_fields_forbid.py +++ b/tests/data/expected/main/jsonschema/extra_fields_forbid.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Extra @@ -13,21 +11,21 @@ class Foo(BaseModel): class Config: extra = Extra.forbid - x: Optional[int] = None + x: int | None = None class Bar(BaseModel): class Config: extra = Extra.forbid - y: Optional[int] = None + y: int | None = None class Baz(BaseModel): class Config: extra = Extra.forbid - z: Optional[int] = None + z: int | None = None class Test(BaseModel): @@ -35,5 +33,5 @@ class Config: extra = Extra.forbid foo: Foo - bar: Optional[Bar] = None - baz: Optional[Baz] = None + bar: Bar | None = None + baz: Baz | None = None diff --git a/tests/data/expected/main/jsonschema/extra_fields_ignore.py b/tests/data/expected/main/jsonschema/extra_fields_ignore.py index 99c882982..b251b5cae 100644 --- a/tests/data/expected/main/jsonschema/extra_fields_ignore.py +++ b/tests/data/expected/main/jsonschema/extra_fields_ignore.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Extra @@ -13,21 +11,21 @@ class Foo(BaseModel): class Config: extra = Extra.ignore - x: Optional[int] = None + x: int | None = None class Bar(BaseModel): class Config: extra = Extra.ignore - y: Optional[int] = None + y: int | None = None class Baz(BaseModel): class Config: extra = Extra.ignore - z: Optional[int] = None + z: int | None = None class Test(BaseModel): @@ -35,5 +33,5 @@ class Config: extra = Extra.ignore foo: Foo - bar: Optional[Bar] = None - baz: Optional[Baz] = None + bar: Bar | None = None + baz: Baz | None = None diff --git a/tests/data/expected/main/jsonschema/extra_fields_v2_allow.py b/tests/data/expected/main/jsonschema/extra_fields_v2_allow.py index c7ac5655f..2dbe5b52d 100644 --- a/tests/data/expected/main/jsonschema/extra_fields_v2_allow.py +++ b/tests/data/expected/main/jsonschema/extra_fields_v2_allow.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, ConfigDict @@ -13,21 +11,21 @@ class Foo(BaseModel): model_config = ConfigDict( extra='allow', ) - x: Optional[int] = None + x: int | None = None class Bar(BaseModel): model_config = ConfigDict( extra='allow', ) - y: Optional[int] = None + y: int | None = None class Baz(BaseModel): model_config = ConfigDict( extra='allow', ) - z: Optional[int] = None + z: int | None = None class Test(BaseModel): @@ -35,5 +33,5 @@ class Test(BaseModel): extra='allow', ) foo: Foo - bar: Optional[Bar] = None - baz: Optional[Baz] = None + bar: Bar | None = None + baz: Baz | None = None diff --git a/tests/data/expected/main/jsonschema/extra_fields_v2_forbid.py b/tests/data/expected/main/jsonschema/extra_fields_v2_forbid.py index 6c0018488..4fe9af2bc 100644 --- a/tests/data/expected/main/jsonschema/extra_fields_v2_forbid.py +++ b/tests/data/expected/main/jsonschema/extra_fields_v2_forbid.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, ConfigDict @@ -13,21 +11,21 @@ class Foo(BaseModel): model_config = ConfigDict( extra='forbid', ) - x: Optional[int] = None + x: int | None = None class Bar(BaseModel): model_config = ConfigDict( extra='forbid', ) - y: Optional[int] = None + y: int | None = None class Baz(BaseModel): model_config = ConfigDict( extra='forbid', ) - z: Optional[int] = None + z: int | None = None class Test(BaseModel): @@ -35,5 +33,5 @@ class Test(BaseModel): extra='forbid', ) foo: Foo - bar: Optional[Bar] = None - baz: Optional[Baz] = None + bar: Bar | None = None + baz: Baz | None = None diff --git a/tests/data/expected/main/jsonschema/extra_fields_v2_ignore.py b/tests/data/expected/main/jsonschema/extra_fields_v2_ignore.py index 6c1b97eb1..c849840ae 100644 --- a/tests/data/expected/main/jsonschema/extra_fields_v2_ignore.py +++ b/tests/data/expected/main/jsonschema/extra_fields_v2_ignore.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, ConfigDict @@ -13,21 +11,21 @@ class Foo(BaseModel): model_config = ConfigDict( extra='ignore', ) - x: Optional[int] = None + x: int | None = None class Bar(BaseModel): model_config = ConfigDict( extra='ignore', ) - y: Optional[int] = None + y: int | None = None class Baz(BaseModel): model_config = ConfigDict( extra='ignore', ) - z: Optional[int] = None + z: int | None = None class Test(BaseModel): @@ -35,5 +33,5 @@ class Test(BaseModel): extra='ignore', ) foo: Foo - bar: Optional[Bar] = None - baz: Optional[Baz] = None + bar: Bar | None = None + baz: Baz | None = None diff --git a/tests/data/expected/main/jsonschema/extras_in_oneof.py b/tests/data/expected/main/jsonschema/extras_in_oneof.py index 7bcfde643..e081d9521 100644 --- a/tests/data/expected/main/jsonschema/extras_in_oneof.py +++ b/tests/data/expected/main/jsonschema/extras_in_oneof.py @@ -4,42 +4,40 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, Field class OneofProp(BaseModel): - shared_prop: Optional[str] = Field( + shared_prop: str | None = Field( None, json_schema_extra={'x-shared': 'shared_value'} ) - variant_a_prop: Optional[str] = Field( + variant_a_prop: str | None = Field( None, json_schema_extra={'x-variant': 'variant_a_value'} ) class OneofProp1(BaseModel): - shared_prop: Optional[str] = Field( + shared_prop: str | None = Field( None, json_schema_extra={'x-shared': 'shared_value'} ) - variant_b_prop: Optional[int] = Field( + variant_b_prop: int | None = Field( None, json_schema_extra={'x-variant': 'variant_b_value'} ) class AnyofProp(BaseModel): - any_a_prop: Optional[str] = Field(None, json_schema_extra={'x-any': 'any_a_value'}) + any_a_prop: str | None = Field(None, json_schema_extra={'x-any': 'any_a_value'}) class AnyofProp1(BaseModel): - any_b_prop: Optional[bool] = Field(None, json_schema_extra={'x-any': 'any_b_value'}) + any_b_prop: bool | None = Field(None, json_schema_extra={'x-any': 'any_b_value'}) class ExtrasInOneOf(BaseModel): - simple_prop: Optional[str] = Field( + simple_prop: str | None = Field( None, json_schema_extra={'x-custom': 'simple_value'} ) - oneof_prop: Optional[Union[OneofProp, OneofProp1]] = Field( + oneof_prop: OneofProp | OneofProp1 | None = Field( None, json_schema_extra={'x-parent-custom': 'parent_value'} ) - anyof_prop: Optional[Union[AnyofProp, AnyofProp1]] = None + anyof_prop: AnyofProp | AnyofProp1 | None = None diff --git a/tests/data/expected/main/jsonschema/field_extras.py b/tests/data/expected/main/jsonschema/field_extras.py index c0a6f0428..4c8e2324a 100644 --- a/tests/data/expected/main/jsonschema/field_extras.py +++ b/tests/data/expected/main/jsonschema/field_extras.py @@ -4,11 +4,9 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Extras(BaseModel): - name: Optional[str] = Field(None, description='normal key', example='example') - age: Optional[int] = Field(None, example=12, examples=[13, 20]) + name: str | None = Field(None, description='normal key', example='example') + age: int | None = Field(None, example=12, examples=[13, 20]) diff --git a/tests/data/expected/main/jsonschema/field_extras_field_extra_keys.py b/tests/data/expected/main/jsonschema/field_extras_field_extra_keys.py index 4dd237599..42254b70a 100644 --- a/tests/data/expected/main/jsonschema/field_extras_field_extra_keys.py +++ b/tests/data/expected/main/jsonschema/field_extras_field_extra_keys.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Extras(BaseModel): - name: Optional[str] = Field( + name: str | None = Field( None, description='normal key', example='example', @@ -18,4 +16,4 @@ class Extras(BaseModel): key2=456, repr=True, ) - age: Optional[int] = Field(None, example=12, examples=[13, 20]) + age: int | None = Field(None, example=12, examples=[13, 20]) diff --git a/tests/data/expected/main/jsonschema/field_extras_field_extra_keys_v2.py b/tests/data/expected/main/jsonschema/field_extras_field_extra_keys_v2.py index e0d6ccafd..12165cdeb 100644 --- a/tests/data/expected/main/jsonschema/field_extras_field_extra_keys_v2.py +++ b/tests/data/expected/main/jsonschema/field_extras_field_extra_keys_v2.py @@ -4,19 +4,15 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Extras(BaseModel): - name: Optional[str] = Field( + name: str | None = Field( None, description='normal key', examples=['example'], json_schema_extra={'key2': 456, 'invalid-key-1': 'abc'}, repr=True, ) - age: Optional[int] = Field( - None, examples=[13, 20], json_schema_extra={'example': 12} - ) + age: int | None = Field(None, examples=[13, 20], json_schema_extra={'example': 12}) diff --git a/tests/data/expected/main/jsonschema/field_extras_field_include_all_keys.py b/tests/data/expected/main/jsonschema/field_extras_field_include_all_keys.py index 80055f55b..8f469d4ea 100644 --- a/tests/data/expected/main/jsonschema/field_extras_field_include_all_keys.py +++ b/tests/data/expected/main/jsonschema/field_extras_field_include_all_keys.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Extras(BaseModel): - name: Optional[str] = Field( + name: str | None = Field( None, description='normal key', example='example', @@ -26,4 +24,4 @@ class Extras(BaseModel): schema_='klm', x_abc=True, ) - age: Optional[int] = Field(None, example=12, examples=[13, 20], writeOnly=True) + age: int | None = Field(None, example=12, examples=[13, 20], writeOnly=True) diff --git a/tests/data/expected/main/jsonschema/field_extras_field_include_all_keys_v2.py b/tests/data/expected/main/jsonschema/field_extras_field_include_all_keys_v2.py index 5a985e16a..ae72b3038 100644 --- a/tests/data/expected/main/jsonschema/field_extras_field_include_all_keys_v2.py +++ b/tests/data/expected/main/jsonschema/field_extras_field_include_all_keys_v2.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Extras(BaseModel): - name: Optional[str] = Field( + name: str | None = Field( None, description='normal key', examples=['example'], @@ -28,6 +26,6 @@ class Extras(BaseModel): }, repr=True, ) - age: Optional[int] = Field( + age: int | None = Field( None, examples=[13, 20], json_schema_extra={'example': 12, 'writeOnly': True} ) diff --git a/tests/data/expected/main/jsonschema/field_extras_v2.py b/tests/data/expected/main/jsonschema/field_extras_v2.py index 587d2b0a9..3fa2eeb20 100644 --- a/tests/data/expected/main/jsonschema/field_extras_v2.py +++ b/tests/data/expected/main/jsonschema/field_extras_v2.py @@ -4,13 +4,9 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Extras(BaseModel): - name: Optional[str] = Field(None, description='normal key', examples=['example']) - age: Optional[int] = Field( - None, examples=[13, 20], json_schema_extra={'example': 12} - ) + name: str | None = Field(None, description='normal key', examples=['example']) + age: int | None = Field(None, examples=[13, 20], json_schema_extra={'example': 12}) diff --git a/tests/data/expected/main/jsonschema/field_has_same_name.py b/tests/data/expected/main/jsonschema/field_has_same_name.py index ca21ee57b..f3e7b2e4f 100644 --- a/tests/data/expected/main/jsonschema/field_has_same_name.py +++ b/tests/data/expected/main/jsonschema/field_has_same_name.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class TestObject(BaseModel): - test_string: Optional[str] = None + test_string: str | None = None class Test(BaseModel): - TestObject: Optional[TestObject] = Field(None, title='TestObject') + TestObject: TestObject | None = Field(None, title='TestObject') diff --git a/tests/data/expected/main/jsonschema/field_has_same_name_v2.py b/tests/data/expected/main/jsonschema/field_has_same_name_v2.py index 59f8ab51d..3bfc1a555 100644 --- a/tests/data/expected/main/jsonschema/field_has_same_name_v2.py +++ b/tests/data/expected/main/jsonschema/field_has_same_name_v2.py @@ -4,16 +4,14 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class TestObject(BaseModel): - test_string: Optional[str] = None + test_string: str | None = None class Test(BaseModel): - TestObject_1: Optional[TestObject] = Field( + TestObject_1: TestObject | None = Field( None, alias='TestObject', title='TestObject' ) diff --git a/tests/data/expected/main/jsonschema/field_name_shadows_class_name.py b/tests/data/expected/main/jsonschema/field_name_shadows_class_name.py index 375e4d7ee..be6da0974 100644 --- a/tests/data/expected/main/jsonschema/field_name_shadows_class_name.py +++ b/tests/data/expected/main/jsonschema/field_name_shadows_class_name.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field @@ -14,4 +12,4 @@ class Elem(BaseModel): class Model(BaseModel): - Elem_1: Optional[list[Elem]] = Field(None, alias='Elem') + Elem_1: list[Elem] | None = Field(None, alias='Elem') diff --git a/tests/data/expected/main/jsonschema/general.py b/tests/data/expected/main/jsonschema/general.py index f126ebc73..68021f588 100644 --- a/tests/data/expected/main/jsonschema/general.py +++ b/tests/data/expected/main/jsonschema/general.py @@ -4,16 +4,16 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field, conint class Person(BaseModel): - firstName: Optional[str] = Field(None, description="The person's first name.") - lastName: Optional[str] = Field(None, description="The person's last name.") - age: Optional[conint(ge=0)] = Field( + firstName: str | None = Field(None, description="The person's first name.") + lastName: str | None = Field(None, description="The person's last name.") + age: conint(ge=0) | None = Field( None, description='Age in years which must be equal to or greater than zero.' ) - friends: Optional[list[Any]] = None + friends: list[Any] | None = None comment: None = None diff --git a/tests/data/expected/main/jsonschema/general_dataclass_frozen_kw_only.py b/tests/data/expected/main/jsonschema/general_dataclass_frozen_kw_only.py index 1693ef998..9c68b9d4f 100644 --- a/tests/data/expected/main/jsonschema/general_dataclass_frozen_kw_only.py +++ b/tests/data/expected/main/jsonschema/general_dataclass_frozen_kw_only.py @@ -5,13 +5,13 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Any, Optional +from typing import Any @dataclass(frozen=True, kw_only=True) class Person: - firstName: Optional[str] = None - lastName: Optional[str] = None - age: Optional[int] = None - friends: Optional[list[Any]] = None + firstName: str | None = None + lastName: str | None = None + age: int | None = None + friends: list[Any] | None = None comment: None = None diff --git a/tests/data/expected/main/jsonschema/has_default_value.py b/tests/data/expected/main/jsonschema/has_default_value.py index 4cb8a0aed..c38cbcd80 100644 --- a/tests/data/expected/main/jsonschema/has_default_value.py +++ b/tests/data/expected/main/jsonschema/has_default_value.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, Field @@ -22,7 +21,7 @@ class ID(BaseModel): class Pet(BaseModel): - name: Optional[str] = None + name: str | None = None class Family(BaseModel): @@ -34,10 +33,10 @@ class FamilyPets(BaseModel): class Person(BaseModel): - id: Optional[ID] = Field(default_factory=lambda: ID.parse_obj('abc')) - user: Optional[Pet] = None - firstName: Optional[str] = Field(None, description="The person's first name.") - team: Optional[TeamType] = 'Department' - anotherTeam: Optional[TeamType] = 'Department' - Family: Optional[Family] = None - FamilyPets: Optional[FamilyPets] = None + id: ID | None = Field(default_factory=lambda: ID.parse_obj('abc')) + user: Pet | None = None + firstName: str | None = Field(None, description="The person's first name.") + team: TeamType | None = 'Department' + anotherTeam: TeamType | None = 'Department' + Family: Family | None = None + FamilyPets: FamilyPets | None = None diff --git a/tests/data/expected/main/jsonschema/id.py b/tests/data/expected/main/jsonschema/id.py index 4ca725efc..08a52c34c 100644 --- a/tests/data/expected/main/jsonschema/id.py +++ b/tests/data/expected/main/jsonschema/id.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel @@ -16,5 +14,5 @@ class Address(BaseModel): class Model(BaseModel): - billing_address: Optional[Address] = None - shipping_address: Optional[Address] = None + billing_address: Address | None = None + shipping_address: Address | None = None diff --git a/tests/data/expected/main/jsonschema/id_stdin.py b/tests/data/expected/main/jsonschema/id_stdin.py index 4691d3bfe..b35ca245b 100644 --- a/tests/data/expected/main/jsonschema/id_stdin.py +++ b/tests/data/expected/main/jsonschema/id_stdin.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel @@ -16,5 +14,5 @@ class Address(BaseModel): class Model(BaseModel): - billing_address: Optional[Address] = None - shipping_address: Optional[Address] = None + billing_address: Address | None = None + shipping_address: Address | None = None diff --git a/tests/data/expected/main/jsonschema/ids/ContactPoint.py b/tests/data/expected/main/jsonschema/ids/ContactPoint.py index a4849caf5..f7c14e660 100644 --- a/tests/data/expected/main/jsonschema/ids/ContactPoint.py +++ b/tests/data/expected/main/jsonschema/ids/ContactPoint.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, EmailStr @@ -16,6 +15,6 @@ class Type(Enum): class Schema(BaseModel): type: Type - contactType: Optional[str] = None + contactType: str | None = None email: EmailStr - telephone: Optional[str] = None + telephone: str | None = None diff --git a/tests/data/expected/main/jsonschema/ids/__init__.py b/tests/data/expected/main/jsonschema/ids/__init__.py index a2b6e9184..e3a7f35d2 100644 --- a/tests/data/expected/main/jsonschema/ids/__init__.py +++ b/tests/data/expected/main/jsonschema/ids/__init__.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -20,9 +19,9 @@ class Type(Enum): class Organization(BaseModel): - id: Optional[id_1.Schema] = None + id: id_1.Schema | None = None type: Type name: name_1.Schema - contactPoint: Optional[ContactPoint.Schema] = None - sameAs: Optional[sameAs_1.Schema] = None - url: Optional[URI.Schema] = None + contactPoint: ContactPoint.Schema | None = None + sameAs: sameAs_1.Schema | None = None + url: URI.Schema | None = None diff --git a/tests/data/expected/main/jsonschema/inheritance_forward_ref.py b/tests/data/expected/main/jsonschema/inheritance_forward_ref.py index a8fbcae96..30838c5ce 100644 --- a/tests/data/expected/main/jsonschema/inheritance_forward_ref.py +++ b/tests/data/expected/main/jsonschema/inheritance_forward_ref.py @@ -4,35 +4,33 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class DogBase(BaseModel): - name: Optional[str] = Field(None, title='Name') - woof: Optional[bool] = Field(True, title='Woof') + name: str | None = Field(None, title='Name') + woof: bool | None = Field(True, title='Woof') class PersonBase(BaseModel): - name: Optional[str] = Field(None, title='Name') + name: str | None = Field(None, title='Name') class PersonsBestFriend(BaseModel): - people: Optional[list[Person]] = Field(None, title='People') - dogs: Optional[list[Dog]] = Field(None, title='Dogs') - dog_base: Optional[DogBase] = None - dog_relationships: Optional[DogRelationships] = None - person_base: Optional[PersonBase] = None - person_relationships: Optional[PersonRelationships] = None + people: list[Person] | None = Field(None, title='People') + dogs: list[Dog] | None = Field(None, title='Dogs') + dog_base: DogBase | None = None + dog_relationships: DogRelationships | None = None + person_base: PersonBase | None = None + person_relationships: PersonRelationships | None = None class DogRelationships(BaseModel): - people: Optional[list[Person]] = Field(None, title='People') + people: list[Person] | None = Field(None, title='People') class PersonRelationships(BaseModel): - people: Optional[list[Person]] = Field(None, title='People') + people: list[Person] | None = Field(None, title='People') class Dog(DogBase, DogRelationships): diff --git a/tests/data/expected/main/jsonschema/inheritance_forward_ref_keep_model_order.py b/tests/data/expected/main/jsonschema/inheritance_forward_ref_keep_model_order.py index 8c3cd7074..9fc28fa87 100644 --- a/tests/data/expected/main/jsonschema/inheritance_forward_ref_keep_model_order.py +++ b/tests/data/expected/main/jsonschema/inheritance_forward_ref_keep_model_order.py @@ -4,18 +4,16 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class DogBase(BaseModel): - name: Optional[str] = Field(None, title='Name') - woof: Optional[bool] = Field(True, title='Woof') + name: str | None = Field(None, title='Name') + woof: bool | None = Field(True, title='Woof') class DogRelationships(BaseModel): - people: Optional[list[Person]] = Field(None, title='People') + people: list[Person] | None = Field(None, title='People') class Dog(DogBase, DogRelationships): @@ -23,11 +21,11 @@ class Dog(DogBase, DogRelationships): class PersonBase(BaseModel): - name: Optional[str] = Field(None, title='Name') + name: str | None = Field(None, title='Name') class PersonRelationships(BaseModel): - people: Optional[list[Person]] = Field(None, title='People') + people: list[Person] | None = Field(None, title='People') class Person(PersonBase, PersonRelationships): @@ -35,12 +33,12 @@ class Person(PersonBase, PersonRelationships): class PersonsBestFriend(BaseModel): - people: Optional[list[Person]] = Field(None, title='People') - dogs: Optional[list[Dog]] = Field(None, title='Dogs') - dog_base: Optional[DogBase] = None - dog_relationships: Optional[DogRelationships] = None - person_base: Optional[PersonBase] = None - person_relationships: Optional[PersonRelationships] = None + people: list[Person] | None = Field(None, title='People') + dogs: list[Dog] | None = Field(None, title='Dogs') + dog_base: DogBase | None = None + dog_relationships: DogRelationships | None = None + person_base: PersonBase | None = None + person_relationships: PersonRelationships | None = None DogRelationships.update_forward_refs() diff --git a/tests/data/expected/main/jsonschema/invalid_model_name.py b/tests/data/expected/main/jsonschema/invalid_model_name.py index cb9f2ae67..a87eb5809 100644 --- a/tests/data/expected/main/jsonschema/invalid_model_name.py +++ b/tests/data/expected/main/jsonschema/invalid_model_name.py @@ -4,16 +4,16 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field, conint class ValidModelName(BaseModel): - firstName: Optional[str] = Field(None, description="The person's first name.") - lastName: Optional[str] = Field(None, description="The person's last name.") - age: Optional[conint(ge=0)] = Field( + firstName: str | None = Field(None, description="The person's first name.") + lastName: str | None = Field(None, description="The person's last name.") + age: conint(ge=0) | None = Field( None, description='Age in years which must be equal to or greater than zero.' ) - friends: Optional[list[Any]] = None + friends: list[Any] | None = None comment: None = None diff --git a/tests/data/expected/main/jsonschema/items_boolean.py b/tests/data/expected/main/jsonschema/items_boolean.py index 04f0cdfb0..f1fc06619 100644 --- a/tests/data/expected/main/jsonschema/items_boolean.py +++ b/tests/data/expected/main/jsonschema/items_boolean.py @@ -4,10 +4,10 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Model(BaseModel): - example: Optional[list[Any]] = None + example: list[Any] | None = None diff --git a/tests/data/expected/main/jsonschema/json_pointer.py b/tests/data/expected/main/jsonschema/json_pointer.py index 249b541eb..d4830f8f3 100644 --- a/tests/data/expected/main/jsonschema/json_pointer.py +++ b/tests/data/expected/main/jsonschema/json_pointer.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel, Extra, Field @@ -38,5 +38,5 @@ class Person(BaseModel): class Config: extra = Extra.forbid - name: Optional[str] = Field(None, title='name') - pet: Optional[Union[Cat, Dog]] = Field(None, title='pet') + name: str | None = Field(None, title='name') + pet: Cat | Dog | None = Field(None, title='pet') diff --git a/tests/data/expected/main/jsonschema/json_pointer_array.py b/tests/data/expected/main/jsonschema/json_pointer_array.py index 1c482df4a..e8252990f 100644 --- a/tests/data/expected/main/jsonschema/json_pointer_array.py +++ b/tests/data/expected/main/jsonschema/json_pointer_array.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Union - from pydantic import BaseModel, EmailStr @@ -26,4 +24,4 @@ class Model2(BaseModel): class Model(BaseModel): - __root__: Union[Model1, Model2] + __root__: Model1 | Model2 diff --git a/tests/data/expected/main/jsonschema/json_reuse_enum.py b/tests/data/expected/main/jsonschema/json_reuse_enum.py index 8981565cb..4fea5e547 100644 --- a/tests/data/expected/main/jsonschema/json_reuse_enum.py +++ b/tests/data/expected/main/jsonschema/json_reuse_enum.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, Field @@ -22,10 +21,10 @@ class RedistributeEnum(Enum): class User(BaseModel): - name: Optional[str] = None - animal: Optional[Animal] = 'dog' - pet: Optional[Animal] = 'cat' - redistribute: Optional[list[RedistributeEnum]] = None + name: str | None = None + animal: Animal | None = 'dog' + pet: Animal | None = 'cat' + redistribute: list[RedistributeEnum] | None = None class Redistribute(BaseModel): diff --git a/tests/data/expected/main/jsonschema/json_reuse_enum_default_member.py b/tests/data/expected/main/jsonschema/json_reuse_enum_default_member.py index 5cbaf4cd2..ea8b4dd08 100644 --- a/tests/data/expected/main/jsonschema/json_reuse_enum_default_member.py +++ b/tests/data/expected/main/jsonschema/json_reuse_enum_default_member.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, Field @@ -22,10 +21,10 @@ class RedistributeEnum(Enum): class User(BaseModel): - name: Optional[str] = None - animal: Optional[Animal] = Animal.dog - pet: Optional[Animal] = Animal.cat - redistribute: Optional[list[RedistributeEnum]] = None + name: str | None = None + animal: Animal | None = Animal.dog + pet: Animal | None = Animal.cat + redistribute: list[RedistributeEnum] | None = None class Redistribute(BaseModel): diff --git a/tests/data/expected/main/jsonschema/jsonschema_allof_enum_ref.py b/tests/data/expected/main/jsonschema/jsonschema_allof_enum_ref.py index a8ac45fbc..3ecc6e1af 100644 --- a/tests/data/expected/main/jsonschema/jsonschema_allof_enum_ref.py +++ b/tests/data/expected/main/jsonschema/jsonschema_allof_enum_ref.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional +from typing import Any from pydantic import BaseModel @@ -25,4 +25,4 @@ class QuantityTrunc(BaseModel): class CreateOrderByEstimateRequest(BaseModel): - quantity_trunc: Optional[QuantityTrunc] = None + quantity_trunc: QuantityTrunc | None = None diff --git a/tests/data/expected/main/jsonschema/jsonschema_collapse_root_models_with_optional.py b/tests/data/expected/main/jsonschema/jsonschema_collapse_root_models_with_optional.py index a53c46064..630e13621 100644 --- a/tests/data/expected/main/jsonschema/jsonschema_collapse_root_models_with_optional.py +++ b/tests/data/expected/main/jsonschema/jsonschema_collapse_root_models_with_optional.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Model(BaseModel): - field: Optional[str] = None + field: str | None = None diff --git a/tests/data/expected/main/jsonschema/jsonschema_empty_items_array.py b/tests/data/expected/main/jsonschema/jsonschema_empty_items_array.py index 9f383410e..b5937670a 100644 --- a/tests/data/expected/main/jsonschema/jsonschema_empty_items_array.py +++ b/tests/data/expected/main/jsonschema/jsonschema_empty_items_array.py @@ -4,11 +4,11 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Model(BaseModel): - datum_kwargs: Optional[dict[str, list[Any]]] = None - simple_list: Optional[list[Any]] = None + datum_kwargs: dict[str, list[Any]] | None = None + simple_list: list[Any] | None = None diff --git a/tests/data/expected/main/jsonschema/jsonschema_enum_object_values.py b/tests/data/expected/main/jsonschema/jsonschema_enum_object_values.py index b204a78bb..557bd9693 100644 --- a/tests/data/expected/main/jsonschema/jsonschema_enum_object_values.py +++ b/tests/data/expected/main/jsonschema/jsonschema_enum_object_values.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -36,8 +35,8 @@ class CountryDuplicateTitle(Enum): class EnumObjectTest(BaseModel): - country_with_title: Optional[CountryWithTitle] = None - country_with_name: Optional[CountryWithName] = None - country_with_const: Optional[CountryWithConst] = None - country_no_identifier: Optional[CountryNoIdentifier] = None - country_duplicate_title: Optional[CountryDuplicateTitle] = None + country_with_title: CountryWithTitle | None = None + country_with_name: CountryWithName | None = None + country_with_const: CountryWithConst | None = None + country_no_identifier: CountryNoIdentifier | None = None + country_duplicate_title: CountryDuplicateTitle | None = None diff --git a/tests/data/expected/main/jsonschema/jsonschema_hierarchical_aliases_scoped.py b/tests/data/expected/main/jsonschema/jsonschema_hierarchical_aliases_scoped.py index 059a148a2..a2c9d06ac 100644 --- a/tests/data/expected/main/jsonschema/jsonschema_hierarchical_aliases_scoped.py +++ b/tests/data/expected/main/jsonschema/jsonschema_hierarchical_aliases_scoped.py @@ -4,22 +4,20 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class User(BaseModel): - user_name: Optional[str] = Field(None, alias='name') - id: Optional[int] = None + user_name: str | None = Field(None, alias='name') + id: int | None = None class Address(BaseModel): - address_name: Optional[str] = Field(None, alias='name') - city: Optional[str] = None + address_name: str | None = Field(None, alias='name') + city: str | None = None class Root(BaseModel): - root_name: Optional[str] = Field(None, alias='name') - user: Optional[User] = Field(None, title='User') - address: Optional[Address] = Field(None, title='Address') + root_name: str | None = Field(None, alias='name') + user: User | None = Field(None, title='User') + address: Address | None = Field(None, title='Address') diff --git a/tests/data/expected/main/jsonschema/jsonschema_multiple_types_with_object.py b/tests/data/expected/main/jsonschema/jsonschema_multiple_types_with_object.py index ac839dd40..045fc18b9 100644 --- a/tests/data/expected/main/jsonschema/jsonschema_multiple_types_with_object.py +++ b/tests/data/expected/main/jsonschema/jsonschema_multiple_types_with_object.py @@ -4,28 +4,26 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel class External(BaseModel): - name: Optional[str] = None + name: str | None = None class Config(BaseModel): - value: Optional[int] = None + value: int | None = None class TopLevelMultiType1(BaseModel): - enabled: Optional[bool] = None + enabled: bool | None = None class TopLevelMultiType(BaseModel): - __root__: Union[TopLevelMultiType1, bool] + __root__: TopLevelMultiType1 | bool class Model(BaseModel): - external: Optional[Union[External, bool]] = None - config: Optional[Union[Optional[Config], str]] = None - top_level_ref: Optional[TopLevelMultiType] = None + external: External | bool | None = None + config: Config | str | None = None + top_level_ref: TopLevelMultiType | None = None diff --git a/tests/data/expected/main/jsonschema/jsonschema_root_model_ordering.py b/tests/data/expected/main/jsonschema/jsonschema_root_model_ordering.py index 5ba351a5d..9d84e2e11 100644 --- a/tests/data/expected/main/jsonschema/jsonschema_root_model_ordering.py +++ b/tests/data/expected/main/jsonschema/jsonschema_root_model_ordering.py @@ -4,36 +4,36 @@ from __future__ import annotations -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field, RootModel class Zoo(BaseModel): - animals: Optional[list[Animals]] = Field(default_factory=list, title='Animals') + animals: list[Animals] | None = Field(default_factory=list, title='Animals') class Dog(BaseModel): name: Literal['dog'] = Field('dog', title='woof') - friends: Optional[list[Friends]] = Field(default_factory=list, title='Friends') + friends: list[Friends] | None = Field(default_factory=list, title='Friends') class Cat(BaseModel): name: Literal['cat'] = Field('cat', title='meow') - friends: Optional[list[Friends]] = Field(default_factory=list, title='Friends') + friends: list[Friends] | None = Field(default_factory=list, title='Friends') class Bird(BaseModel): name: Literal['bird'] = Field('bird', title='chirp') - friends: Optional[list[Friends]] = Field(default_factory=list, title='Friends') + friends: list[Friends] | None = Field(default_factory=list, title='Friends') -class Animals(RootModel[Union[Dog, Cat, Bird]]): - root: Union[Dog, Cat, Bird] = Field(..., discriminator='name', title='Animal') +class Animals(RootModel[Dog | Cat | Bird]): + root: Dog | Cat | Bird = Field(..., discriminator='name', title='Animal') -class Friends(RootModel[Union[Dog, Cat, Bird]]): - root: Union[Dog, Cat, Bird] = Field(..., discriminator='name', title='Animal') +class Friends(RootModel[Dog | Cat | Bird]): + root: Dog | Cat | Bird = Field(..., discriminator='name', title='Animal') Zoo.model_rebuild() diff --git a/tests/data/expected/main/jsonschema/jsonschema_root_model_ordering_keep_model_order.py b/tests/data/expected/main/jsonschema/jsonschema_root_model_ordering_keep_model_order.py index ae60860cb..9205f0e14 100644 --- a/tests/data/expected/main/jsonschema/jsonschema_root_model_ordering_keep_model_order.py +++ b/tests/data/expected/main/jsonschema/jsonschema_root_model_ordering_keep_model_order.py @@ -4,36 +4,36 @@ from __future__ import annotations -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field, RootModel class Bird(BaseModel): name: Literal['bird'] = Field('bird', title='chirp') - friends: Optional[list[Friends]] = Field(default_factory=list, title='Friends') + friends: list[Friends] | None = Field(default_factory=list, title='Friends') class Cat(BaseModel): name: Literal['cat'] = Field('cat', title='meow') - friends: Optional[list[Friends]] = Field(default_factory=list, title='Friends') + friends: list[Friends] | None = Field(default_factory=list, title='Friends') class Dog(BaseModel): name: Literal['dog'] = Field('dog', title='woof') - friends: Optional[list[Friends]] = Field(default_factory=list, title='Friends') + friends: list[Friends] | None = Field(default_factory=list, title='Friends') -class Animals(RootModel[Union[Dog, Cat, Bird]]): - root: Union[Dog, Cat, Bird] = Field(..., discriminator='name', title='Animal') +class Animals(RootModel[Dog | Cat | Bird]): + root: Dog | Cat | Bird = Field(..., discriminator='name', title='Animal') -class Friends(RootModel[Union[Dog, Cat, Bird]]): - root: Union[Dog, Cat, Bird] = Field(..., discriminator='name', title='Animal') +class Friends(RootModel[Dog | Cat | Bird]): + root: Dog | Cat | Bird = Field(..., discriminator='name', title='Animal') class Zoo(BaseModel): - animals: Optional[list[Animals]] = Field(default_factory=list, title='Animals') + animals: list[Animals] | None = Field(default_factory=list, title='Animals') Bird.model_rebuild() diff --git a/tests/data/expected/main/jsonschema/keep_model_order_field_references.py b/tests/data/expected/main/jsonschema/keep_model_order_field_references.py index 8e28dc8ec..0b4252565 100644 --- a/tests/data/expected/main/jsonschema/keep_model_order_field_references.py +++ b/tests/data/expected/main/jsonschema/keep_model_order_field_references.py @@ -2,14 +2,12 @@ # filename: keep_model_order_field_references.json # timestamp: 2019-07-26T00:00:00+00:00 -from typing import Optional - from pydantic import BaseModel class Metadata(BaseModel): - title: Optional[str] = None + title: str | None = None class DescriptionType(BaseModel): - metadata: Optional[list[Metadata]] = None + metadata: list[Metadata] | None = None diff --git a/tests/data/expected/main/jsonschema/long_description.py b/tests/data/expected/main/jsonschema/long_description.py index 6aa68a5c1..2e885ad61 100644 --- a/tests/data/expected/main/jsonschema/long_description.py +++ b/tests/data/expected/main/jsonschema/long_description.py @@ -4,18 +4,16 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class LongDescription(BaseModel): - summary: Optional[str] = Field(None, description='summary for object') - description: Optional[str] = Field( + summary: str | None = Field(None, description='summary for object') + description: str | None = Field( None, description='datamodel-code-generator. This code generator creates pydantic model from an openapi file and others.', ) - multi_line: Optional[str] = Field( + multi_line: str | None = Field( None, description='datamodel-code-generator\nThis code generator creates pydantic model from an openapi file and others.\n\n\nSupported source types\nOpenAPI 3 (YAML/JSON, OpenAPI Data Type)\nJSON Schema (JSON Schema Core/JSON Schema Validation)\nJSON/YAML/CSV Data (it will be converted to JSON Schema)\nPython dictionary (it will be converted to JSON Schema)', ) diff --git a/tests/data/expected/main/jsonschema/long_description_wrap_string_literal.py b/tests/data/expected/main/jsonschema/long_description_wrap_string_literal.py index c516c76e0..2fece69c7 100644 --- a/tests/data/expected/main/jsonschema/long_description_wrap_string_literal.py +++ b/tests/data/expected/main/jsonschema/long_description_wrap_string_literal.py @@ -4,21 +4,19 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class LongDescription(BaseModel): - summary: Optional[str] = Field(None, description='summary for object') - description: Optional[str] = Field( + summary: str | None = Field(None, description='summary for object') + description: str | None = Field( None, description=( 'datamodel-code-generator. This code generator creates pydantic model from' ' an openapi file and others.' ), ) - multi_line: Optional[str] = Field( + multi_line: str | None = Field( None, description=( 'datamodel-code-generator\nThis code generator creates pydantic model from' diff --git a/tests/data/expected/main/jsonschema/modular_default_enum_member/foo.py b/tests/data/expected/main/jsonschema/modular_default_enum_member/foo.py index ba28ce241..6ec6d479b 100644 --- a/tests/data/expected/main/jsonschema/modular_default_enum_member/foo.py +++ b/tests/data/expected/main/jsonschema/modular_default_enum_member/foo.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import bar @@ -13,9 +11,9 @@ class Foo(BaseModel): - loggerLevel: Optional[bar.LogLevels] = bar.LogLevels.INFO - AnotherLoggerLevel: Optional[bar_1.LogLevels] = bar_1.LogLevels.ERROR - OtherLoggerLevels: Optional[list[bar_1.LogLevels]] = [ + loggerLevel: bar.LogLevels | None = bar.LogLevels.INFO + AnotherLoggerLevel: bar_1.LogLevels | None = bar_1.LogLevels.ERROR + OtherLoggerLevels: list[bar_1.LogLevels] | None = [ bar_1.LogLevels.INFO, bar_1.LogLevels.ERROR, ] diff --git a/tests/data/expected/main/jsonschema/module_split_single/order.py b/tests/data/expected/main/jsonschema/module_split_single/order.py index c958b40ac..d3119033c 100644 --- a/tests/data/expected/main/jsonschema/module_split_single/order.py +++ b/tests/data/expected/main/jsonschema/module_split_single/order.py @@ -3,13 +3,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .user import User class Order(BaseModel): - id: Optional[int] = None - user: Optional[User] = None + id: int | None = None + user: User | None = None diff --git a/tests/data/expected/main/jsonschema/module_split_single/user.py b/tests/data/expected/main/jsonschema/module_split_single/user.py index 069afc65a..e46302c21 100644 --- a/tests/data/expected/main/jsonschema/module_split_single/user.py +++ b/tests/data/expected/main/jsonschema/module_split_single/user.py @@ -3,11 +3,9 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class User(BaseModel): - id: Optional[int] = None - name: Optional[str] = None + id: int | None = None + name: str | None = None diff --git a/tests/data/expected/main/jsonschema/multiple_files/file_a.py b/tests/data/expected/main/jsonschema/multiple_files/file_a.py index 4448467ac..16647d169 100644 --- a/tests/data/expected/main/jsonschema/multiple_files/file_a.py +++ b/tests/data/expected/main/jsonschema/multiple_files/file_a.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import file_b class ModelA(BaseModel): - firstName: Optional[str] = None - modelB: Optional[file_b.ModelB] = None + firstName: str | None = None + modelB: file_b.ModelB | None = None diff --git a/tests/data/expected/main/jsonschema/multiple_files/file_c.py b/tests/data/expected/main/jsonschema/multiple_files/file_c.py index 5698a758a..47586cce9 100644 --- a/tests/data/expected/main/jsonschema/multiple_files/file_c.py +++ b/tests/data/expected/main/jsonschema/multiple_files/file_c.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import file_b class ModelC(BaseModel): - firstName: Optional[str] = None - modelB: Optional[file_b.ModelB] = None + firstName: str | None = None + modelB: file_b.ModelB | None = None diff --git a/tests/data/expected/main/jsonschema/multiple_files/file_d.py b/tests/data/expected/main/jsonschema/multiple_files/file_d.py index 1169bb119..d4d794152 100644 --- a/tests/data/expected/main/jsonschema/multiple_files/file_d.py +++ b/tests/data/expected/main/jsonschema/multiple_files/file_d.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import file_a class ModelD(BaseModel): - firstName: Optional[str] = None - modelA: Optional[file_a.ModelA] = None + firstName: str | None = None + modelA: file_a.ModelA | None = None diff --git a/tests/data/expected/main/jsonschema/multiple_files_json_pointer/file_a.py b/tests/data/expected/main/jsonschema/multiple_files_json_pointer/file_a.py index 872be5030..db2fc18d2 100644 --- a/tests/data/expected/main/jsonschema/multiple_files_json_pointer/file_a.py +++ b/tests/data/expected/main/jsonschema/multiple_files_json_pointer/file_a.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, Extra, Field from . import file_b @@ -15,5 +13,5 @@ class PersonA(BaseModel): class Config: extra = Extra.forbid - name: Optional[str] = Field(None, title='name') - pet: Optional[Union[file_b.Cat, file_b.Dog]] = Field(None, title='pet') + name: str | None = Field(None, title='name') + pet: file_b.Cat | file_b.Dog | None = Field(None, title='pet') diff --git a/tests/data/expected/main/jsonschema/multiple_files_json_pointer/file_c.py b/tests/data/expected/main/jsonschema/multiple_files_json_pointer/file_c.py index dd8d11a35..75ac63940 100644 --- a/tests/data/expected/main/jsonschema/multiple_files_json_pointer/file_c.py +++ b/tests/data/expected/main/jsonschema/multiple_files_json_pointer/file_c.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, Extra, Field from . import file_b @@ -15,5 +13,5 @@ class PersonC(BaseModel): class Config: extra = Extra.forbid - name: Optional[str] = Field(None, title='name') - pet: Optional[Union[file_b.Cat, file_b.Dog]] = Field(None, title='pet') + name: str | None = Field(None, title='name') + pet: file_b.Cat | file_b.Dog | None = Field(None, title='pet') diff --git a/tests/data/expected/main/jsonschema/nested_deep/__init__.py b/tests/data/expected/main/jsonschema/nested_deep/__init__.py index eabe64c56..c7b501dde 100644 --- a/tests/data/expected/main/jsonschema/nested_deep/__init__.py +++ b/tests/data/expected/main/jsonschema/nested_deep/__init__.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .empty_parent.nested import deep as deep_1 @@ -13,6 +11,6 @@ class NestedPerson(BaseModel): - nested_deep_childJson: Optional[deep.Json] = None - nested_deep_childAnother: Optional[deep.Another] = None - empty_parent_nested_deep_childJson: Optional[deep_1.Json] = None + nested_deep_childJson: deep.Json | None = None + nested_deep_childAnother: deep.Another | None = None + empty_parent_nested_deep_childJson: deep_1.Json | None = None diff --git a/tests/data/expected/main/jsonschema/nested_deep/empty_parent/nested/deep.py b/tests/data/expected/main/jsonschema/nested_deep/empty_parent/nested/deep.py index 3ec19a4cb..1aa92e338 100644 --- a/tests/data/expected/main/jsonschema/nested_deep/empty_parent/nested/deep.py +++ b/tests/data/expected/main/jsonschema/nested_deep/empty_parent/nested/deep.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Json(BaseModel): - firstName: Optional[str] = None + firstName: str | None = None diff --git a/tests/data/expected/main/jsonschema/nested_deep/nested/deep.py b/tests/data/expected/main/jsonschema/nested_deep/nested/deep.py index 7d3c9d081..8879cd83e 100644 --- a/tests/data/expected/main/jsonschema/nested_deep/nested/deep.py +++ b/tests/data/expected/main/jsonschema/nested_deep/nested/deep.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Json(BaseModel): - firstName: Optional[str] = None + firstName: str | None = None class Another(BaseModel): - firstName: Optional[str] = None + firstName: str | None = None diff --git a/tests/data/expected/main/jsonschema/nested_directory/_internal.py b/tests/data/expected/main/jsonschema/nested_directory/_internal.py index 226d6ffee..39412ce70 100644 --- a/tests/data/expected/main/jsonschema/nested_directory/_internal.py +++ b/tests/data/expected/main/jsonschema/nested_directory/_internal.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, Field, conint from .definitions import food as food_1 @@ -16,22 +14,22 @@ class Robot(Pet): - friends: Optional[Person] = None - drink: Optional[coffee.Coffee] = None - food: Optional[food_1.Noodle] = None - pet: Optional[pet_1.Pet] = None + friends: Person | None = None + drink: coffee.Coffee | None = None + food: food_1.Noodle | None = None + pet: pet_1.Pet | None = None class Person(BaseModel): first_name: str = Field(..., description="The person's first name.") last_name: str = Field(..., description="The person's last name.") - age: Optional[conint(ge=0)] = Field(None, description='Age in years.') - pets: Optional[list[pet_1.Pet]] = None - friends: Optional[friends_1.Friends] = None - robot: Optional[Robot] = None + age: conint(ge=0) | None = Field(None, description='Age in years.') + pets: list[pet_1.Pet] | None = None + friends: friends_1.Friends | None = None + robot: Robot | None = None comment: None = None - drink: Optional[list[Union[coffee.Coffee, tea.Tea]]] = None - food: Optional[list[Union[food_1.Noodle, food_1.Soup]]] = None + drink: list[coffee.Coffee | tea.Tea] | None = None + food: list[food_1.Noodle | food_1.Soup] | None = None Person.update_forward_refs() diff --git a/tests/data/expected/main/jsonschema/nested_directory/definitions/friends.py b/tests/data/expected/main/jsonschema/nested_directory/definitions/friends.py index 33664d6bb..7d482eed5 100644 --- a/tests/data/expected/main/jsonschema/nested_directory/definitions/friends.py +++ b/tests/data/expected/main/jsonschema/nested_directory/definitions/friends.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, Extra, Field from . import food as food_1 @@ -16,8 +14,8 @@ class Config: extra = Extra.allow name: str = Field(..., example='John Doe') - phone_number: Optional[str] = Field(None, example='(555) 555-1234') - food: Optional[list[Union[food_1.Noodle, food_1.Soup]]] = None + phone_number: str | None = Field(None, example='(555) 555-1234') + food: list[food_1.Noodle | food_1.Soup] | None = None class Friends(BaseModel): diff --git a/tests/data/expected/main/jsonschema/nested_directory/definitions/relative/animal/pet/pet.py b/tests/data/expected/main/jsonschema/nested_directory/definitions/relative/animal/pet/pet.py index cf99ac29e..887f79aa3 100644 --- a/tests/data/expected/main/jsonschema/nested_directory/definitions/relative/animal/pet/pet.py +++ b/tests/data/expected/main/jsonschema/nested_directory/definitions/relative/animal/pet/pet.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .. import fur as fur_1 class Pet(BaseModel): - name: Optional[str] = None - age: Optional[int] = None - fur: Optional[fur_1.Fur] = None + name: str | None = None + age: int | None = None + fur: fur_1.Fur | None = None diff --git a/tests/data/expected/main/jsonschema/nested_json_pointer.py b/tests/data/expected/main/jsonschema/nested_json_pointer.py index 4d3bc8d5f..ab8d3a5e8 100644 --- a/tests/data/expected/main/jsonschema/nested_json_pointer.py +++ b/tests/data/expected/main/jsonschema/nested_json_pointer.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel, Extra, Field @@ -31,38 +31,38 @@ class PetType1(Enum): class C1(BaseModel): - hunts: Optional[bool] = None - age: Optional[str] = None + hunts: bool | None = None + age: str | None = None class C2(BaseModel): - hunts: Optional[bool] = None - age: Optional[str] = None + hunts: bool | None = None + age: str | None = None class D1(BaseModel): - bark: Optional[bool] = None - age: Optional[str] = None + bark: bool | None = None + age: str | None = None class D2(BaseModel): - hunts: Optional[bool] = None - age: Optional[str] = None + hunts: bool | None = None + age: str | None = None class Cat(BaseModel): pet_type: PetType - breed: Optional[Union[C1, C2]] = Field(None, title='breed') + breed: C1 | C2 | None = Field(None, title='breed') class Dog(BaseModel): pet_type: PetType1 - breed: Union[D1, D2] = Field(..., title='breed') + breed: D1 | D2 = Field(..., title='breed') class Person(BaseModel): class Config: extra = Extra.forbid - name: Optional[str] = Field(None, title='name') - pet: Optional[Union[Cat, Dog]] = Field(None, title='pet') + name: str | None = Field(None, title='name') + pet: Cat | Dog | None = Field(None, title='pet') diff --git a/tests/data/expected/main/jsonschema/nested_skip/a/b/c/d.py b/tests/data/expected/main/jsonschema/nested_skip/a/b/c/d.py index 69265784a..45b7a5ef1 100644 --- a/tests/data/expected/main/jsonschema/nested_skip/a/b/c/d.py +++ b/tests/data/expected/main/jsonschema/nested_skip/a/b/c/d.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class E(BaseModel): - example1: Optional[str] = None + example1: str | None = None diff --git a/tests/data/expected/main/jsonschema/null.py b/tests/data/expected/main/jsonschema/null.py index ee3cd2fc1..f38c54ddd 100644 --- a/tests/data/expected/main/jsonschema/null.py +++ b/tests/data/expected/main/jsonschema/null.py @@ -4,13 +4,13 @@ from __future__ import annotations -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel class Model(BaseModel): null: None = None - nullableString: Optional[str] = None - nullableNumber: Optional[Union[float, int]] = None - any: Optional[Any] = None + nullableString: str | None = None + nullableNumber: float | int | None = None + any: Any | None = None diff --git a/tests/data/expected/main/jsonschema/null_and_array.py b/tests/data/expected/main/jsonschema/null_and_array.py index d8b01714b..e2a694da6 100644 --- a/tests/data/expected/main/jsonschema/null_and_array.py +++ b/tests/data/expected/main/jsonschema/null_and_array.py @@ -4,13 +4,13 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class MyObjItem(BaseModel): - items: Optional[list[Any]] + items: list[Any] | None class Model(BaseModel): diff --git a/tests/data/expected/main/jsonschema/null_and_array_v2.py b/tests/data/expected/main/jsonschema/null_and_array_v2.py index 784cf1c02..8cb9c1ff3 100644 --- a/tests/data/expected/main/jsonschema/null_and_array_v2.py +++ b/tests/data/expected/main/jsonschema/null_and_array_v2.py @@ -4,13 +4,13 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class MyObjItem(BaseModel): - items: Optional[list[Any]] = None + items: list[Any] | None = None class Model(BaseModel): diff --git a/tests/data/expected/main/jsonschema/nullable_any_of.py b/tests/data/expected/main/jsonschema/nullable_any_of.py index 5779ed3a0..bf24c5a1a 100644 --- a/tests/data/expected/main/jsonschema/nullable_any_of.py +++ b/tests/data/expected/main/jsonschema/nullable_any_of.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Extra, Field @@ -17,15 +15,15 @@ class In(BaseModel): class Config: extra = Extra.forbid - input_dataset_path: Optional[str] = Field( + input_dataset_path: str | None = Field( None, description='d1', min_length=1, title='Path to the input dataset' ) - config: Optional[Config] = None + config: Config | None = None class ValidatingSchemaId1(BaseModel): class Config: extra = Extra.forbid - in_: Optional[In] = Field(None, alias='in') - n1: Optional[int] = None + in_: In | None = Field(None, alias='in') + n1: int | None = None diff --git a/tests/data/expected/main/jsonschema/nullable_object.py b/tests/data/expected/main/jsonschema/nullable_object.py index 7573aadaf..6691352d5 100644 --- a/tests/data/expected/main/jsonschema/nullable_object.py +++ b/tests/data/expected/main/jsonschema/nullable_object.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Extra, constr @@ -13,11 +11,11 @@ class Network(BaseModel): class Config: extra = Extra.forbid - name: Optional[str] = None + name: str | None = None class Model(BaseModel): class Config: extra = Extra.forbid - networks: dict[constr(regex=r'^[a-zA-Z0-9._-]+$'), Optional[Network]] + networks: dict[constr(regex=r'^[a-zA-Z0-9._-]+$'), Network | None] diff --git a/tests/data/expected/main/jsonschema/object_has_one_of.py b/tests/data/expected/main/jsonschema/object_has_one_of.py index 6c58a941f..8ebccd48b 100644 --- a/tests/data/expected/main/jsonschema/object_has_one_of.py +++ b/tests/data/expected/main/jsonschema/object_has_one_of.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Union from pydantic import BaseModel, Extra, Field @@ -58,4 +57,4 @@ class V2Test(BaseModel): class Config: extra = Extra.allow - __root__: Union[V2Test1, Union[V2Test2, V2Test3]] = Field(..., title='v2_test') + __root__: V2Test1 | V2Test2 | V2Test3 = Field(..., title='v2_test') diff --git a/tests/data/expected/main/jsonschema/one_of_with_sub_schema_array_item.py b/tests/data/expected/main/jsonschema/one_of_with_sub_schema_array_item.py index 6bcd04cc7..60449a675 100644 --- a/tests/data/expected/main/jsonschema/one_of_with_sub_schema_array_item.py +++ b/tests/data/expected/main/jsonschema/one_of_with_sub_schema_array_item.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import AnyUrl, BaseModel, Field class SpatialPlan(BaseModel): - officialDocument: Optional[Union[str, list[AnyUrl]]] = Field( + officialDocument: str | list[AnyUrl] | None = Field( None, description='Link to the official documents that relate to the spatial plan.', title='officialDocument', diff --git a/tests/data/expected/main/jsonschema/oneof_const_enum_nested.py b/tests/data/expected/main/jsonschema/oneof_const_enum_nested.py index 78cd7e533..163c40363 100644 --- a/tests/data/expected/main/jsonschema/oneof_const_enum_nested.py +++ b/tests/data/expected/main/jsonschema/oneof_const_enum_nested.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, Field @@ -21,5 +20,5 @@ class Mode1(Enum): class Config(BaseModel): - mode: Optional[Mode] = Field(None, title='Mode') - modes: Optional[list[Mode1]] = None + mode: Mode | None = Field(None, title='Mode') + modes: list[Mode1] | None = None diff --git a/tests/data/expected/main/jsonschema/oneof_const_enum_nested_literal.py b/tests/data/expected/main/jsonschema/oneof_const_enum_nested_literal.py index ac8523384..18d8b1dac 100644 --- a/tests/data/expected/main/jsonschema/oneof_const_enum_nested_literal.py +++ b/tests/data/expected/main/jsonschema/oneof_const_enum_nested_literal.py @@ -4,11 +4,11 @@ from __future__ import annotations -from typing import Literal, Optional +from typing import Literal from pydantic import BaseModel, Field class Config(BaseModel): - mode: Optional[Literal['fast', 'slow']] = Field(None, title='Mode') - modes: Optional[list[Literal['a', 'b']]] = None + mode: Literal['fast', 'slow'] | None = Field(None, title='Mode') + modes: list[Literal['a', 'b']] | None = None diff --git a/tests/data/expected/main/jsonschema/oneof_const_enum_nullable.py b/tests/data/expected/main/jsonschema/oneof_const_enum_nullable.py index beed2bad4..425f84c61 100644 --- a/tests/data/expected/main/jsonschema/oneof_const_enum_nullable.py +++ b/tests/data/expected/main/jsonschema/oneof_const_enum_nullable.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, Field @@ -16,4 +15,4 @@ class OptionalModeEnum(Enum): class OptionalMode(BaseModel): - __root__: Optional[OptionalModeEnum] = Field(None, title='Optional Mode') + __root__: OptionalModeEnum | None = Field(None, title='Optional Mode') diff --git a/tests/data/expected/main/jsonschema/oneof_const_enum_type_list.py b/tests/data/expected/main/jsonschema/oneof_const_enum_type_list.py index 3d0fcfa5b..df90214b3 100644 --- a/tests/data/expected/main/jsonschema/oneof_const_enum_type_list.py +++ b/tests/data/expected/main/jsonschema/oneof_const_enum_type_list.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, Field @@ -16,4 +15,4 @@ class ModeWithNullEnum(Enum): class ModeWithNull(BaseModel): - __root__: Optional[ModeWithNullEnum] = Field(None, title='Mode With Null') + __root__: ModeWithNullEnum | None = Field(None, title='Mode With Null') diff --git a/tests/data/expected/main/jsonschema/oneof_const_mixed_with_ref.py b/tests/data/expected/main/jsonschema/oneof_const_mixed_with_ref.py index 2a73e99d1..7fed90471 100644 --- a/tests/data/expected/main/jsonschema/oneof_const_mixed_with_ref.py +++ b/tests/data/expected/main/jsonschema/oneof_const_mixed_with_ref.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, Field class SomeType(BaseModel): - name: Optional[str] = None + name: str | None = None class MixedUnion(BaseModel): - __root__: Union[str, SomeType] = Field(..., title='MixedUnion') + __root__: str | SomeType = Field(..., title='MixedUnion') diff --git a/tests/data/expected/main/jsonschema/oneof_const_with_properties.py b/tests/data/expected/main/jsonschema/oneof_const_with_properties.py index 4e10c240e..25d384b5d 100644 --- a/tests/data/expected/main/jsonschema/oneof_const_with_properties.py +++ b/tests/data/expected/main/jsonschema/oneof_const_with_properties.py @@ -4,14 +4,14 @@ from __future__ import annotations -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel, Field class ConstWithProps1(BaseModel): - invalid: Optional[Any] = None + invalid: Any | None = None class ConstWithProps(BaseModel): - __root__: Union[ConstWithProps1, str] = Field(..., title='ConstWithProps') + __root__: ConstWithProps1 | str = Field(..., title='ConstWithProps') diff --git a/tests/data/expected/main/jsonschema/pattern.py b/tests/data/expected/main/jsonschema/pattern.py index 0fe3909ea..17488b76c 100644 --- a/tests/data/expected/main/jsonschema/pattern.py +++ b/tests/data/expected/main/jsonschema/pattern.py @@ -3,19 +3,18 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, constr class Info(BaseModel): - hostName: Optional[ + hostName: ( constr( regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' ) - ] = None - arn: Optional[ - constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') - ] = None - tel: Optional[constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$')] = None - comment: Optional[constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$')] = None + | None + ) = None + arn: ( + constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') | None + ) = None + tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None + comment: constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None diff --git a/tests/data/expected/main/jsonschema/pattern_properties.py b/tests/data/expected/main/jsonschema/pattern_properties.py index 218bc4778..4253a1005 100644 --- a/tests/data/expected/main/jsonschema/pattern_properties.py +++ b/tests/data/expected/main/jsonschema/pattern_properties.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, constr class Bar(BaseModel): - name: Optional[str] = None + name: str | None = None class Foo(BaseModel): diff --git a/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py b/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py index cb2968f34..6fe79bbd0 100644 --- a/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py +++ b/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Extra, Field, constr @@ -13,7 +13,7 @@ class Stt(BaseModel): class Config: extra = Extra.forbid - timeout: Optional[float] = Field(None, title='STT Timeout') + timeout: float | None = Field(None, title='STT Timeout') class TextResponse(BaseModel): @@ -27,8 +27,8 @@ class SomeschemaSchema(BaseModel): class Config: extra = Extra.forbid - KeyWithExplicitPatternProperties: Optional[ - dict[constr(regex=r'^[a-z]{1}[0-9]{1}$'), Any] - ] = None - KeyWithPatternPropertiesByReference: Optional[TextResponse] = None - SomeOtherBoringReference: Optional[Stt] = None + KeyWithExplicitPatternProperties: ( + dict[constr(regex=r'^[a-z]{1}[0-9]{1}$'), Any] | None + ) = None + KeyWithPatternPropertiesByReference: TextResponse | None = None + SomeOtherBoringReference: Stt | None = None diff --git a/tests/data/expected/main/jsonschema/pattern_properties_field_constraints.py b/tests/data/expected/main/jsonschema/pattern_properties_field_constraints.py index b5f54eb64..ba0e55d2f 100644 --- a/tests/data/expected/main/jsonschema/pattern_properties_field_constraints.py +++ b/tests/data/expected/main/jsonschema/pattern_properties_field_constraints.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Bar(BaseModel): - name: Optional[str] = None + name: str | None = None class Foo(BaseModel): diff --git a/tests/data/expected/main/jsonschema/pydantic_v2_model_rebuild_inheritance.py b/tests/data/expected/main/jsonschema/pydantic_v2_model_rebuild_inheritance.py index 6ea0508a2..ecb79fc28 100644 --- a/tests/data/expected/main/jsonschema/pydantic_v2_model_rebuild_inheritance.py +++ b/tests/data/expected/main/jsonschema/pydantic_v2_model_rebuild_inheritance.py @@ -4,17 +4,15 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, RootModel class Base(BaseModel): - next: Optional[Base] = None + next: Base | None = None class Derived(Base): - value: Optional[str] = None + value: str | None = None class Model(RootModel[Derived]): diff --git a/tests/data/expected/main/jsonschema/require_referenced_field/referenced.py b/tests/data/expected/main/jsonschema/require_referenced_field/referenced.py index 3c87aa2c1..49c843415 100644 --- a/tests/data/expected/main/jsonschema/require_referenced_field/referenced.py +++ b/tests/data/expected/main/jsonschema/require_referenced_field/referenced.py @@ -5,11 +5,10 @@ from __future__ import annotations from datetime import datetime -from typing import Optional from pydantic import BaseModel class Model(BaseModel): - some_optional_property: Optional[str] = None - some_optional_typed_property: Optional[datetime] = None + some_optional_property: str | None = None + some_optional_typed_property: datetime | None = None diff --git a/tests/data/expected/main/jsonschema/require_referenced_field_msgspec/referenced.py b/tests/data/expected/main/jsonschema/require_referenced_field_msgspec/referenced.py index 058b70344..eac041c90 100644 --- a/tests/data/expected/main/jsonschema/require_referenced_field_msgspec/referenced.py +++ b/tests/data/expected/main/jsonschema/require_referenced_field_msgspec/referenced.py @@ -4,11 +4,9 @@ from __future__ import annotations -from typing import Union - from msgspec import UNSET, Struct, UnsetType class Model(Struct): - some_optional_property: Union[str, UnsetType] = UNSET - some_optional_typed_property: Union[str, UnsetType] = UNSET + some_optional_property: str | UnsetType = UNSET + some_optional_typed_property: str | UnsetType = UNSET diff --git a/tests/data/expected/main/jsonschema/require_referenced_field_naivedatetime/referenced.py b/tests/data/expected/main/jsonschema/require_referenced_field_naivedatetime/referenced.py index b1a7e4181..92a5aec83 100644 --- a/tests/data/expected/main/jsonschema/require_referenced_field_naivedatetime/referenced.py +++ b/tests/data/expected/main/jsonschema/require_referenced_field_naivedatetime/referenced.py @@ -4,11 +4,9 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, NaiveDatetime class Model(BaseModel): - some_optional_property: Optional[str] = None - some_optional_typed_property: Optional[NaiveDatetime] = None + some_optional_property: str | None = None + some_optional_typed_property: NaiveDatetime | None = None diff --git a/tests/data/expected/main/jsonschema/require_referenced_field_pydantic_v2/referenced.py b/tests/data/expected/main/jsonschema/require_referenced_field_pydantic_v2/referenced.py index c22a0c1a8..266bbf889 100644 --- a/tests/data/expected/main/jsonschema/require_referenced_field_pydantic_v2/referenced.py +++ b/tests/data/expected/main/jsonschema/require_referenced_field_pydantic_v2/referenced.py @@ -4,11 +4,9 @@ from __future__ import annotations -from typing import Optional - from pydantic import AwareDatetime, BaseModel class Model(BaseModel): - some_optional_property: Optional[str] = None - some_optional_typed_property: Optional[AwareDatetime] = None + some_optional_property: str | None = None + some_optional_typed_property: AwareDatetime | None = None diff --git a/tests/data/expected/main/jsonschema/required_and_any_of_required.py b/tests/data/expected/main/jsonschema/required_and_any_of_required.py index 3e0bd7171..71cdf0bbd 100644 --- a/tests/data/expected/main/jsonschema/required_and_any_of_required.py +++ b/tests/data/expected/main/jsonschema/required_and_any_of_required.py @@ -4,22 +4,20 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel class Foo(BaseModel): bar: int baz: int - qux: Optional[int] = None + qux: int | None = None class Foo1(BaseModel): bar: int - baz: Optional[int] = None + baz: int | None = None qux: int class Model(BaseModel): - foo: Union[Foo, Foo1] + foo: Foo | Foo1 diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree/schema_a.py b/tests/data/expected/main/jsonschema/reuse_scope_tree/schema_a.py index 768cf2082..15263c64a 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree/schema_a.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree/schema_a.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .shared import SharedModel as SharedModel_1 @@ -16,4 +14,4 @@ class SharedModel(SharedModel_1): class Model(BaseModel): - data: Optional[SharedModel] = None + data: SharedModel | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree/schema_b.py b/tests/data/expected/main/jsonschema/reuse_scope_tree/schema_b.py index 5f000aa90..695326e0b 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree/schema_b.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree/schema_b.py @@ -4,12 +4,10 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import shared class Model(BaseModel): - info: Optional[shared.SharedModel] = None + info: shared.SharedModel | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree/shared.py b/tests/data/expected/main/jsonschema/reuse_scope_tree/shared.py index 063f2e600..2d2be4a4e 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree/shared.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree/shared.py @@ -4,11 +4,9 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class SharedModel(BaseModel): - id: Optional[int] = None - name: Optional[str] = None + id: int | None = None + name: str | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/aaa_first.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/aaa_first.py index 91da5f163..ab48b50ed 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/aaa_first.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/aaa_first.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class UniqueModelA(BaseModel): - name: Optional[str] = None + name: str | None = None class Model(BaseModel): - data: Optional[UniqueModelA] = None + data: UniqueModelA | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/bbb_second.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/bbb_second.py index cfa631f17..43d470b68 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/bbb_second.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/bbb_second.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class UniqueModelB(BaseModel): - value: Optional[int] = None + value: int | None = None class Model(BaseModel): - info: Optional[UniqueModelB] = None + info: UniqueModelB | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/shared.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/shared.py index ce47b8647..96953d15b 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/shared.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/shared.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class SharedModel(BaseModel): - id: Optional[int] = None + id: int | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/yyy_duplicate.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/yyy_duplicate.py index f83d26b9a..338151ae6 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/yyy_duplicate.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/yyy_duplicate.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .shared import SharedModel as SharedModel_1 @@ -16,4 +14,4 @@ class SharedModel(SharedModel_1): class Model(BaseModel): - data: Optional[SharedModel] = None + data: SharedModel | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/zzz_last.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/zzz_last.py index 31dc5f164..d8f8a9c0a 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/zzz_last.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_branch/zzz_last.py @@ -4,12 +4,10 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import shared class Model(BaseModel): - item: Optional[shared.SharedModel] = None + item: shared.SharedModel | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/schema_a.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/schema_a.py index ac2a684aa..6214357a8 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/schema_a.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/schema_a.py @@ -5,7 +5,6 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional from .shared import SharedModel as SharedModel_1 @@ -17,4 +16,4 @@ class SharedModel(SharedModel_1): @dataclass class Model: - data: Optional[SharedModel] = None + data: SharedModel | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/schema_b.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/schema_b.py index a35b09c3e..5f88f59ac 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/schema_b.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/schema_b.py @@ -5,11 +5,10 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional from . import shared @dataclass class Model: - info: Optional[shared.SharedModel] = None + info: shared.SharedModel | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/shared.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/shared.py index 89e707d74..fdf4acd85 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/shared.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass/shared.py @@ -5,10 +5,9 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional @dataclass class SharedModel: - id: Optional[int] = None - name: Optional[str] = None + id: int | None = None + name: str | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_enum/schema_a.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_enum/schema_a.py index 8d32df213..cc957f1ad 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_enum/schema_a.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_enum/schema_a.py @@ -4,12 +4,10 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import shared class Model(BaseModel): - status: Optional[shared.Status] = None + status: shared.Status | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_enum/schema_b.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_enum/schema_b.py index f6defd351..5e60d0b0b 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_enum/schema_b.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_enum/schema_b.py @@ -4,12 +4,10 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import shared class Model(BaseModel): - state: Optional[shared.Status] = None + state: shared.Status | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_a.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_a.py index bcfaea0d6..6948e5b17 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_a.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_a.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .shared import SharedModel2 as SharedModel2_1 class ModelA(BaseModel): - name: Optional[str] = None + name: str | None = None class SharedModel2(SharedModel2_1): @@ -20,5 +18,5 @@ class SharedModel2(SharedModel2_1): class Model(BaseModel): - data: Optional[ModelA] = None - info: Optional[SharedModel2] = None + data: ModelA | None = None + info: SharedModel2 | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_b.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_b.py index 16ac08ee4..52854b2d8 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_b.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_b.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .shared import SharedModel as SharedModel_1 @@ -16,4 +14,4 @@ class SharedModel(SharedModel_1): class Model(BaseModel): - info: Optional[SharedModel] = None + info: SharedModel | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_c.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_c.py index 576f086d0..571380674 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_c.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_c.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import shared @@ -17,5 +15,5 @@ class SharedModel(SharedModel_1): class Model(BaseModel): - data: Optional[SharedModel] = None - extra: Optional[shared.SharedModel2] = None + data: SharedModel | None = None + extra: shared.SharedModel2 | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_d.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_d.py index b952d9bf5..28026c72e 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_d.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/schema_d.py @@ -4,12 +4,10 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import shared class Model(BaseModel): - item: Optional[shared.SharedModel] = None + item: shared.SharedModel | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/shared.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/shared.py index e5ceea9f9..a89deb1d2 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/shared.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_multi/shared.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class SharedModel(BaseModel): - id: Optional[int] = None + id: int | None = None class SharedModel2(BaseModel): - value: Optional[str] = None + value: str | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_no_conflict_dir/other.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_no_conflict_dir/other.py index ed031722d..6c5ddff7d 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_no_conflict_dir/other.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_no_conflict_dir/other.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class ModelB(BaseModel): - id: Optional[int] = None + id: int | None = None class Model(BaseModel): - info: Optional[ModelB] = None + info: ModelB | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_no_conflict_dir/shared/schema.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_no_conflict_dir/shared/schema.py index 0ccbea63e..33172ef32 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_no_conflict_dir/shared/schema.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_no_conflict_dir/shared/schema.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class ModelA(BaseModel): - name: Optional[str] = None + name: str | None = None class Model(BaseModel): - data: Optional[ModelA] = None + data: ModelA | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_no_dup/schema_a.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_no_dup/schema_a.py index c522bba4e..e9140d0bf 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_no_dup/schema_a.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_no_dup/schema_a.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Model(BaseModel): - name: Optional[str] = None + name: str | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_no_dup/schema_b.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_no_dup/schema_b.py index d43f01141..4c0dfc29d 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_no_dup/schema_b.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_no_dup/schema_b.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Model(BaseModel): - id: Optional[int] = None + id: int | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/schema_a.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/schema_a.py index 294d829a9..e640dda19 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/schema_a.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/schema_a.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .shared import Node as Node_1 @@ -16,7 +14,7 @@ class Node(Node_1): class Model(BaseModel): - node: Optional[Node] = None + node: Node | None = None Node.update_forward_refs() diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/schema_b.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/schema_b.py index 310857eaa..7e25d7f45 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/schema_b.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/schema_b.py @@ -4,12 +4,10 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import shared class Model(BaseModel): - tree: Optional[shared.Node] = None + tree: shared.Node | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/shared.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/shared.py index fba1aaefd..95942e0fa 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/shared.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_self_ref/shared.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Node(BaseModel): - id: Optional[int] = None - child: Optional[Node] = None + id: int | None = None + child: Node | None = None Node.update_forward_refs() diff --git a/tests/data/expected/main/jsonschema/root_id.py b/tests/data/expected/main/jsonschema/root_id.py index 3586d1fcc..7931eee6a 100644 --- a/tests/data/expected/main/jsonschema/root_id.py +++ b/tests/data/expected/main/jsonschema/root_id.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field, conint @@ -14,12 +14,12 @@ class Model(BaseModel): class Person(BaseModel): - firstName: Optional[str] = Field(None, description="The person's first name.") - lastName: Optional[str] = Field(None, description="The person's last name.") - age: Optional[conint(ge=0)] = Field( + firstName: str | None = Field(None, description="The person's first name.") + lastName: str | None = Field(None, description="The person's last name.") + age: conint(ge=0) | None = Field( None, description='Age in years which must be equal to or greater than zero.' ) - friends: Optional[list[Any]] = None + friends: list[Any] | None = None comment: None = None @@ -28,5 +28,5 @@ class OriginalPerson(BaseModel): class Pet(BaseModel): - name: Optional[str] = Field(None, examples=['dog', 'cat']) - owner: Optional[Person] = None + name: str | None = Field(None, examples=['dog', 'cat']) + owner: Person | None = None diff --git a/tests/data/expected/main/jsonschema/root_id_absolute_url.py b/tests/data/expected/main/jsonschema/root_id_absolute_url.py index fea4e017a..a1836e9ec 100644 --- a/tests/data/expected/main/jsonschema/root_id_absolute_url.py +++ b/tests/data/expected/main/jsonschema/root_id_absolute_url.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field, conint @@ -14,12 +14,12 @@ class Model(BaseModel): class Person(BaseModel): - firstName: Optional[str] = Field(None, description="The person's first name.") - lastName: Optional[str] = Field(None, description="The person's last name.") - age: Optional[conint(ge=0)] = Field( + firstName: str | None = Field(None, description="The person's first name.") + lastName: str | None = Field(None, description="The person's last name.") + age: conint(ge=0) | None = Field( None, description='Age in years which must be equal to or greater than zero.' ) - friends: Optional[list[Any]] = None + friends: list[Any] | None = None comment: None = None @@ -28,5 +28,5 @@ class OriginalPerson(BaseModel): class Pet(BaseModel): - name: Optional[str] = Field(None, examples=['dog', 'cat']) - owner: Optional[Person] = None + name: str | None = Field(None, examples=['dog', 'cat']) + owner: Person | None = None diff --git a/tests/data/expected/main/jsonschema/root_in_enum.py b/tests/data/expected/main/jsonschema/root_in_enum.py index 15fe963df..9f165f7c5 100644 --- a/tests/data/expected/main/jsonschema/root_in_enum.py +++ b/tests/data/expected/main/jsonschema/root_in_enum.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional +from typing import Literal from pydantic import BaseModel, Field @@ -13,12 +13,12 @@ class Model(BaseModel): class Config: allow_population_by_field_name = True - order_reference: Optional[str] = Field( + order_reference: str | None = Field( None, alias='orderReference', description='Reference number of the order', examples=['27378669'], ) - brand: Optional[Literal['OPUS', 'someday']] = Field( + brand: Literal['OPUS', 'someday'] | None = Field( None, description='purchased brand' ) diff --git a/tests/data/expected/main/jsonschema/root_model_default_value.py b/tests/data/expected/main/jsonschema/root_model_default_value.py index 83c0db5b0..5983a84a6 100644 --- a/tests/data/expected/main/jsonschema/root_model_default_value.py +++ b/tests/data/expected/main/jsonschema/root_model_default_value.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Annotated, Optional +from typing import Annotated from pydantic import BaseModel, Field, RootModel @@ -24,13 +24,13 @@ class NameType(RootModel[str]): class Model(BaseModel): - admin_state: Optional[AdminStateLeaf] = AdminStateLeaf.enable + admin_state: AdminStateLeaf | None = AdminStateLeaf.enable count: Annotated[ - Optional[CountType], + CountType | None, Field(default_factory=lambda: CountType.model_validate(CountType(10))), ] name: Annotated[ - Optional[NameType], + NameType | None, Field( default_factory=lambda: NameType.model_validate(NameType('default_name')) ), diff --git a/tests/data/expected/main/jsonschema/root_model_default_value_branches.py b/tests/data/expected/main/jsonschema/root_model_default_value_branches.py index 7698381bd..bfce1d352 100644 --- a/tests/data/expected/main/jsonschema/root_model_default_value_branches.py +++ b/tests/data/expected/main/jsonschema/root_model_default_value_branches.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Optional +from typing import Annotated from pydantic import BaseModel, Field, RootModel @@ -15,11 +15,11 @@ class CountType(RootModel[int]): class Model(BaseModel): count_with_default: Annotated[ - Optional[CountType], + CountType | None, Field(default_factory=lambda: CountType.model_validate(CountType(10))), ] - count_no_default: Optional[CountType] = None + count_no_default: CountType | None = None count_list_default: Annotated[ - Optional[list[CountType]], + list[CountType] | None, Field(default_factory=lambda: [CountType.model_validate(v) for v in [1, 2, 3]]), ] diff --git a/tests/data/expected/main/jsonschema/root_model_default_value_no_annotated.py b/tests/data/expected/main/jsonschema/root_model_default_value_no_annotated.py index 63b923f60..443995bf0 100644 --- a/tests/data/expected/main/jsonschema/root_model_default_value_no_annotated.py +++ b/tests/data/expected/main/jsonschema/root_model_default_value_no_annotated.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, Field, RootModel, conint, constr @@ -24,10 +23,10 @@ class NameType(RootModel[constr(min_length=1, max_length=50)]): class Model(BaseModel): - admin_state: Optional[AdminStateLeaf] = AdminStateLeaf.enable - count: Optional[CountType] = Field( + admin_state: AdminStateLeaf | None = AdminStateLeaf.enable + count: CountType | None = Field( default_factory=lambda: CountType.model_validate(10) ) - name: Optional[NameType] = Field( + name: NameType | None = Field( default_factory=lambda: NameType.model_validate('default_name') ) diff --git a/tests/data/expected/main/jsonschema/root_model_default_value_non_root.py b/tests/data/expected/main/jsonschema/root_model_default_value_non_root.py index 419af40de..b81324b1f 100644 --- a/tests/data/expected/main/jsonschema/root_model_default_value_non_root.py +++ b/tests/data/expected/main/jsonschema/root_model_default_value_non_root.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Optional +from typing import Annotated from pydantic import BaseModel, Field, RootModel @@ -14,16 +14,16 @@ class CountType(RootModel[int]): class PersonType(BaseModel): - name: Optional[str] = None + name: str | None = None class Model(BaseModel): root_model_field: Annotated[ - Optional[CountType], + CountType | None, Field(default_factory=lambda: CountType.model_validate(CountType(10))), ] non_root_model_field: Annotated[ - Optional[PersonType], + PersonType | None, Field(default_factory=lambda: PersonType.model_validate({'name': 'John'})), ] - primitive_field: Optional[str] = 'hello' + primitive_field: str | None = 'hello' diff --git a/tests/data/expected/main/jsonschema/root_model_with_additional_properties.py b/tests/data/expected/main/jsonschema/root_model_with_additional_properties.py index f0610d87d..255184e61 100644 --- a/tests/data/expected/main/jsonschema/root_model_with_additional_properties.py +++ b/tests/data/expected/main/jsonschema/root_model_with_additional_properties.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional, Union from pydantic import BaseModel, Field @@ -20,19 +19,19 @@ class NestedEnumResult(Enum): class OneOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class AnyOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class User(BaseModel): - name: Optional[str] = None + name: str | None = None class AllOfResult(User): - description: Optional[str] = None + description: str | None = None class Model(BaseModel): @@ -41,9 +40,9 @@ class Model(BaseModel): result: dict[str, int] nested_object_result: dict[str, NestedObjectResult] nested_enum_result: dict[str, NestedEnumResult] - all_of_result: Optional[dict[str, AllOfResult]] = None - one_of_result: Optional[dict[str, Union[User, OneOfResult]]] = None - any_of_result: Optional[dict[str, Union[User, AnyOfResult]]] = None - all_of_with_unknown_object: Optional[dict[str, User]] = None - objectRef: Optional[dict[str, User]] = None - deepNestedObjectRef: Optional[dict[str, dict[str, dict[str, User]]]] = None + all_of_result: dict[str, AllOfResult] | None = None + one_of_result: dict[str, User | OneOfResult] | None = None + any_of_result: dict[str, User | AnyOfResult] | None = None + all_of_with_unknown_object: dict[str, User] | None = None + objectRef: dict[str, User] | None = None + deepNestedObjectRef: dict[str, dict[str, dict[str, User]]] | None = None diff --git a/tests/data/expected/main/jsonschema/root_model_with_additional_properties_custom_class_name.py b/tests/data/expected/main/jsonschema/root_model_with_additional_properties_custom_class_name.py index 1d944d253..722dc0f6f 100644 --- a/tests/data/expected/main/jsonschema/root_model_with_additional_properties_custom_class_name.py +++ b/tests/data/expected/main/jsonschema/root_model_with_additional_properties_custom_class_name.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional, Union from pydantic import BaseModel, Field @@ -20,19 +19,19 @@ class CustomNestedEnumResult(Enum): class CustomOneOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class CustomAnyOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class CustomUser(BaseModel): - name: Optional[str] = None + name: str | None = None class CustomAllOfResult(CustomUser): - description: Optional[str] = None + description: str | None = None class CustomModel(BaseModel): @@ -41,9 +40,9 @@ class CustomModel(BaseModel): result: dict[str, int] nested_object_result: dict[str, CustomNestedObjectResult] nested_enum_result: dict[str, CustomNestedEnumResult] - all_of_result: Optional[dict[str, CustomAllOfResult]] = None - one_of_result: Optional[dict[str, Union[CustomUser, CustomOneOfResult]]] = None - any_of_result: Optional[dict[str, Union[CustomUser, CustomAnyOfResult]]] = None - all_of_with_unknown_object: Optional[dict[str, CustomUser]] = None - objectRef: Optional[dict[str, CustomUser]] = None - deepNestedObjectRef: Optional[dict[str, dict[str, dict[str, CustomUser]]]] = None + all_of_result: dict[str, CustomAllOfResult] | None = None + one_of_result: dict[str, CustomUser | CustomOneOfResult] | None = None + any_of_result: dict[str, CustomUser | CustomAnyOfResult] | None = None + all_of_with_unknown_object: dict[str, CustomUser] | None = None + objectRef: dict[str, CustomUser] | None = None + deepNestedObjectRef: dict[str, dict[str, dict[str, CustomUser]]] | None = None diff --git a/tests/data/expected/main/jsonschema/root_model_with_additional_properties_literal.py b/tests/data/expected/main/jsonschema/root_model_with_additional_properties_literal.py index 9046422c5..2b529c312 100644 --- a/tests/data/expected/main/jsonschema/root_model_with_additional_properties_literal.py +++ b/tests/data/expected/main/jsonschema/root_model_with_additional_properties_literal.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -14,19 +14,19 @@ class NestedObjectResult(BaseModel): class OneOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class AnyOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class User(BaseModel): - name: Optional[str] = None + name: str | None = None class AllOfResult(User): - description: Optional[str] = None + description: str | None = None class Model(BaseModel): @@ -35,9 +35,9 @@ class Model(BaseModel): result: dict[str, int] nested_object_result: dict[str, NestedObjectResult] nested_enum_result: dict[str, Literal['red', 'green']] - all_of_result: Optional[dict[str, AllOfResult]] = None - one_of_result: Optional[dict[str, Union[User, OneOfResult]]] = None - any_of_result: Optional[dict[str, Union[User, AnyOfResult]]] = None - all_of_with_unknown_object: Optional[dict[str, User]] = None - objectRef: Optional[dict[str, User]] = None - deepNestedObjectRef: Optional[dict[str, dict[str, dict[str, User]]]] = None + all_of_result: dict[str, AllOfResult] | None = None + one_of_result: dict[str, User | OneOfResult] | None = None + any_of_result: dict[str, User | AnyOfResult] | None = None + all_of_with_unknown_object: dict[str, User] | None = None + objectRef: dict[str, User] | None = None + deepNestedObjectRef: dict[str, dict[str, dict[str, User]]] | None = None diff --git a/tests/data/expected/main/jsonschema/root_model_with_additional_properties_use_generic_container_types.py b/tests/data/expected/main/jsonschema/root_model_with_additional_properties_use_generic_container_types.py index 161552637..33bbb8553 100644 --- a/tests/data/expected/main/jsonschema/root_model_with_additional_properties_use_generic_container_types.py +++ b/tests/data/expected/main/jsonschema/root_model_with_additional_properties_use_generic_container_types.py @@ -6,7 +6,6 @@ from collections.abc import Mapping from enum import Enum -from typing import Optional, Union from pydantic import BaseModel, Field @@ -21,19 +20,19 @@ class NestedEnumResult(Enum): class OneOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class AnyOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class User(BaseModel): - name: Optional[str] = None + name: str | None = None class AllOfResult(User): - description: Optional[str] = None + description: str | None = None class Model(BaseModel): @@ -42,9 +41,9 @@ class Model(BaseModel): result: Mapping[str, int] nested_object_result: Mapping[str, NestedObjectResult] nested_enum_result: Mapping[str, NestedEnumResult] - all_of_result: Optional[Mapping[str, AllOfResult]] = None - one_of_result: Optional[Mapping[str, Union[User, OneOfResult]]] = None - any_of_result: Optional[Mapping[str, Union[User, AnyOfResult]]] = None - all_of_with_unknown_object: Optional[Mapping[str, User]] = None - objectRef: Optional[Mapping[str, User]] = None - deepNestedObjectRef: Optional[Mapping[str, Mapping[str, Mapping[str, User]]]] = None + all_of_result: Mapping[str, AllOfResult] | None = None + one_of_result: Mapping[str, User | OneOfResult] | None = None + any_of_result: Mapping[str, User | AnyOfResult] | None = None + all_of_with_unknown_object: Mapping[str, User] | None = None + objectRef: Mapping[str, User] | None = None + deepNestedObjectRef: Mapping[str, Mapping[str, Mapping[str, User]]] | None = None diff --git a/tests/data/expected/main/jsonschema/root_model_with_additional_properties_use_standard_collections.py b/tests/data/expected/main/jsonschema/root_model_with_additional_properties_use_standard_collections.py index f0610d87d..255184e61 100644 --- a/tests/data/expected/main/jsonschema/root_model_with_additional_properties_use_standard_collections.py +++ b/tests/data/expected/main/jsonschema/root_model_with_additional_properties_use_standard_collections.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional, Union from pydantic import BaseModel, Field @@ -20,19 +19,19 @@ class NestedEnumResult(Enum): class OneOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class AnyOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class User(BaseModel): - name: Optional[str] = None + name: str | None = None class AllOfResult(User): - description: Optional[str] = None + description: str | None = None class Model(BaseModel): @@ -41,9 +40,9 @@ class Model(BaseModel): result: dict[str, int] nested_object_result: dict[str, NestedObjectResult] nested_enum_result: dict[str, NestedEnumResult] - all_of_result: Optional[dict[str, AllOfResult]] = None - one_of_result: Optional[dict[str, Union[User, OneOfResult]]] = None - any_of_result: Optional[dict[str, Union[User, AnyOfResult]]] = None - all_of_with_unknown_object: Optional[dict[str, User]] = None - objectRef: Optional[dict[str, User]] = None - deepNestedObjectRef: Optional[dict[str, dict[str, dict[str, User]]]] = None + all_of_result: dict[str, AllOfResult] | None = None + one_of_result: dict[str, User | OneOfResult] | None = None + any_of_result: dict[str, User | AnyOfResult] | None = None + all_of_with_unknown_object: dict[str, User] | None = None + objectRef: dict[str, User] | None = None + deepNestedObjectRef: dict[str, dict[str, dict[str, User]]] | None = None diff --git a/tests/data/expected/main/jsonschema/root_one_of/bar.py b/tests/data/expected/main/jsonschema/root_one_of/bar.py index c233bb7c7..d15c6ddd6 100644 --- a/tests/data/expected/main/jsonschema/root_one_of/bar.py +++ b/tests/data/expected/main/jsonschema/root_one_of/bar.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class JobRun(BaseModel): - enabled: Optional[bool] = Field(False, description='If Live Execution is Enabled.') + enabled: bool | None = Field(False, description='If Live Execution is Enabled.') diff --git a/tests/data/expected/main/jsonschema/root_one_of/foo.py b/tests/data/expected/main/jsonschema/root_one_of/foo.py index 03c3f6776..d268370b4 100644 --- a/tests/data/expected/main/jsonschema/root_one_of/foo.py +++ b/tests/data/expected/main/jsonschema/root_one_of/foo.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class JobRun(BaseModel): - enabled: Optional[bool] = Field(False, description='If Live Execution is enabled') - resources: Optional[list[str]] = Field( + enabled: bool | None = Field(False, description='If Live Execution is enabled') + resources: list[str] | None = Field( None, description='Resource full classname to register to extend any endpoints.' ) diff --git a/tests/data/expected/main/jsonschema/root_one_of/union.py b/tests/data/expected/main/jsonschema/root_one_of/union.py index 6e6e1269b..7178d0656 100644 --- a/tests/data/expected/main/jsonschema/root_one_of/union.py +++ b/tests/data/expected/main/jsonschema/root_one_of/union.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import BaseModel, Extra, Field from . import bar, foo @@ -15,12 +13,12 @@ class ExecutionContext(BaseModel): class Config: extra = Extra.forbid - __root__: Union[foo.JobRun, bar.JobRun] = Field( + __root__: foo.JobRun | bar.JobRun = Field( ..., description='Execution Configuration.' ) class App(BaseModel): - runtime: Optional[ExecutionContext] = Field( + runtime: ExecutionContext | None = Field( None, description='Execution Configuration.' ) diff --git a/tests/data/expected/main/jsonschema/self_reference.py b/tests/data/expected/main/jsonschema/self_reference.py index 3447c741d..f9c61dcfd 100644 --- a/tests/data/expected/main/jsonschema/self_reference.py +++ b/tests/data/expected/main/jsonschema/self_reference.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field @@ -14,8 +14,8 @@ class Model(BaseModel): class Pet(BaseModel): - name: Optional[str] = Field(None, examples=['dog', 'cat']) - friends: Optional[list[Pet]] = None + name: str | None = Field(None, examples=['dog', 'cat']) + friends: list[Pet] | None = None Pet.update_forward_refs() diff --git a/tests/data/expected/main/jsonschema/similar_nested_array.py b/tests/data/expected/main/jsonschema/similar_nested_array.py index aa1fb262b..063ffa265 100644 --- a/tests/data/expected/main/jsonschema/similar_nested_array.py +++ b/tests/data/expected/main/jsonschema/similar_nested_array.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel @@ -15,39 +15,39 @@ class Model(BaseModel): class Datum(BaseModel): - keyA: Optional[str] = None + keyA: str | None = None class ObjectA(BaseModel): - data: Optional[list[Datum]] = None + data: list[Datum] | None = None class Datum1(BaseModel): - keyB: Optional[str] = None + keyB: str | None = None class ObjectB(BaseModel): - data: Optional[list[Datum1]] = None + data: list[Datum1] | None = None class KeyC(BaseModel): - nestedA: Optional[str] = None + nestedA: str | None = None class KeyC1(BaseModel): - nestedB: Optional[str] = None + nestedB: str | None = None class ObjectC(BaseModel): - keyC: Optional[Union[KeyC, KeyC1]] = None + keyC: KeyC | KeyC1 | None = None class KeyCItem(BaseModel): - nestedA: Optional[str] = None + nestedA: str | None = None class KeyCItem1(BaseModel): - nestedB: Optional[str] = None + nestedB: str | None = None class KeyCEnum(Enum): @@ -63,4 +63,4 @@ class KeyCEnum1(Enum): class ObjectD(BaseModel): - keyC: Optional[list[Union[KeyCItem, KeyCItem1, KeyCEnum, KeyCEnum1]]] = None + keyC: list[KeyCItem | KeyCItem1 | KeyCEnum | KeyCEnum1] | None = None diff --git a/tests/data/expected/main/jsonschema/space_field_enum_snake_case_field.py b/tests/data/expected/main/jsonschema/space_field_enum_snake_case_field.py index 70cd0a9e4..5452522e1 100644 --- a/tests/data/expected/main/jsonschema/space_field_enum_snake_case_field.py +++ b/tests/data/expected/main/jsonschema/space_field_enum_snake_case_field.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, Field @@ -15,4 +14,4 @@ class SpaceIF(Enum): class Model(BaseModel): - space_if: Optional[SpaceIF] = Field(None, alias='SpaceIF') + space_if: SpaceIF | None = Field(None, alias='SpaceIF') diff --git a/tests/data/expected/main/jsonschema/special_enum.py b/tests/data/expected/main/jsonschema/special_enum.py index 6a653c0e2..a01451b25 100644 --- a/tests/data/expected/main/jsonschema/special_enum.py +++ b/tests/data/expected/main/jsonschema/special_enum.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -22,4 +21,4 @@ class ModelEnum(Enum): class Model(BaseModel): - __root__: Optional[ModelEnum] = None + __root__: ModelEnum | None = None diff --git a/tests/data/expected/main/jsonschema/special_enum_empty_enum_field_name.py b/tests/data/expected/main/jsonschema/special_enum_empty_enum_field_name.py index d420f8ef8..3ede07729 100644 --- a/tests/data/expected/main/jsonschema/special_enum_empty_enum_field_name.py +++ b/tests/data/expected/main/jsonschema/special_enum_empty_enum_field_name.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -22,4 +21,4 @@ class ModelEnum(Enum): class Model(BaseModel): - __root__: Optional[ModelEnum] = None + __root__: ModelEnum | None = None diff --git a/tests/data/expected/main/jsonschema/special_enum_special_field_name_prefix.py b/tests/data/expected/main/jsonschema/special_enum_special_field_name_prefix.py index e18c2ed4f..6d2b79123 100644 --- a/tests/data/expected/main/jsonschema/special_enum_special_field_name_prefix.py +++ b/tests/data/expected/main/jsonschema/special_enum_special_field_name_prefix.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -22,4 +21,4 @@ class ModelEnum(Enum): class Model(BaseModel): - __root__: Optional[ModelEnum] = None + __root__: ModelEnum | None = None diff --git a/tests/data/expected/main/jsonschema/special_enum_special_field_name_prefix_keep_private.py b/tests/data/expected/main/jsonschema/special_enum_special_field_name_prefix_keep_private.py index 8c5e9dd4e..4083b4ca8 100644 --- a/tests/data/expected/main/jsonschema/special_enum_special_field_name_prefix_keep_private.py +++ b/tests/data/expected/main/jsonschema/special_enum_special_field_name_prefix_keep_private.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -22,4 +21,4 @@ class ModelEnum(Enum): class Model(BaseModel): - __root__: Optional[ModelEnum] = None + __root__: ModelEnum | None = None diff --git a/tests/data/expected/main/jsonschema/special_field_name.py b/tests/data/expected/main/jsonschema/special_field_name.py index 67272248b..c95de3f81 100644 --- a/tests/data/expected/main/jsonschema/special_field_name.py +++ b/tests/data/expected/main/jsonschema/special_field_name.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class SpecialField(BaseModel): - global_: Optional[str] = Field(None, alias='global') - with_: Optional[str] = Field(None, alias='with') - class_: Optional[int] = Field(None, alias='class') - class_s: Optional[int] = Field(None, alias="class's") - class_s_1: Optional[str] = Field(None, alias='class-s') - field_: Optional[str] = Field(None, alias='#') + global_: str | None = Field(None, alias='global') + with_: str | None = Field(None, alias='with') + class_: int | None = Field(None, alias='class') + class_s: int | None = Field(None, alias="class's") + class_s_1: str | None = Field(None, alias='class-s') + field_: str | None = Field(None, alias='#') diff --git a/tests/data/expected/main/jsonschema/special_model_remove_special_field_name_prefix.py b/tests/data/expected/main/jsonschema/special_model_remove_special_field_name_prefix.py index 7589166e6..8cd125de1 100644 --- a/tests/data/expected/main/jsonschema/special_model_remove_special_field_name_prefix.py +++ b/tests/data/expected/main/jsonschema/special_model_remove_special_field_name_prefix.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Model(BaseModel): id: AnyUrl = Field(..., alias='@id', title='Id must be presesnt and must be a URI') type: str = Field(..., alias='@type') - type_1: Optional[str] = Field(None, alias='@+!type') - type_2: Optional[str] = Field(None, alias='@-!type') - profile: Optional[str] = None + type_1: str | None = Field(None, alias='@+!type') + type_2: str | None = Field(None, alias='@-!type') + profile: str | None = None diff --git a/tests/data/expected/main/jsonschema/stdin_oneof_ref.py b/tests/data/expected/main/jsonschema/stdin_oneof_ref.py index 39d73bc8f..6f5f7ef1d 100644 --- a/tests/data/expected/main/jsonschema/stdin_oneof_ref.py +++ b/tests/data/expected/main/jsonschema/stdin_oneof_ref.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Test(BaseModel): - name: Optional[str] = None + name: str | None = None class Model(BaseModel): diff --git a/tests/data/expected/main/jsonschema/strict_types.py b/tests/data/expected/main/jsonschema/strict_types.py index 826df1be8..1bc054c57 100644 --- a/tests/data/expected/main/jsonschema/strict_types.py +++ b/tests/data/expected/main/jsonschema/strict_types.py @@ -4,20 +4,18 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field, conbytes, confloat, conint, constr class User(BaseModel): - name: Optional[str] = Field(None, example='ken') - age: Optional[int] = None - salary: Optional[conint(ge=0)] = None - debt: Optional[conint(le=0)] = None - loan: Optional[confloat(le=0.0)] = None - tel: Optional[constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$')] = None - height: Optional[confloat(ge=0.0)] = None - weight: Optional[confloat(ge=0.0)] = None - score: Optional[confloat(ge=1e-08)] = None - active: Optional[bool] = None - photo: Optional[conbytes(min_length=100)] = None + name: str | None = Field(None, example='ken') + age: int | None = None + salary: conint(ge=0) | None = None + debt: conint(le=0) | None = None + loan: confloat(le=0.0) | None = None + tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None + height: confloat(ge=0.0) | None = None + weight: confloat(ge=0.0) | None = None + score: confloat(ge=1e-08) | None = None + active: bool | None = None + photo: conbytes(min_length=100) | None = None diff --git a/tests/data/expected/main/jsonschema/strict_types_all_field_constraints.py b/tests/data/expected/main/jsonschema/strict_types_all_field_constraints.py index e0bfb8fdc..d73d8d437 100644 --- a/tests/data/expected/main/jsonschema/strict_types_all_field_constraints.py +++ b/tests/data/expected/main/jsonschema/strict_types_all_field_constraints.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import ( BaseModel, Field, @@ -18,14 +16,14 @@ class User(BaseModel): - name: Optional[StrictStr] = Field(None, example='ken') - age: Optional[StrictInt] = None - salary: Optional[StrictInt] = Field(None, ge=0) - debt: Optional[StrictInt] = Field(None, le=0) - loan: Optional[StrictFloat] = Field(None, le=0.0) - tel: Optional[StrictStr] = Field(None, regex='^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$') - height: Optional[StrictFloat] = Field(None, ge=0.0) - weight: Optional[StrictFloat] = Field(None, ge=0.0) - score: Optional[StrictFloat] = Field(None, ge=1e-08) - active: Optional[StrictBool] = None - photo: Optional[StrictBytes] = Field(None, min_length=100) + name: StrictStr | None = Field(None, example='ken') + age: StrictInt | None = None + salary: StrictInt | None = Field(None, ge=0) + debt: StrictInt | None = Field(None, le=0) + loan: StrictFloat | None = Field(None, le=0.0) + tel: StrictStr | None = Field(None, regex='^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$') + height: StrictFloat | None = Field(None, ge=0.0) + weight: StrictFloat | None = Field(None, ge=0.0) + score: StrictFloat | None = Field(None, ge=1e-08) + active: StrictBool | None = None + photo: StrictBytes | None = Field(None, min_length=100) diff --git a/tests/data/expected/main/jsonschema/subclass_enum.py b/tests/data/expected/main/jsonschema/subclass_enum.py index 6cf8395bd..747d28691 100644 --- a/tests/data/expected/main/jsonschema/subclass_enum.py +++ b/tests/data/expected/main/jsonschema/subclass_enum.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum, IntEnum -from typing import Optional from pydantic import BaseModel @@ -45,9 +44,9 @@ class UnknownEnum(Enum): class Model(BaseModel): - IntEnum: Optional[IntEnumModel] = None - FloatEnum: Optional[FloatEnum] = None - StrEnum: Optional[StrEnum] = None - NonTypedEnum: Optional[NonTypedEnum] = None - BooleanEnum: Optional[BooleanEnum] = None - UnknownEnum: Optional[UnknownEnum] = None + IntEnum: IntEnumModel | None = None + FloatEnum: FloatEnum | None = None + StrEnum: StrEnum | None = None + NonTypedEnum: NonTypedEnum | None = None + BooleanEnum: BooleanEnum | None = None + UnknownEnum: UnknownEnum | None = None diff --git a/tests/data/expected/main/jsonschema/time_delta_msgspec.py b/tests/data/expected/main/jsonschema/time_delta_msgspec.py index 832ff0fe5..27694322f 100644 --- a/tests/data/expected/main/jsonschema/time_delta_msgspec.py +++ b/tests/data/expected/main/jsonschema/time_delta_msgspec.py @@ -5,7 +5,7 @@ from __future__ import annotations from datetime import timedelta -from typing import Any, TypeAlias, Union +from typing import Any, TypeAlias from msgspec import UNSET, Struct, UnsetType @@ -13,4 +13,4 @@ class Test(Struct): - n_timedelta: Union[timedelta, UnsetType] = UNSET + n_timedelta: timedelta | UnsetType = UNSET diff --git a/tests/data/expected/main/jsonschema/time_delta_pydantic_v2.py b/tests/data/expected/main/jsonschema/time_delta_pydantic_v2.py index 182c7d907..d36389320 100644 --- a/tests/data/expected/main/jsonschema/time_delta_pydantic_v2.py +++ b/tests/data/expected/main/jsonschema/time_delta_pydantic_v2.py @@ -5,7 +5,7 @@ from __future__ import annotations from datetime import timedelta -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, RootModel @@ -15,4 +15,4 @@ class Model(RootModel[Any]): class Test(BaseModel): - n_timedelta: Optional[timedelta] = None + n_timedelta: timedelta | None = None diff --git a/tests/data/expected/main/jsonschema/title_with_dots.py b/tests/data/expected/main/jsonschema/title_with_dots.py index cce708f31..edd5b291d 100644 --- a/tests/data/expected/main/jsonschema/title_with_dots.py +++ b/tests/data/expected/main/jsonschema/title_with_dots.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Nested15(BaseModel): - value: Optional[int] = None + value: int | None = None class GenomeStudio20MethylationModule(BaseModel): - version: Optional[str] = None - nested: Optional[Nested15] = Field(None, title='Nested 1.5') + version: str | None = None + nested: Nested15 | None = Field(None, title='Nested 1.5') diff --git a/tests/data/expected/main/jsonschema/titles.py b/tests/data/expected/main/jsonschema/titles.py index 9eae10e38..c8fd51eaf 100644 --- a/tests/data/expected/main/jsonschema/titles.py +++ b/tests/data/expected/main/jsonschema/titles.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional, Union from pydantic import BaseModel, Field @@ -21,12 +20,12 @@ class Kind(BaseModel): class ExtendedProcessingTask1(BaseModel): - comment: Optional[str] = None + comment: str | None = None class ProcessingStatusUnion(BaseModel): - id: Optional[int] = None - description: Optional[str] = None + id: int | None = None + description: str | None = None class ProcessingTasksTitle(BaseModel): @@ -34,7 +33,7 @@ class ProcessingTasksTitle(BaseModel): class ExtendedProcessingTask(BaseModel): - __root__: Union[ProcessingTasksTitle, ExtendedProcessingTask1] = Field( + __root__: ProcessingTasksTitle | ExtendedProcessingTask1 = Field( ..., title='Extended Processing Task Title' ) @@ -46,12 +45,12 @@ class ExtendedProcessingTasks(BaseModel): class ProcessingTask(BaseModel): - processing_status_union: Optional[ - Union[ProcessingStatusUnion, ExtendedProcessingTask, ProcessingStatus] - ] = Field('COMPLETED', title='Processing Status Union Title') - processing_status: Optional[ProcessingStatus] = 'COMPLETED' - name: Optional[str] = None - kind: Optional[Kind] = None + processing_status_union: ( + ProcessingStatusUnion | ExtendedProcessingTask | ProcessingStatus | None + ) = Field('COMPLETED', title='Processing Status Union Title') + processing_status: ProcessingStatus | None = 'COMPLETED' + name: str | None = None + kind: Kind | None = None ProcessingTasksTitle.update_forward_refs() diff --git a/tests/data/expected/main/jsonschema/titles_use_title_as_name.py b/tests/data/expected/main/jsonschema/titles_use_title_as_name.py index 8305b5456..eb9c9b2bd 100644 --- a/tests/data/expected/main/jsonschema/titles_use_title_as_name.py +++ b/tests/data/expected/main/jsonschema/titles_use_title_as_name.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional, Union from pydantic import BaseModel, Field @@ -21,12 +20,12 @@ class Kind(BaseModel): class NestedCommentTitle(BaseModel): - comment: Optional[str] = None + comment: str | None = None class ProcessingStatusDetail(BaseModel): - id: Optional[int] = None - description: Optional[str] = None + id: int | None = None + description: str | None = None class ProcessingTasksTitle(BaseModel): @@ -34,7 +33,7 @@ class ProcessingTasksTitle(BaseModel): class ExtendedProcessingTask(BaseModel): - __root__: Union[ProcessingTasksTitle, NestedCommentTitle] = Field( + __root__: ProcessingTasksTitle | NestedCommentTitle = Field( ..., title='Extended Processing Task Title' ) @@ -46,12 +45,12 @@ class ExtendedProcessingTasksTitle(BaseModel): class ProcessingTaskTitle(BaseModel): - processing_status_union: Optional[ - Union[ProcessingStatusDetail, ExtendedProcessingTask, ProcessingStatusTitle] - ] = Field('COMPLETED', title='Processing Status Union Title') - processing_status: Optional[ProcessingStatusTitle] = 'COMPLETED' - name: Optional[str] = None - kind: Optional[Kind] = None + processing_status_union: ( + ProcessingStatusDetail | ExtendedProcessingTask | ProcessingStatusTitle | None + ) = Field('COMPLETED', title='Processing Status Union Title') + processing_status: ProcessingStatusTitle | None = 'COMPLETED' + name: str | None = None + kind: Kind | None = None ProcessingTasksTitle.update_forward_refs() diff --git a/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/basic_enum.py b/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/basic_enum.py index 2bdd68fd9..29bb535bf 100644 --- a/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/basic_enum.py +++ b/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/basic_enum.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -17,5 +16,5 @@ class ProcessingStatus(Enum): class BasicEnum(BaseModel): - processing_status: Optional[ProcessingStatus] = 'COMPLETED' - name: Optional[str] = None + processing_status: ProcessingStatus | None = 'COMPLETED' + name: str | None = None diff --git a/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/input.py b/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/input.py index b101ab998..689280b85 100644 --- a/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/input.py +++ b/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/input.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field @@ -12,5 +12,5 @@ class Input(BaseModel): - input: Optional[Any] = Field('input', title='Input') - extType: Optional[schema.ExtType] = None + input: Any | None = Field('input', title='Input') + extType: schema.ExtType | None = None diff --git a/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/output.py b/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/output.py index 20e139a39..3217ae171 100644 --- a/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/output.py +++ b/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/api/path/output.py @@ -4,10 +4,10 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field class Output(BaseModel): - output: Optional[Any] = Field('output', title='Output') + output: Any | None = Field('output', title='Output') diff --git a/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/schema.py b/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/schema.py index c07b549d1..1d610fe5f 100644 --- a/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/schema.py +++ b/tests/data/expected/main/jsonschema/treat_dot_as_module/complex/directory/schema.py @@ -4,10 +4,10 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field class ExtType(BaseModel): - ExtType: Optional[Any] = Field(None, title='ExtType') + ExtType: Any | None = Field(None, title='ExtType') diff --git a/tests/data/expected/main/jsonschema/treat_dot_as_module_single/model/schema.py b/tests/data/expected/main/jsonschema/treat_dot_as_module_single/model/schema.py index 2510d6d67..6f026d6b2 100644 --- a/tests/data/expected/main/jsonschema/treat_dot_as_module_single/model/schema.py +++ b/tests/data/expected/main/jsonschema/treat_dot_as_module_single/model/schema.py @@ -4,11 +4,9 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class User(BaseModel): name: str - age: Optional[int] = None + age: int | None = None diff --git a/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_basic_enum.py b/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_basic_enum.py index 2bdd68fd9..29bb535bf 100644 --- a/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_basic_enum.py +++ b/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_basic_enum.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -17,5 +16,5 @@ class ProcessingStatus(Enum): class BasicEnum(BaseModel): - processing_status: Optional[ProcessingStatus] = 'COMPLETED' - name: Optional[str] = None + processing_status: ProcessingStatus | None = 'COMPLETED' + name: str | None = None diff --git a/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_input.py b/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_input.py index e03e6c6ff..fc4fee71d 100644 --- a/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_input.py +++ b/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_input.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field @@ -12,5 +12,5 @@ class Input(BaseModel): - input: Optional[Any] = Field('input', title='Input') - extType: Optional[schema.ExtType] = None + input: Any | None = Field('input', title='Input') + extType: schema.ExtType | None = None diff --git a/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_output.py b/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_output.py index 20e139a39..3217ae171 100644 --- a/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_output.py +++ b/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/api_path_output.py @@ -4,10 +4,10 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field class Output(BaseModel): - output: Optional[Any] = Field('output', title='Output') + output: Any | None = Field('output', title='Output') diff --git a/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/schema.py b/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/schema.py index c07b549d1..1d610fe5f 100644 --- a/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/schema.py +++ b/tests/data/expected/main/jsonschema/treat_dot_not_as_module/complex.directory/schema.py @@ -4,10 +4,10 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field class ExtType(BaseModel): - ExtType: Optional[Any] = Field(None, title='ExtType') + ExtType: Any | None = Field(None, title='ExtType') diff --git a/tests/data/expected/main/jsonschema/type_alias.py b/tests/data/expected/main/jsonschema/type_alias.py index dbc19ee54..55d128316 100644 --- a/tests/data/expected/main/jsonschema/type_alias.py +++ b/tests/data/expected/main/jsonschema/type_alias.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Any, Optional, TypeAlias, Union +from typing import Annotated, Any, TypeAlias from pydantic import BaseModel, Field @@ -14,20 +14,20 @@ SimpleString: TypeAlias = str -UnionType: TypeAlias = Union[str, int] +UnionType: TypeAlias = str | int ArrayType: TypeAlias = list[str] AnnotatedType: TypeAlias = Annotated[ - Union[str, bool], + str | bool, Field(..., description='An annotated union type', title='MyAnnotatedType'), ] class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - union_field: Optional[UnionType] = None - array_field: Optional[ArrayType] = None - annotated_field: Optional[AnnotatedType] = None + simple_field: SimpleString | None = None + union_field: UnionType | None = None + array_field: ArrayType | None = None + annotated_field: AnnotatedType | None = None diff --git a/tests/data/expected/main/jsonschema/type_alias_py312.py b/tests/data/expected/main/jsonschema/type_alias_py312.py index 49f45f75a..9aaba3a8b 100644 --- a/tests/data/expected/main/jsonschema/type_alias_py312.py +++ b/tests/data/expected/main/jsonschema/type_alias_py312.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Any, Optional, Union +from typing import Annotated, Any from pydantic import BaseModel, Field @@ -14,20 +14,20 @@ type SimpleString = str -type UnionType = Union[str, int] +type UnionType = str | int type ArrayType = list[str] type AnnotatedType = Annotated[ - Union[str, bool], + str | bool, Field(..., description='An annotated union type', title='MyAnnotatedType'), ] class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - union_field: Optional[UnionType] = None - array_field: Optional[ArrayType] = None - annotated_field: Optional[AnnotatedType] = None + simple_field: SimpleString | None = None + union_field: UnionType | None = None + array_field: ArrayType | None = None + annotated_field: AnnotatedType | None = None diff --git a/tests/data/expected/main/jsonschema/type_alias_with_circular_ref_to_class_msgspec.py b/tests/data/expected/main/jsonschema/type_alias_with_circular_ref_to_class_msgspec.py index 2fbd2ebad..76669d1b1 100644 --- a/tests/data/expected/main/jsonschema/type_alias_with_circular_ref_to_class_msgspec.py +++ b/tests/data/expected/main/jsonschema/type_alias_with_circular_ref_to_class_msgspec.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TypeAlias, Union +from typing import TypeAlias from msgspec import Struct @@ -17,7 +17,7 @@ class SpanB(Struct): recur: list[Span] -Either: TypeAlias = Union[SpanB, "Span"] +Either: TypeAlias = SpanB | "Span" class Span(Struct): diff --git a/tests/data/expected/main/jsonschema/type_alias_with_field_description.py b/tests/data/expected/main/jsonschema/type_alias_with_field_description.py index 82129cb06..3c6c1ce05 100644 --- a/tests/data/expected/main/jsonschema/type_alias_with_field_description.py +++ b/tests/data/expected/main/jsonschema/type_alias_with_field_description.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Any, Optional, TypeAlias, Union +from typing import Annotated, Any, TypeAlias from pydantic import BaseModel, Field @@ -14,22 +14,20 @@ SimpleString: TypeAlias = str -UnionType: TypeAlias = Union[str, int] +UnionType: TypeAlias = str | int ArrayType: TypeAlias = list[str] -AnnotatedType: TypeAlias = Annotated[ - Union[str, bool], Field(..., title='MyAnnotatedType') -] +AnnotatedType: TypeAlias = Annotated[str | bool, Field(..., title='MyAnnotatedType')] """ An annotated union type """ class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - union_field: Optional[UnionType] = None - array_field: Optional[ArrayType] = None - annotated_field: Optional[AnnotatedType] = None + simple_field: SimpleString | None = None + union_field: UnionType | None = None + array_field: ArrayType | None = None + annotated_field: AnnotatedType | None = None diff --git a/tests/data/expected/main/jsonschema/type_alias_with_field_description_py312.py b/tests/data/expected/main/jsonschema/type_alias_with_field_description_py312.py index 1068e4a01..f089a40a6 100644 --- a/tests/data/expected/main/jsonschema/type_alias_with_field_description_py312.py +++ b/tests/data/expected/main/jsonschema/type_alias_with_field_description_py312.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Any, Optional, Union +from typing import Annotated, Any from pydantic import BaseModel, Field @@ -14,20 +14,20 @@ type SimpleString = str -type UnionType = Union[str, int] +type UnionType = str | int type ArrayType = list[str] -type AnnotatedType = Annotated[Union[str, bool], Field(..., title='MyAnnotatedType')] +type AnnotatedType = Annotated[str | bool, Field(..., title='MyAnnotatedType')] """ An annotated union type """ class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - union_field: Optional[UnionType] = None - array_field: Optional[ArrayType] = None - annotated_field: Optional[AnnotatedType] = None + simple_field: SimpleString | None = None + union_field: UnionType | None = None + array_field: ArrayType | None = None + annotated_field: AnnotatedType | None = None diff --git a/tests/data/expected/main/jsonschema/typed_dict_not_required_nullable.py b/tests/data/expected/main/jsonschema/typed_dict_not_required_nullable.py index 6c92f0cd7..7a61551cd 100644 --- a/tests/data/expected/main/jsonschema/typed_dict_not_required_nullable.py +++ b/tests/data/expected/main/jsonschema/typed_dict_not_required_nullable.py @@ -4,11 +4,11 @@ from __future__ import annotations -from typing import NotRequired, Optional, TypedDict +from typing import NotRequired, TypedDict class Person(TypedDict): name: str - null_name: NotRequired[Optional[str]] + null_name: NotRequired[str | None] age: NotRequired[int] - null_age: Optional[int] + null_age: int | None diff --git a/tests/data/expected/main/jsonschema/use_frozen_field_dataclass.py b/tests/data/expected/main/jsonschema/use_frozen_field_dataclass.py index 66fb61e06..3e7f7edae 100644 --- a/tests/data/expected/main/jsonschema/use_frozen_field_dataclass.py +++ b/tests/data/expected/main/jsonschema/use_frozen_field_dataclass.py @@ -5,7 +5,6 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional @dataclass @@ -13,4 +12,4 @@ class User: id: int name: str password: str - created_at: Optional[str] = None + created_at: str | None = None diff --git a/tests/data/expected/main/jsonschema/use_frozen_field_no_readonly.py b/tests/data/expected/main/jsonschema/use_frozen_field_no_readonly.py index 21e460322..9515df8a5 100644 --- a/tests/data/expected/main/jsonschema/use_frozen_field_no_readonly.py +++ b/tests/data/expected/main/jsonschema/use_frozen_field_no_readonly.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, Field, RootModel @@ -14,12 +14,12 @@ class Model(RootModel[Any]): class User(BaseModel): - name: Optional[str] = Field(None, examples=['ken']) + name: str | None = Field(None, examples=['ken']) pets: list[User] = Field(default_factory=list) class Pet(BaseModel): - name: Optional[str] = Field(None, examples=['dog', 'cat']) + name: str | None = Field(None, examples=['dog', 'cat']) User.model_rebuild() diff --git a/tests/data/expected/main/jsonschema/use_frozen_field_v1.py b/tests/data/expected/main/jsonschema/use_frozen_field_v1.py index 44be517e8..e31e15ca6 100644 --- a/tests/data/expected/main/jsonschema/use_frozen_field_v1.py +++ b/tests/data/expected/main/jsonschema/use_frozen_field_v1.py @@ -5,7 +5,6 @@ from __future__ import annotations from datetime import datetime -from typing import Optional from pydantic import BaseModel, Field @@ -17,4 +16,4 @@ class Config: id: int = Field(..., allow_mutation=False, description='Server-generated ID') name: str password: str = Field(..., description='User password') - created_at: Optional[datetime] = Field(None, allow_mutation=False) + created_at: datetime | None = Field(None, allow_mutation=False) diff --git a/tests/data/expected/main/jsonschema/use_frozen_field_v2.py b/tests/data/expected/main/jsonschema/use_frozen_field_v2.py index b03243f15..5e99f8663 100644 --- a/tests/data/expected/main/jsonschema/use_frozen_field_v2.py +++ b/tests/data/expected/main/jsonschema/use_frozen_field_v2.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import AwareDatetime, BaseModel, Field @@ -13,4 +11,4 @@ class User(BaseModel): id: int = Field(..., description='Server-generated ID', frozen=True) name: str password: str = Field(..., description='User password') - created_at: Optional[AwareDatetime] = Field(None, frozen=True) + created_at: AwareDatetime | None = Field(None, frozen=True) diff --git a/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py b/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py index 978072cab..426939080 100644 --- a/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py +++ b/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional, Union from pydantic import BaseModel @@ -21,12 +20,12 @@ class Kind(BaseModel): class ExtendedProcessingTask1(BaseModel): - comment: Optional[str] = None + comment: str | None = None class ProcessingStatusUnion(BaseModel): - id: Optional[int] = None - description: Optional[str] = None + id: int | None = None + description: str | None = None class Model(BaseModel): @@ -34,7 +33,7 @@ class Model(BaseModel): class ExtendedProcessingTask(BaseModel): - __root__: Union[Model, ExtendedProcessingTask1] + __root__: Model | ExtendedProcessingTask1 class ExtendedProcessingTasks(BaseModel): @@ -42,12 +41,12 @@ class ExtendedProcessingTasks(BaseModel): class ProcessingTask(BaseModel): - processing_status_union: Optional[ - Union[ProcessingStatusUnion, ExtendedProcessingTask, ProcessingStatus] - ] = 'COMPLETED' - processing_status: Optional[ProcessingStatus] = 'COMPLETED' - name: Optional[str] = None - kind: Optional[Kind] = None + processing_status_union: ( + ProcessingStatusUnion | ExtendedProcessingTask | ProcessingStatus | None + ) = 'COMPLETED' + processing_status: ProcessingStatus | None = 'COMPLETED' + name: str | None = None + kind: Kind | None = None Model.update_forward_refs() diff --git a/tests/data/expected/main/openapi/additional_properties.py b/tests/data/expected/main/openapi/additional_properties.py index e71f87edd..159705b95 100644 --- a/tests/data/expected/main/openapi/additional_properties.py +++ b/tests/data/expected/main/openapi/additional_properties.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Extra, Field @@ -15,7 +13,7 @@ class Config: id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -31,7 +29,7 @@ class Config: id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -67,36 +65,36 @@ class Event(BaseModel): class Config: extra = Extra.forbid - name: Optional[str] = None + name: str | None = None class Result(BaseModel): class Config: extra = Extra.forbid - event: Optional[Event] = None + event: Event | None = None class Broken(BaseModel): class Config: extra = Extra.forbid - foo: Optional[str] = None - bar: Optional[int] = None + foo: str | None = None + bar: int | None = None class BrokenArray(BaseModel): class Config: extra = Extra.forbid - broken: Optional[dict[str, list[Broken]]] = None + broken: dict[str, list[Broken]] | None = None class FileSetUpload(BaseModel): class Config: extra = Extra.forbid - task_id: Optional[str] = Field(None, title='task id') + task_id: str | None = Field(None, title='task id') tags: dict[str, list[str]] = Field( ..., title='Dict of tags, each containing a list of file names' ) @@ -106,5 +104,5 @@ class Test(BaseModel): class Config: extra = Extra.forbid - broken: Optional[dict[str, Broken]] = None - failing: Optional[dict[str, str]] = {} + broken: dict[str, Broken] | None = None + failing: dict[str, str] | None = {} diff --git a/tests/data/expected/main/openapi/all_exports_no_child/parent/__init__.py b/tests/data/expected/main/openapi/all_exports_no_child/parent/__init__.py index 5605e87fc..15ec41ebf 100644 --- a/tests/data/expected/main/openapi/all_exports_no_child/parent/__init__.py +++ b/tests/data/expected/main/openapi/all_exports_no_child/parent/__init__.py @@ -3,10 +3,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class ParentModel(BaseModel): - id: Optional[str] = None + id: str | None = None diff --git a/tests/data/expected/main/openapi/all_exports_no_child/parent/child/deep.py b/tests/data/expected/main/openapi/all_exports_no_child/parent/child/deep.py index 6ee105bb8..2510054b2 100644 --- a/tests/data/expected/main/openapi/all_exports_no_child/parent/child/deep.py +++ b/tests/data/expected/main/openapi/all_exports_no_child/parent/child/deep.py @@ -3,10 +3,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class DeepModel(BaseModel): - name: Optional[str] = None + name: str | None = None diff --git a/tests/data/expected/main/openapi/all_exports_with_local_models/pkg/__init__.py b/tests/data/expected/main/openapi/all_exports_with_local_models/pkg/__init__.py index 3401e9c03..636dc12f7 100644 --- a/tests/data/expected/main/openapi/all_exports_with_local_models/pkg/__init__.py +++ b/tests/data/expected/main/openapi/all_exports_with_local_models/pkg/__init__.py @@ -3,8 +3,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .sub import ChildModel @@ -17,8 +15,8 @@ class LocalModel(BaseModel): - id: Optional[str] = None + id: str | None = None class AnotherLocal(BaseModel): - name: Optional[str] = None + name: str | None = None diff --git a/tests/data/expected/main/openapi/all_exports_with_local_models/pkg/sub.py b/tests/data/expected/main/openapi/all_exports_with_local_models/pkg/sub.py index 8961ed484..6ab6c662b 100644 --- a/tests/data/expected/main/openapi/all_exports_with_local_models/pkg/sub.py +++ b/tests/data/expected/main/openapi/all_exports_with_local_models/pkg/sub.py @@ -3,10 +3,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class ChildModel(BaseModel): - value: Optional[int] = None + value: int | None = None diff --git a/tests/data/expected/main/openapi/all_of_with_relative_ref.py b/tests/data/expected/main/openapi/all_of_with_relative_ref.py index 55f708fd5..f992cd4aa 100644 --- a/tests/data/expected/main/openapi/all_of_with_relative_ref.py +++ b/tests/data/expected/main/openapi/all_of_with_relative_ref.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, ConfigDict, RootModel @@ -14,7 +13,7 @@ class Animal(BaseModel): model_config = ConfigDict( extra='forbid', ) - kind: Optional[Kind] = None + kind: Kind | None = None """ The kind of the animal """ @@ -33,7 +32,7 @@ class Pet(BaseModel): model_config = ConfigDict( extra='forbid', ) - kind: Optional[Kind] = None + kind: Kind | None = None """ The kind of the pet """ diff --git a/tests/data/expected/main/openapi/allof_enum_ref.py b/tests/data/expected/main/openapi/allof_enum_ref.py index 48d3e79d2..b4d772189 100644 --- a/tests/data/expected/main/openapi/allof_enum_ref.py +++ b/tests/data/expected/main/openapi/allof_enum_ref.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel @@ -21,4 +20,4 @@ class QuantityTrunc(BaseModel): class CreateOrderByEstimateRequest(BaseModel): - quantity_trunc: Optional[QuantityTrunc] = None + quantity_trunc: QuantityTrunc | None = None diff --git a/tests/data/expected/main/openapi/allof_materialize_defaults.py b/tests/data/expected/main/openapi/allof_materialize_defaults.py index d5c62182d..fbf330651 100644 --- a/tests/data/expected/main/openapi/allof_materialize_defaults.py +++ b/tests/data/expected/main/openapi/allof_materialize_defaults.py @@ -4,16 +4,14 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, conint, constr class Parent(BaseModel): - name: Optional[constr(min_length=1)] = 'parent_default' - count: Optional[conint(ge=0)] = 10 + name: constr(min_length=1) | None = 'parent_default' + count: conint(ge=0) | None = 10 class Child(Parent): - name: Optional[constr(min_length=1, max_length=100)] = 'parent_default' - count: Optional[conint(ge=0, le=1000)] = 10 + name: constr(min_length=1, max_length=100) | None = 'parent_default' + count: conint(ge=0, le=1000) | None = 10 diff --git a/tests/data/expected/main/openapi/allof_merge_mode_none.py b/tests/data/expected/main/openapi/allof_merge_mode_none.py index 50d7b8bb0..ed7b07314 100644 --- a/tests/data/expected/main/openapi/allof_merge_mode_none.py +++ b/tests/data/expected/main/openapi/allof_merge_mode_none.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, constr class Parent(BaseModel): - name: Optional[constr(min_length=1)] = 'parent_default' + name: constr(min_length=1) | None = 'parent_default' class Child(Parent): - name: Optional[constr(min_length=1)] = None + name: constr(min_length=1) | None = None diff --git a/tests/data/expected/main/openapi/allof_multiple_parents_same_property.py b/tests/data/expected/main/openapi/allof_multiple_parents_same_property.py index 0bde1a042..0a529cacb 100644 --- a/tests/data/expected/main/openapi/allof_multiple_parents_same_property.py +++ b/tests/data/expected/main/openapi/allof_multiple_parents_same_property.py @@ -4,20 +4,18 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, conint, constr class Parent1(BaseModel): - name: Optional[constr(min_length=1)] = None + name: constr(min_length=1) | None = None class Parent2(BaseModel): - name: Optional[constr(min_length=5)] = None - age: Optional[conint(ge=0)] = None + name: constr(min_length=5) | None = None + age: conint(ge=0) | None = None class Child(BaseModel): - name: Optional[constr(min_length=5, max_length=100)] = None - age: Optional[conint(ge=0, le=150)] = None + name: constr(min_length=5, max_length=100) | None = None + age: conint(ge=0, le=150) | None = None diff --git a/tests/data/expected/main/openapi/allof_parent_bool_property.py b/tests/data/expected/main/openapi/allof_parent_bool_property.py index 76bfd589a..c3af931cf 100644 --- a/tests/data/expected/main/openapi/allof_parent_bool_property.py +++ b/tests/data/expected/main/openapi/allof_parent_bool_property.py @@ -4,15 +4,15 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, constr class Parent(BaseModel): - name: Optional[constr(min_length=1)] = None - allowed: Optional[Any] = None + name: constr(min_length=1) | None = None + allowed: Any | None = None class Child(Parent): - name: Optional[constr(min_length=1, max_length=100)] = None + name: constr(min_length=1, max_length=100) | None = None diff --git a/tests/data/expected/main/openapi/allof_parent_no_properties.py b/tests/data/expected/main/openapi/allof_parent_no_properties.py index 5cf249b86..b39739077 100644 --- a/tests/data/expected/main/openapi/allof_parent_no_properties.py +++ b/tests/data/expected/main/openapi/allof_parent_no_properties.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, constr @@ -14,4 +12,4 @@ class EmptyParent(BaseModel): class Child(EmptyParent): - name: Optional[constr(max_length=100)] = None + name: constr(max_length=100) | None = None diff --git a/tests/data/expected/main/openapi/allof_partial_override_array_items.py b/tests/data/expected/main/openapi/allof_partial_override_array_items.py index 9d2134dce..39eae6248 100644 --- a/tests/data/expected/main/openapi/allof_partial_override_array_items.py +++ b/tests/data/expected/main/openapi/allof_partial_override_array_items.py @@ -4,16 +4,14 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Thing(BaseModel): - type: Optional[str] = 'playground:Thing' - type_list: Optional[list[str]] = ['playground:Thing'] + type: str | None = 'playground:Thing' + type_list: list[str] | None = ['playground:Thing'] class Person(Thing): - type: Optional[str] = 'playground:Person' - type_list: Optional[list[str]] = ['playground:Person'] + type: str | None = 'playground:Person' + type_list: list[str] | None = ['playground:Person'] diff --git a/tests/data/expected/main/openapi/allof_partial_override_array_items_no_parent.py b/tests/data/expected/main/openapi/allof_partial_override_array_items_no_parent.py index cd07d55c4..01eeb3410 100644 --- a/tests/data/expected/main/openapi/allof_partial_override_array_items_no_parent.py +++ b/tests/data/expected/main/openapi/allof_partial_override_array_items_no_parent.py @@ -4,14 +4,14 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Thing(BaseModel): - name: Optional[str] = None + name: str | None = None class Person(Thing): - tags: Optional[list[Any]] = ['tag1'] + tags: list[Any] | None = ['tag1'] diff --git a/tests/data/expected/main/openapi/allof_partial_override_deeply_nested_array.py b/tests/data/expected/main/openapi/allof_partial_override_deeply_nested_array.py index ca5d8da8c..5928d6439 100644 --- a/tests/data/expected/main/openapi/allof_partial_override_deeply_nested_array.py +++ b/tests/data/expected/main/openapi/allof_partial_override_deeply_nested_array.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Thing(BaseModel): - cube: Optional[list[list[list[str]]]] = [[['a']]] + cube: list[list[list[str]]] | None = [[['a']]] class Person(Thing): - cube: Optional[list[list[list[str]]]] = [[['b']]] + cube: list[list[list[str]]] | None = [[['b']]] diff --git a/tests/data/expected/main/openapi/allof_partial_override_inherited_types.py b/tests/data/expected/main/openapi/allof_partial_override_inherited_types.py index a54db1b37..922bddd1d 100644 --- a/tests/data/expected/main/openapi/allof_partial_override_inherited_types.py +++ b/tests/data/expected/main/openapi/allof_partial_override_inherited_types.py @@ -4,17 +4,15 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Thing(BaseModel): - type: Optional[str] = None - name: Optional[str] = Field(None, description='First and Last name') + type: str | None = None + name: str | None = Field(None, description='First and Last name') class Person(Thing): - type: Optional[str] = 'playground:Person' + type: str | None = 'playground:Person' name: str = Field(..., description='First and Last name') - age: Optional[int] = None + age: int | None = None diff --git a/tests/data/expected/main/openapi/allof_partial_override_nested_array_items.py b/tests/data/expected/main/openapi/allof_partial_override_nested_array_items.py index 5a8eb5766..51cd816c2 100644 --- a/tests/data/expected/main/openapi/allof_partial_override_nested_array_items.py +++ b/tests/data/expected/main/openapi/allof_partial_override_nested_array_items.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Thing(BaseModel): - matrix: Optional[list[list[str]]] = [['a', 'b']] + matrix: list[list[str]] | None = [['a', 'b']] class Person(Thing): - matrix: Optional[list[list[str]]] = [['c', 'd']] + matrix: list[list[str]] | None = [['c', 'd']] diff --git a/tests/data/expected/main/openapi/allof_partial_override_non_array_field.py b/tests/data/expected/main/openapi/allof_partial_override_non_array_field.py index 08578b1f0..18f51dbcc 100644 --- a/tests/data/expected/main/openapi/allof_partial_override_non_array_field.py +++ b/tests/data/expected/main/openapi/allof_partial_override_non_array_field.py @@ -4,16 +4,14 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Thing(BaseModel): - name: Optional[str] = 'default_name' - count: Optional[int] = 0 + name: str | None = 'default_name' + count: int | None = 0 class Person(Thing): - name: Optional[str] = Field(None, title='Person name') - count: Optional[int] = Field(None, description='Count value') + name: str | None = Field(None, title='Person name') + count: int | None = Field(None, description='Count value') diff --git a/tests/data/expected/main/openapi/allof_partial_override_simple_list_any.py b/tests/data/expected/main/openapi/allof_partial_override_simple_list_any.py index 8fbeb2e37..eb317125f 100644 --- a/tests/data/expected/main/openapi/allof_partial_override_simple_list_any.py +++ b/tests/data/expected/main/openapi/allof_partial_override_simple_list_any.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Parent(BaseModel): - items: Optional[list[str]] = None + items: list[str] | None = None class Child(Parent): - items: Optional[list[str]] = None + items: list[str] | None = None diff --git a/tests/data/expected/main/openapi/allof_partial_override_unique_items.py b/tests/data/expected/main/openapi/allof_partial_override_unique_items.py index e3696b160..531209c49 100644 --- a/tests/data/expected/main/openapi/allof_partial_override_unique_items.py +++ b/tests/data/expected/main/openapi/allof_partial_override_unique_items.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Thing(BaseModel): - tags: Optional[set[str]] = Field(None, unique_items=True) + tags: set[str] | None = Field(None, unique_items=True) class Person(Thing): - tags: Optional[set[str]] = Field({'tag2'}, unique_items=True) + tags: set[str] | None = Field({'tag2'}, unique_items=True) diff --git a/tests/data/expected/main/openapi/allof_partial_override_unique_items_pydantic_v2.py b/tests/data/expected/main/openapi/allof_partial_override_unique_items_pydantic_v2.py index ec48f1f5e..50bf41b7f 100644 --- a/tests/data/expected/main/openapi/allof_partial_override_unique_items_pydantic_v2.py +++ b/tests/data/expected/main/openapi/allof_partial_override_unique_items_pydantic_v2.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Thing(BaseModel): - tags: Optional[set[str]] = None + tags: set[str] | None = None class Person(Thing): - tags: Optional[set[str]] = {'tag2'} + tags: set[str] | None = {'tag2'} diff --git a/tests/data/expected/main/openapi/allof_property_bool_schema.py b/tests/data/expected/main/openapi/allof_property_bool_schema.py index 6acac63a6..bb88bdd5d 100644 --- a/tests/data/expected/main/openapi/allof_property_bool_schema.py +++ b/tests/data/expected/main/openapi/allof_property_bool_schema.py @@ -4,15 +4,15 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, constr class Parent(BaseModel): - name: Optional[constr(min_length=1)] = None + name: constr(min_length=1) | None = None class Child(Parent): - name: Optional[constr(min_length=1, max_length=100)] = None - allowed: Optional[Any] = None + name: constr(min_length=1, max_length=100) | None = None + allowed: Any | None = None diff --git a/tests/data/expected/main/openapi/allof_required.py b/tests/data/expected/main/openapi/allof_required.py index 17ee2100a..bb02d2611 100644 --- a/tests/data/expected/main/openapi/allof_required.py +++ b/tests/data/expected/main/openapi/allof_required.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, constr @@ -16,4 +14,4 @@ class Foo(BaseModel): class Bar(Foo): type: constr(regex=r'service') - name: Optional[str] = None + name: str | None = None diff --git a/tests/data/expected/main/openapi/allof_with_anyof_ref.py b/tests/data/expected/main/openapi/allof_with_anyof_ref.py index 4a5f2bb1e..739fcc635 100644 --- a/tests/data/expected/main/openapi/allof_with_anyof_ref.py +++ b/tests/data/expected/main/openapi/allof_with_anyof_ref.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Union from pydantic import BaseModel, RootModel @@ -28,8 +27,8 @@ class NumberItem(BaseModel): value: int -class Item(RootModel[Union[TextItem, NumberItem]]): - root: Union[TextItem, NumberItem] +class Item(RootModel[TextItem | NumberItem]): + root: TextItem | NumberItem class ItemPostRequest1(BaseModel): @@ -44,5 +43,5 @@ class ItemPostRequest3(NumberItem, ItemPostRequest1): pass -class ItemPostRequest(RootModel[Union[ItemPostRequest2, ItemPostRequest3]]): - root: Union[ItemPostRequest2, ItemPostRequest3] +class ItemPostRequest(RootModel[ItemPostRequest2 | ItemPostRequest3]): + root: ItemPostRequest2 | ItemPostRequest3 diff --git a/tests/data/expected/main/openapi/allof_with_oneof_ref.py b/tests/data/expected/main/openapi/allof_with_oneof_ref.py index 864bdf3dc..beefe896c 100644 --- a/tests/data/expected/main/openapi/allof_with_oneof_ref.py +++ b/tests/data/expected/main/openapi/allof_with_oneof_ref.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Union +from typing import Literal from pydantic import BaseModel, Field, RootModel @@ -28,8 +28,8 @@ class RegularUser(BaseModel): username: str -class User(RootModel[Union[AdminUser, RegularUser]]): - root: Union[AdminUser, RegularUser] = Field(..., discriminator='userType') +class User(RootModel[AdminUser | RegularUser]): + root: AdminUser | RegularUser = Field(..., discriminator='userType') class UserPostRequest1(BaseModel): @@ -44,5 +44,5 @@ class UserPostRequest3(RegularUser, UserPostRequest1): pass -class UserPostRequest(RootModel[Union[UserPostRequest2, UserPostRequest3]]): - root: Union[UserPostRequest2, UserPostRequest3] +class UserPostRequest(RootModel[UserPostRequest2 | UserPostRequest3]): + root: UserPostRequest2 | UserPostRequest3 diff --git a/tests/data/expected/main/openapi/allof_with_required_inherited_complex_allof.py b/tests/data/expected/main/openapi/allof_with_required_inherited_complex_allof.py index f3e1c7a23..954df04cc 100644 --- a/tests/data/expected/main/openapi/allof_with_required_inherited_complex_allof.py +++ b/tests/data/expected/main/openapi/allof_with_required_inherited_complex_allof.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, confloat, constr @@ -18,12 +16,12 @@ class NumberConstraint(BaseModel): class BaseConfig(BaseModel): - name: Optional[str] = None - enabled: Optional[bool] = None + name: str | None = None + enabled: bool | None = None class ExtendedConfig(BaseModel): - timeout: Optional[int] = None + timeout: int | None = None class Score(BaseModel): @@ -39,15 +37,15 @@ class Metadata(BaseModel): class ProjectedItem(BaseModel): - id: Optional[int] = None - code: Optional[StringConstraint] = None - score: Optional[Score] = None - config: Optional[Config] = None - metadata: Optional[Metadata] = None + id: int | None = None + code: StringConstraint | None = None + score: Score | None = None + config: Config | None = None + metadata: Metadata | None = None class Item(ProjectedItem): - extra: Optional[str] = None + extra: str | None = None id: int code: StringConstraint score: confloat(ge=0.0, le=100.0) diff --git a/tests/data/expected/main/openapi/allof_with_required_inherited_comprehensive.py b/tests/data/expected/main/openapi/allof_with_required_inherited_comprehensive.py index 6154d4e35..0d6c25d6e 100644 --- a/tests/data/expected/main/openapi/allof_with_required_inherited_comprehensive.py +++ b/tests/data/expected/main/openapi/allof_with_required_inherited_comprehensive.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel, constr @@ -16,11 +16,11 @@ class Status(Enum): class BaseType(BaseModel): - id: Optional[int] = None + id: int | None = None class ObjectWithProps(BaseModel): - nested: Optional[str] = None + nested: str | None = None class AllofPrimitivesWithConstraints(BaseModel): @@ -36,41 +36,41 @@ class AllofWithUnique(BaseModel): class Level2(BaseModel): - level3: Optional[str] = None + level3: str | None = None class Level1(BaseModel): - level2: Optional[Level2] = None + level2: Level2 | None = None class DeepNested(BaseModel): - level1: Optional[Level1] = None + level1: Level1 | None = None class ProjectedEntity(BaseModel): - primitive_string: Optional[str] = None - primitive_int: Optional[int] = None - primitive_number: Optional[float] = None - primitive_bool: Optional[bool] = None - ref_field: Optional[BaseType] = None - enum_field: Optional[Status] = None - array_with_ref: Optional[list[BaseType]] = None - array_with_primitive: Optional[list[str]] = None - object_with_props: Optional[ObjectWithProps] = None - object_with_additional: Optional[dict[str, int]] = None - anyof_field: Optional[Union[str, int]] = None - oneof_field: Optional[Union[bool, float]] = None - allof_single_ref: Optional[BaseType] = None - allof_multiple_refs: Optional[BaseType] = None - allof_primitives_with_constraints: Optional[AllofPrimitivesWithConstraints] = None - allof_with_pattern: Optional[AllofWithPattern] = None - allof_with_unique: Optional[AllofWithUnique] = None - type_list: Optional[str] = None - deep_nested: Optional[DeepNested] = None + primitive_string: str | None = None + primitive_int: int | None = None + primitive_number: float | None = None + primitive_bool: bool | None = None + ref_field: BaseType | None = None + enum_field: Status | None = None + array_with_ref: list[BaseType] | None = None + array_with_primitive: list[str] | None = None + object_with_props: ObjectWithProps | None = None + object_with_additional: dict[str, int] | None = None + anyof_field: str | int | None = None + oneof_field: bool | float | None = None + allof_single_ref: BaseType | None = None + allof_multiple_refs: BaseType | None = None + allof_primitives_with_constraints: AllofPrimitivesWithConstraints | None = None + allof_with_pattern: AllofWithPattern | None = None + allof_with_unique: AllofWithUnique | None = None + type_list: str | None = None + deep_nested: DeepNested | None = None class Entity(ProjectedEntity): - extra: Optional[str] = None + extra: str | None = None primitive_string: str primitive_int: int primitive_number: float @@ -81,12 +81,12 @@ class Entity(ProjectedEntity): array_with_primitive: list[str] object_with_props: dict[str, Any] object_with_additional: dict[str, int] - anyof_field: Union[str, int] - oneof_field: Union[bool, float] + anyof_field: str | int + oneof_field: bool | float allof_single_ref: BaseType allof_multiple_refs: BaseType allof_primitives_with_constraints: constr(min_length=5, max_length=100) allof_with_pattern: constr(regex=r'(?=^[a-z]+)(?=[0-9]$)') allof_with_unique: list[str] - type_list: Optional[str] + type_list: str | None deep_nested: dict[str, Any] diff --git a/tests/data/expected/main/openapi/allof_with_required_inherited_coverage.py b/tests/data/expected/main/openapi/allof_with_required_inherited_coverage.py index 512fe1cdc..b3c4322d6 100644 --- a/tests/data/expected/main/openapi/allof_with_required_inherited_coverage.py +++ b/tests/data/expected/main/openapi/allof_with_required_inherited_coverage.py @@ -4,13 +4,13 @@ from __future__ import annotations -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel, conint class ConstraintOnlyBase(BaseModel): - field_with_constraints: Optional[Any] = None + field_with_constraints: Any | None = None class MultipleField(BaseModel): @@ -18,7 +18,7 @@ class MultipleField(BaseModel): class MultipleOfBase(BaseModel): - multiple_field: Optional[MultipleField] = None + multiple_field: MultipleField | None = None class SimpleString(BaseModel): @@ -26,74 +26,72 @@ class SimpleString(BaseModel): class NestedAnyOfWithRef(BaseModel): - nested_anyof: Optional[Union[SimpleString, int]] = None + nested_anyof: SimpleString | int | None = None class L4(BaseModel): - l5: Optional[str] = None + l5: str | None = None class L3(BaseModel): - l4: Optional[L4] = None + l4: L4 | None = None class L2(BaseModel): - l3: Optional[L3] = None + l3: L3 | None = None class L1(BaseModel): - l2: Optional[L2] = None + l2: L2 | None = None class DeepArrayItem(BaseModel): - l1: Optional[L1] = None + l1: L1 | None = None class DeepNestedArray(BaseModel): - deep_array: Optional[list[DeepArrayItem]] = None + deep_array: list[DeepArrayItem] | None = None class OneOfBase(BaseModel): - oneof_field: Optional[Union[str, int]] = None + oneof_field: str | int | None = None class SingleOneOf(BaseModel): - single_oneof: Optional[str] = None + single_oneof: str | None = None class L31(BaseModel): - l4: Optional[str] = None + l4: str | None = None class L21(BaseModel): - l3: Optional[L31] = None + l3: L31 | None = None class L11(BaseModel): - l2: Optional[L21] = None + l2: L21 | None = None class DeepDict(BaseModel): - l1: Optional[L11] = None + l1: L11 | None = None class AdditionalPropsDeep(BaseModel): - deep_dict: Optional[dict[str, DeepDict]] = None + deep_dict: dict[str, DeepDict] | None = None class ObjectAllof(BaseModel): - a: Optional[str] = None - b: Optional[int] = None + a: str | None = None + b: int | None = None class ObjectOnlyAllOf(BaseModel): - object_allof: Optional[ObjectAllof] = None + object_allof: ObjectAllof | None = None class LargeUnion(BaseModel): - large_union: Optional[Union[str, int, bool, float, list[str], dict[str, Any]]] = ( - None - ) + large_union: str | int | bool | float | list[str] | dict[str, Any] | None = None class BaseWithNoProperties(BaseModel): @@ -101,16 +99,16 @@ class BaseWithNoProperties(BaseModel): class BaseWithBooleanProperty(BaseModel): - bool_prop: Optional[bool] = None + bool_prop: bool | None = None class ChildOfNoProps(BaseWithNoProperties): - extra: Optional[str] = None + extra: str | None = None some_field: Any class NestedAllOfRef(BaseModel): - nested_allof_ref: Optional[SimpleString] = None + nested_allof_ref: SimpleString | None = None class NestedIndirect1(BaseModel): @@ -126,7 +124,7 @@ class NestedIndirect(BaseModel): class NestedAllOfWithoutDirectRef(BaseModel): - nested_indirect: Optional[NestedIndirect] = None + nested_indirect: NestedIndirect | None = None class EnumField(BaseModel): @@ -134,11 +132,11 @@ class EnumField(BaseModel): class EnumInAllOf(BaseModel): - enum_field: Optional[EnumField] = None + enum_field: EnumField | None = None class RefWithPrimitiveBase(BaseModel): - ref_and_primitive: Optional[SimpleString] = None + ref_and_primitive: SimpleString | None = None class EdgeCasesCoverage( @@ -156,13 +154,13 @@ class EdgeCasesCoverage( NestedAllOfWithoutDirectRef, EnumInAllOf, ): - local_field: Optional[str] = None + local_field: str | None = None field_with_constraints: Any multiple_field: conint(multiple_of=5) ref_and_primitive: SimpleString - nested_anyof: Union[SimpleString, int] + nested_anyof: SimpleString | int deep_array: list[dict[str, Any]] - oneof_field: Union[str, int] + oneof_field: str | int single_oneof: str deep_dict: dict[str, dict[str, Any]] object_allof: dict[str, Any] diff --git a/tests/data/expected/main/openapi/allof_with_required_inherited_edge_cases.py b/tests/data/expected/main/openapi/allof_with_required_inherited_edge_cases.py index 38ba2b371..4fa802d9a 100644 --- a/tests/data/expected/main/openapi/allof_with_required_inherited_edge_cases.py +++ b/tests/data/expected/main/openapi/allof_with_required_inherited_edge_cases.py @@ -5,13 +5,13 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel, conint class BaseRef(BaseModel): - id: Optional[int] = None + id: int | None = None class StatusEnum(Enum): @@ -40,7 +40,7 @@ class AllofUniqueItems(BaseModel): class ObjectWithoutAdditional(BaseModel): - nested: Optional[str] = None + nested: str | None = None class MultipleAdditionalProps(BaseModel): @@ -48,44 +48,44 @@ class MultipleAdditionalProps(BaseModel): class L3(BaseModel): - l4: Optional[str] = None + l4: str | None = None class L2(BaseModel): - l3: Optional[L3] = None + l3: L3 | None = None class L1(BaseModel): - l2: Optional[L2] = None + l2: L2 | None = None class DepthLimitTest(BaseModel): - l1: Optional[L1] = None + l1: L1 | None = None class ProjectedEdgeCases(BaseModel): - single_allof_primitive: Optional[SingleAllofPrimitive] = None - single_allof_ref: Optional[BaseRef] = None - allof_with_enum: Optional[StatusEnum] = None - allof_nested_anyof: Optional[AllofNestedAnyof] = None - allof_constraint_only: Optional[AllofConstraintOnly] = None - allof_max_constraints: Optional[AllofMaxConstraints] = None - allof_unique_items: Optional[AllofUniqueItems] = None - object_without_additional: Optional[ObjectWithoutAdditional] = None - object_only_type: Optional[dict[str, Any]] = None - multiple_additional_props: Optional[MultipleAdditionalProps] = None - depth_limit_test: Optional[DepthLimitTest] = None - cycle_detection: Optional[BaseRef] = None - type_list_field: Optional[Union[str, int]] = None - allof_multiple_refs_only: Optional[BaseRef] = None + single_allof_primitive: SingleAllofPrimitive | None = None + single_allof_ref: BaseRef | None = None + allof_with_enum: StatusEnum | None = None + allof_nested_anyof: AllofNestedAnyof | None = None + allof_constraint_only: AllofConstraintOnly | None = None + allof_max_constraints: AllofMaxConstraints | None = None + allof_unique_items: AllofUniqueItems | None = None + object_without_additional: ObjectWithoutAdditional | None = None + object_only_type: dict[str, Any] | None = None + multiple_additional_props: MultipleAdditionalProps | None = None + depth_limit_test: DepthLimitTest | None = None + cycle_detection: BaseRef | None = None + type_list_field: str | int | None = None + allof_multiple_refs_only: BaseRef | None = None class EdgeCases(ProjectedEdgeCases): - extra: Optional[str] = None + extra: str | None = None single_allof_primitive: str single_allof_ref: BaseRef allof_with_enum: StatusEnum - allof_nested_anyof: Union[str, int] + allof_nested_anyof: str | int allof_constraint_only: Any allof_max_constraints: conint(le=50) allof_unique_items: list[str] @@ -94,5 +94,5 @@ class EdgeCases(ProjectedEdgeCases): multiple_additional_props: dict[str, BaseRef] depth_limit_test: dict[str, Any] cycle_detection: BaseRef - type_list_field: Union[str, int] + type_list_field: str | int allof_multiple_refs_only: BaseRef diff --git a/tests/data/expected/main/openapi/allof_with_required_inherited_fields.py b/tests/data/expected/main/openapi/allof_with_required_inherited_fields.py index 84372ca73..65409f54d 100644 --- a/tests/data/expected/main/openapi/allof_with_required_inherited_fields.py +++ b/tests/data/expected/main/openapi/allof_with_required_inherited_fields.py @@ -4,18 +4,16 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class ProjectedPet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None + id: int | None = None + name: str | None = None class Pet(ProjectedPet): - tag: Optional[str] = None + tag: str | None = None opts: list[str] id: int name: str diff --git a/tests/data/expected/main/openapi/allof_with_required_inherited_fields_force_optional.py b/tests/data/expected/main/openapi/allof_with_required_inherited_fields_force_optional.py index fae32dcc1..e0ae6be22 100644 --- a/tests/data/expected/main/openapi/allof_with_required_inherited_fields_force_optional.py +++ b/tests/data/expected/main/openapi/allof_with_required_inherited_fields_force_optional.py @@ -4,16 +4,14 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class ProjectedPet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None + id: int | None = None + name: str | None = None class Pet(ProjectedPet): - tag: Optional[str] = None - opts: Optional[list[str]] = None + tag: str | None = None + opts: list[str] | None = None diff --git a/tests/data/expected/main/openapi/allof_with_required_inherited_nested_object.py b/tests/data/expected/main/openapi/allof_with_required_inherited_nested_object.py index e665529f9..31b559bf7 100644 --- a/tests/data/expected/main/openapi/allof_with_required_inherited_nested_object.py +++ b/tests/data/expected/main/openapi/allof_with_required_inherited_nested_object.py @@ -4,37 +4,37 @@ from __future__ import annotations -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel class Address(BaseModel): - street: Optional[str] = None - city: Optional[str] = None + street: str | None = None + city: str | None = None class ContactInfo(BaseModel): - email: Optional[str] = None - phone: Optional[str] = None + email: str | None = None + phone: str | None = None class ProjectedPerson(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - address: Optional[Address] = None - metadata: Optional[dict[str, str]] = None - contact: Optional[ContactInfo] = None - tags: Optional[list[str]] = None - priority: Optional[Union[int, str]] = None + id: int | None = None + name: str | None = None + address: Address | None = None + metadata: dict[str, str] | None = None + contact: ContactInfo | None = None + tags: list[str] | None = None + priority: int | str | None = None class Person(ProjectedPerson): - nickname: Optional[str] = None + nickname: str | None = None id: int name: str address: dict[str, Any] metadata: dict[str, str] contact: ContactInfo tags: list[str] - priority: Union[int, str] + priority: int | str diff --git a/tests/data/expected/main/openapi/allow_extra_fields.py b/tests/data/expected/main/openapi/allow_extra_fields.py index 7b1bf4ce0..902e1064f 100644 --- a/tests/data/expected/main/openapi/allow_extra_fields.py +++ b/tests/data/expected/main/openapi/allow_extra_fields.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Extra, Field @@ -15,7 +13,7 @@ class Config: id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -31,7 +29,7 @@ class Config: id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -67,16 +65,16 @@ class Api(BaseModel): class Config: extra = Extra.allow - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -92,11 +90,11 @@ class Event(BaseModel): class Config: extra = Extra.allow - name: Optional[str] = None + name: str | None = None class Result(BaseModel): class Config: extra = Extra.allow - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/allow_extra_fields_pydantic_v2.py b/tests/data/expected/main/openapi/allow_extra_fields_pydantic_v2.py index cbdd66bee..801effefe 100644 --- a/tests/data/expected/main/openapi/allow_extra_fields_pydantic_v2.py +++ b/tests/data/expected/main/openapi/allow_extra_fields_pydantic_v2.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel @@ -15,7 +13,7 @@ class Pet(BaseModel): ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(RootModel[list[Pet]]): @@ -28,7 +26,7 @@ class User(BaseModel): ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(RootModel[list[User]]): @@ -55,16 +53,16 @@ class Api(BaseModel): model_config = ConfigDict( extra='allow', ) - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -77,11 +75,11 @@ class Event(BaseModel): model_config = ConfigDict( extra='allow', ) - name: Optional[str] = None + name: str | None = None class Result(BaseModel): model_config = ConfigDict( extra='allow', ) - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/allow_population_by_field_name.py b/tests/data/expected/main/openapi/allow_population_by_field_name.py index c275c1aca..7670c2ece 100644 --- a/tests/data/expected/main/openapi/allow_population_by_field_name.py +++ b/tests/data/expected/main/openapi/allow_population_by_field_name.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field @@ -15,7 +13,7 @@ class Config: id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -31,7 +29,7 @@ class Config: id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -67,16 +65,16 @@ class Api(BaseModel): class Config: allow_population_by_field_name = True - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -92,11 +90,11 @@ class Event(BaseModel): class Config: allow_population_by_field_name = True - name: Optional[str] = None + name: str | None = None class Result(BaseModel): class Config: allow_population_by_field_name = True - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/allow_population_by_field_name_pydantic_v2.py b/tests/data/expected/main/openapi/allow_population_by_field_name_pydantic_v2.py index a569e6c54..447ea2d33 100644 --- a/tests/data/expected/main/openapi/allow_population_by_field_name_pydantic_v2.py +++ b/tests/data/expected/main/openapi/allow_population_by_field_name_pydantic_v2.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel @@ -15,7 +13,7 @@ class Pet(BaseModel): ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(RootModel[list[Pet]]): @@ -31,7 +29,7 @@ class User(BaseModel): ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(RootModel[list[User]]): @@ -67,16 +65,16 @@ class Api(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -92,11 +90,11 @@ class Event(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - name: Optional[str] = None + name: str | None = None class Result(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/base_class.py b/tests/data/expected/main/openapi/base_class.py index 675a11aa8..b23cc56fb 100644 --- a/tests/data/expected/main/openapi/base_class.py +++ b/tests/data/expected/main/openapi/base_class.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, Field from custom_module import Base @@ -14,7 +12,7 @@ class Pet(Base): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(Base): @@ -24,7 +22,7 @@ class Pets(Base): class User(Base): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(Base): @@ -45,16 +43,16 @@ class Error(Base): class Api(Base): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -64,8 +62,8 @@ class Apis(Base): class Event(Base): - name: Optional[str] = None + name: str | None = None class Result(Base): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/body_and_parameters/general.py b/tests/data/expected/main/openapi/body_and_parameters/general.py index 21feccda0..0f64dbdf9 100644 --- a/tests/data/expected/main/openapi/body_and_parameters/general.py +++ b/tests/data/expected/main/openapi/body_and_parameters/general.py @@ -5,7 +5,6 @@ from __future__ import annotations from datetime import datetime -from typing import Optional from pydantic import BaseModel @@ -13,7 +12,7 @@ class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Error(BaseModel): @@ -22,8 +21,8 @@ class Error(BaseModel): class PetForm(BaseModel): - name: Optional[str] = None - age: Optional[int] = None + name: str | None = None + age: int | None = None class PetsGetResponse(BaseModel): @@ -37,19 +36,19 @@ class FoodFoodIdGetResponse(BaseModel): class UserGetResponse(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UserPostRequest(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UsersGetResponseItem(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UsersGetResponse(BaseModel): @@ -59,7 +58,7 @@ class UsersGetResponse(BaseModel): class UsersPostRequestItem(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UsersPostRequest(BaseModel): diff --git a/tests/data/expected/main/openapi/body_and_parameters/only_paths.py b/tests/data/expected/main/openapi/body_and_parameters/only_paths.py index 2948ab139..83d2d562a 100644 --- a/tests/data/expected/main/openapi/body_and_parameters/only_paths.py +++ b/tests/data/expected/main/openapi/body_and_parameters/only_paths.py @@ -5,7 +5,6 @@ from __future__ import annotations from datetime import datetime -from typing import Optional from pydantic import BaseModel @@ -17,19 +16,19 @@ class FoodFoodIdGetResponse(BaseModel): class UserGetResponse(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UserPostRequest(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UsersGetResponseItem(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UsersGetResponse(BaseModel): @@ -39,7 +38,7 @@ class UsersGetResponse(BaseModel): class UsersPostRequestItem(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UsersPostRequest(BaseModel): @@ -54,12 +53,12 @@ class Error(BaseModel): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class PetForm(BaseModel): - name: Optional[str] = None - age: Optional[int] = None + name: str | None = None + age: int | None = None class PetsGetResponse(BaseModel): diff --git a/tests/data/expected/main/openapi/body_and_parameters/only_schemas.py b/tests/data/expected/main/openapi/body_and_parameters/only_schemas.py index ae3a4eb58..8baa15bc6 100644 --- a/tests/data/expected/main/openapi/body_and_parameters/only_schemas.py +++ b/tests/data/expected/main/openapi/body_and_parameters/only_schemas.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Error(BaseModel): @@ -21,5 +19,5 @@ class Error(BaseModel): class PetForm(BaseModel): - name: Optional[str] = None - age: Optional[int] = None + name: str | None = None + age: int | None = None diff --git a/tests/data/expected/main/openapi/body_and_parameters/remote_ref.py b/tests/data/expected/main/openapi/body_and_parameters/remote_ref.py index d205e636e..ad7b26b8d 100644 --- a/tests/data/expected/main/openapi/body_and_parameters/remote_ref.py +++ b/tests/data/expected/main/openapi/body_and_parameters/remote_ref.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Error(BaseModel): @@ -21,8 +19,8 @@ class Error(BaseModel): class PetForm(BaseModel): - name: Optional[str] = None - age: Optional[int] = None + name: str | None = None + age: int | None = None class PetsGetResponse(BaseModel): diff --git a/tests/data/expected/main/openapi/circular_imports_acyclic/__init__.py b/tests/data/expected/main/openapi/circular_imports_acyclic/__init__.py index 69450f57e..c4ed87799 100644 --- a/tests/data/expected/main/openapi/circular_imports_acyclic/__init__.py +++ b/tests/data/expected/main/openapi/circular_imports_acyclic/__init__.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class RootModel(BaseModel): - id: Optional[str] = None + id: str | None = None diff --git a/tests/data/expected/main/openapi/circular_imports_acyclic/sub.py b/tests/data/expected/main/openapi/circular_imports_acyclic/sub.py index 819eac1a2..3ead0fbc6 100644 --- a/tests/data/expected/main/openapi/circular_imports_acyclic/sub.py +++ b/tests/data/expected/main/openapi/circular_imports_acyclic/sub.py @@ -4,17 +4,15 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import RootModel class ChildModel(BaseModel): - id: Optional[str] = None - parent: Optional[RootModel] = None + id: str | None = None + parent: RootModel | None = None class AnotherChild(BaseModel): - sibling: Optional[ChildModel] = None + sibling: ChildModel | None = None diff --git a/tests/data/expected/main/openapi/circular_imports_class_conflict/_internal.py b/tests/data/expected/main/openapi/circular_imports_class_conflict/_internal.py index a8b64866e..ce44f16be 100644 --- a/tests/data/expected/main/openapi/circular_imports_class_conflict/_internal.py +++ b/tests/data/expected/main/openapi/circular_imports_class_conflict/_internal.py @@ -4,44 +4,42 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Item(BaseModel): - id: Optional[str] = None - sub_item: Optional[Authorization] = None + id: str | None = None + sub_item: Authorization | None = None class Item_1(BaseModel): - id: Optional[str] = None + id: str | None = None class Invoice(BaseModel): - id: Optional[str] = None - billing_item: Optional[Item_1] = None - session: Optional[Session] = None + id: str | None = None + billing_item: Item_1 | None = None + session: Session | None = None class Item_2(BaseModel): - id: Optional[str] = None + id: str | None = None class Session(BaseModel): - id: Optional[str] = None - checkout_item: Optional[Item_2] = None - root_item: Optional[Item] = None + id: str | None = None + checkout_item: Item_2 | None = None + root_item: Item | None = None class Item_3(BaseModel): - id: Optional[str] = None + id: str | None = None class Authorization(BaseModel): - id: Optional[str] = None - item: Optional[Item_3] = None - invoice: Optional[Invoice] = None + id: str | None = None + item: Item_3 | None = None + invoice: Invoice | None = None Item.update_forward_refs() diff --git a/tests/data/expected/main/openapi/circular_imports_different_prefixes/_internal.py b/tests/data/expected/main/openapi/circular_imports_different_prefixes/_internal.py index 89c9aa393..346f3192f 100644 --- a/tests/data/expected/main/openapi/circular_imports_different_prefixes/_internal.py +++ b/tests/data/expected/main/openapi/circular_imports_different_prefixes/_internal.py @@ -4,29 +4,27 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Root(BaseModel): - id: Optional[str] = None - alpha_ref: Optional[Model] = None + id: str | None = None + alpha_ref: Model | None = None class Model(BaseModel): - id: Optional[str] = None - beta_ref: Optional[Model_1] = None + id: str | None = None + beta_ref: Model_1 | None = None class Model_1(BaseModel): - id: Optional[str] = None - gamma_ref: Optional[Model_2] = None + id: str | None = None + gamma_ref: Model_2 | None = None class Model_2(BaseModel): - id: Optional[str] = None - root_ref: Optional[Root] = None + id: str | None = None + root_ref: Root | None = None Root.update_forward_refs() diff --git a/tests/data/expected/main/openapi/circular_imports_mixed_prefixes/_internal.py b/tests/data/expected/main/openapi/circular_imports_mixed_prefixes/_internal.py index 4c73f76c0..bfe0c4fa1 100644 --- a/tests/data/expected/main/openapi/circular_imports_mixed_prefixes/_internal.py +++ b/tests/data/expected/main/openapi/circular_imports_mixed_prefixes/_internal.py @@ -4,34 +4,32 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Root(BaseModel): - id: Optional[str] = None - a_ref: Optional[Model] = None + id: str | None = None + a_ref: Model | None = None class Model(BaseModel): - id: Optional[str] = None - b_ref: Optional[Model_1] = None + id: str | None = None + b_ref: Model_1 | None = None class Model_1(BaseModel): - id: Optional[str] = None - c_ref: Optional[Model_2] = None + id: str | None = None + c_ref: Model_2 | None = None class Model_2(BaseModel): - id: Optional[str] = None - other_ref: Optional[Model_3] = None + id: str | None = None + other_ref: Model_3 | None = None class Model_3(BaseModel): - id: Optional[str] = None - root_ref: Optional[Root] = None + id: str | None = None + root_ref: Root | None = None Root.update_forward_refs() diff --git a/tests/data/expected/main/openapi/circular_imports_small_cycle/_internal.py b/tests/data/expected/main/openapi/circular_imports_small_cycle/_internal.py index 344e7bf8a..b7a08a1fc 100644 --- a/tests/data/expected/main/openapi/circular_imports_small_cycle/_internal.py +++ b/tests/data/expected/main/openapi/circular_imports_small_cycle/_internal.py @@ -4,19 +4,17 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Parent(BaseModel): - id: Optional[str] = None - child: Optional[Child] = None + id: str | None = None + child: Child | None = None class Child(BaseModel): - id: Optional[str] = None - parent: Optional[Parent] = None + id: str | None = None + parent: Parent | None = None Parent.update_forward_refs() diff --git a/tests/data/expected/main/openapi/circular_imports_stripe_like/_internal.py b/tests/data/expected/main/openapi/circular_imports_stripe_like/_internal.py index 37754d4e0..7af62c85e 100644 --- a/tests/data/expected/main/openapi/circular_imports_stripe_like/_internal.py +++ b/tests/data/expected/main/openapi/circular_imports_stripe_like/_internal.py @@ -4,48 +4,46 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class BalanceTransaction(BaseModel): - id: Optional[str] = None - amount: Optional[int] = None - source: Optional[Authorization] = None + id: str | None = None + amount: int | None = None + source: Authorization | None = None class Subscription(BaseModel): - id: Optional[str] = None - plan: Optional[str] = None + id: str | None = None + plan: str | None = None class Invoice(BaseModel): - id: Optional[str] = None - session: Optional[Session] = None - subscription: Optional[Subscription] = None + id: str | None = None + session: Session | None = None + subscription: Subscription | None = None class LineItem(BaseModel): - id: Optional[str] = None - price: Optional[int] = None + id: str | None = None + price: int | None = None class Session(BaseModel): - id: Optional[str] = None - transaction: Optional[BalanceTransaction] = None - line_items: Optional[list[LineItem]] = None + id: str | None = None + transaction: BalanceTransaction | None = None + line_items: list[LineItem] | None = None class Cardholder(BaseModel): - id: Optional[str] = None - name: Optional[str] = None + id: str | None = None + name: str | None = None class Authorization(BaseModel): - id: Optional[str] = None - invoice: Optional[Invoice] = None - cardholder: Optional[Cardholder] = None + id: str | None = None + invoice: Invoice | None = None + cardholder: Cardholder | None = None BalanceTransaction.update_forward_refs() diff --git a/tests/data/expected/main/openapi/circular_imports_with_inheritance/_internal.py b/tests/data/expected/main/openapi/circular_imports_with_inheritance/_internal.py index bab8d8c4a..9ca92be6c 100644 --- a/tests/data/expected/main/openapi/circular_imports_with_inheritance/_internal.py +++ b/tests/data/expected/main/openapi/circular_imports_with_inheritance/_internal.py @@ -4,34 +4,32 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class BaseEntity(BaseModel): - id: Optional[str] = None - created_at: Optional[str] = None + id: str | None = None + created_at: str | None = None class RootModel(BaseModel): - id: Optional[str] = None - auth: Optional[Authorization] = None + id: str | None = None + auth: Authorization | None = None class Invoice(BaseEntity): - total: Optional[int] = None - session: Optional[Session] = None + total: int | None = None + session: Session | None = None class Session(BaseEntity): - status: Optional[str] = None - root_ref: Optional[RootModel] = None + status: str | None = None + root_ref: RootModel | None = None class Authorization(BaseEntity): - amount: Optional[int] = None - invoice: Optional[Invoice] = None + amount: int | None = None + invoice: Invoice | None = None RootModel.update_forward_refs() diff --git a/tests/data/expected/main/openapi/collapse_root_models.py b/tests/data/expected/main/openapi/collapse_root_models.py index edd4502ff..3b32843d4 100644 --- a/tests/data/expected/main/openapi/collapse_root_models.py +++ b/tests/data/expected/main/openapi/collapse_root_models.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field, constr class Tweet(BaseModel): - author_id: Optional[str] = None + author_id: str | None = None class Users(BaseModel): @@ -24,9 +22,9 @@ class FileRequest(BaseModel): class ImageRequest(BaseModel): - image_hash: Optional[ - constr(regex=r'^[a-fA-F\d]{32}$', min_length=64, max_length=64) - ] = Field(None, description='For image') + image_hash: ( + constr(regex=r'^[a-fA-F\d]{32}$', min_length=64, max_length=64) | None + ) = Field(None, description='For image') class FileHashes(BaseModel): diff --git a/tests/data/expected/main/openapi/collapse_root_models_field_constraints.py b/tests/data/expected/main/openapi/collapse_root_models_field_constraints.py index b8510ce3d..daf55a516 100644 --- a/tests/data/expected/main/openapi/collapse_root_models_field_constraints.py +++ b/tests/data/expected/main/openapi/collapse_root_models_field_constraints.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Tweet(BaseModel): - author_id: Optional[str] = None + author_id: str | None = None class Users(BaseModel): @@ -38,7 +36,7 @@ class FileRequest(BaseModel): class ImageRequest(BaseModel): - image_hash: Optional[str] = Field( + image_hash: str | None = Field( None, description='For image', max_length=64, diff --git a/tests/data/expected/main/openapi/collapse_root_models_with_references_to_flat_types.py b/tests/data/expected/main/openapi/collapse_root_models_with_references_to_flat_types.py index 0e6eff78e..d9e122b4e 100644 --- a/tests/data/expected/main/openapi/collapse_root_models_with_references_to_flat_types.py +++ b/tests/data/expected/main/openapi/collapse_root_models_with_references_to_flat_types.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class FooModel(BaseModel): - foo: Optional[str] = None + foo: str | None = None diff --git a/tests/data/expected/main/openapi/complex_reference.py b/tests/data/expected/main/openapi/complex_reference.py index c5301eaa8..bea2f8d3f 100644 --- a/tests/data/expected/main/openapi/complex_reference.py +++ b/tests/data/expected/main/openapi/complex_reference.py @@ -4,13 +4,11 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class A(BaseModel): - a_property: Optional[B1] = None + a_property: B1 | None = None class B1(A): diff --git a/tests/data/expected/main/openapi/content_in_parameters.py b/tests/data/expected/main/openapi/content_in_parameters.py index b0899cd7e..519cd9934 100644 --- a/tests/data/expected/main/openapi/content_in_parameters.py +++ b/tests/data/expected/main/openapi/content_in_parameters.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Error(BaseModel): @@ -21,5 +19,5 @@ class Error(BaseModel): class PetForm(BaseModel): - name: Optional[str] = None - age: Optional[int] = None + name: str | None = None + age: int | None = None diff --git a/tests/data/expected/main/openapi/custom_file_header.py b/tests/data/expected/main/openapi/custom_file_header.py index cc297b910..cef0e3f42 100644 --- a/tests/data/expected/main/openapi/custom_file_header.py +++ b/tests/data/expected/main/openapi/custom_file_header.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -22,7 +20,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -43,16 +41,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -62,8 +60,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/custom_file_header_comments_only.py b/tests/data/expected/main/openapi/custom_file_header_comments_only.py index d641a4e70..ef645b4dd 100644 --- a/tests/data/expected/main/openapi/custom_file_header_comments_only.py +++ b/tests/data/expected/main/openapi/custom_file_header_comments_only.py @@ -3,15 +3,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -21,7 +19,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -42,16 +40,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -61,8 +59,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/custom_file_header_empty.py b/tests/data/expected/main/openapi/custom_file_header_empty.py index b753b36f2..fcd2dade2 100644 --- a/tests/data/expected/main/openapi/custom_file_header_empty.py +++ b/tests/data/expected/main/openapi/custom_file_header_empty.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -22,7 +20,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -43,16 +41,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -62,8 +60,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/custom_file_header_invalid_syntax.py b/tests/data/expected/main/openapi/custom_file_header_invalid_syntax.py index 5024b9052..b2dadbbf5 100644 --- a/tests/data/expected/main/openapi/custom_file_header_invalid_syntax.py +++ b/tests/data/expected/main/openapi/custom_file_header_invalid_syntax.py @@ -4,15 +4,13 @@ # Valid comment def incomplete( -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -22,7 +20,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -43,16 +41,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -62,8 +60,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/custom_file_header_no_future.py b/tests/data/expected/main/openapi/custom_file_header_no_future.py index a6b5e0fbc..0588a1a2b 100644 --- a/tests/data/expected/main/openapi/custom_file_header_no_future.py +++ b/tests/data/expected/main/openapi/custom_file_header_no_future.py @@ -3,15 +3,13 @@ # file ; -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -21,7 +19,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -42,16 +40,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -61,8 +59,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/custom_file_header_with_docstring.py b/tests/data/expected/main/openapi/custom_file_header_with_docstring.py index 213234636..1b1dfc627 100644 --- a/tests/data/expected/main/openapi/custom_file_header_with_docstring.py +++ b/tests/data/expected/main/openapi/custom_file_header_with_docstring.py @@ -5,15 +5,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -23,7 +21,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -44,16 +42,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -63,8 +61,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/custom_file_header_with_docstring_and_import.py b/tests/data/expected/main/openapi/custom_file_header_with_docstring_and_import.py index 680c2e4a2..3e2e38915 100644 --- a/tests/data/expected/main/openapi/custom_file_header_with_docstring_and_import.py +++ b/tests/data/expected/main/openapi/custom_file_header_with_docstring_and_import.py @@ -9,15 +9,13 @@ if TYPE_CHECKING: from collections.abc import Sequence -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -27,7 +25,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -48,16 +46,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -67,8 +65,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/custom_file_header_with_import.py b/tests/data/expected/main/openapi/custom_file_header_with_import.py index f797ac780..44c737c57 100644 --- a/tests/data/expected/main/openapi/custom_file_header_with_import.py +++ b/tests/data/expected/main/openapi/custom_file_header_with_import.py @@ -6,15 +6,13 @@ if TYPE_CHECKING: from collections.abc import Sequence -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -24,7 +22,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -45,16 +43,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -64,8 +62,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/custom_id_pydantic_v2.py b/tests/data/expected/main/openapi/custom_id_pydantic_v2.py index 422e5bce5..71cdbd890 100644 --- a/tests/data/expected/main/openapi/custom_id_pydantic_v2.py +++ b/tests/data/expected/main/openapi/custom_id_pydantic_v2.py @@ -4,7 +4,6 @@ from __future__ import annotations -from typing import Optional from uuid import UUID from pydantic import BaseModel, Field, RootModel @@ -15,4 +14,4 @@ class CustomId(RootModel[UUID]): class Model(BaseModel): - custom_id: Optional[CustomId] = None + custom_id: CustomId | None = None diff --git a/tests/data/expected/main/openapi/custom_template_dir.py b/tests/data/expected/main/openapi/custom_template_dir.py index 4f8ae1cb7..e6cd63708 100644 --- a/tests/data/expected/main/openapi/custom_template_dir.py +++ b/tests/data/expected/main/openapi/custom_template_dir.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): # 1 2, 1 2, this is just a pet id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -22,7 +20,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -43,10 +41,10 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = None - apiVersionNumber: Optional[str] = None - apiUrl: Optional[AnyUrl] = None - apiDocumentationUrl: Optional[AnyUrl] = None + apiKey: str | None = None + apiVersionNumber: str | None = None + apiUrl: AnyUrl | None = None + apiDocumentationUrl: AnyUrl | None = None class Apis(BaseModel): @@ -54,8 +52,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/dataclass.py b/tests/data/expected/main/openapi/dataclass.py index 347651d54..d064d80d1 100644 --- a/tests/data/expected/main/openapi/dataclass.py +++ b/tests/data/expected/main/openapi/dataclass.py @@ -5,14 +5,14 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional, TypeAlias +from typing import TypeAlias @dataclass class Pet: id: int name: str - tag: Optional[str] = None + tag: str | None = None Pets: TypeAlias = list[Pet] @@ -22,7 +22,7 @@ class Pet: class User: id: int name: str - tag: Optional[str] = None + tag: str | None = None Users: TypeAlias = list[User] @@ -42,10 +42,10 @@ class Error: @dataclass class Api: - apiKey: Optional[str] = None - apiVersionNumber: Optional[str] = None - apiUrl: Optional[str] = None - apiDocumentationUrl: Optional[str] = None + apiKey: str | None = None + apiVersionNumber: str | None = None + apiUrl: str | None = None + apiDocumentationUrl: str | None = None Apis: TypeAlias = list[Api] @@ -53,9 +53,9 @@ class Api: @dataclass class Event: - name: Optional[str] = None + name: str | None = None @dataclass class Result: - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/dataclass_base_class.py b/tests/data/expected/main/openapi/dataclass_base_class.py index 2a688212b..41fca8789 100644 --- a/tests/data/expected/main/openapi/dataclass_base_class.py +++ b/tests/data/expected/main/openapi/dataclass_base_class.py @@ -5,7 +5,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional, TypeAlias +from typing import TypeAlias from custom_base import Base @@ -14,7 +14,7 @@ class Pet(Base): id: int name: str - tag: Optional[str] = None + tag: str | None = None Pets: TypeAlias = list[Pet] @@ -24,7 +24,7 @@ class Pet(Base): class User(Base): id: int name: str - tag: Optional[str] = None + tag: str | None = None Users: TypeAlias = list[User] @@ -44,10 +44,10 @@ class Error(Base): @dataclass class Api(Base): - apiKey: Optional[str] = None - apiVersionNumber: Optional[str] = None - apiUrl: Optional[str] = None - apiDocumentationUrl: Optional[str] = None + apiKey: str | None = None + apiVersionNumber: str | None = None + apiUrl: str | None = None + apiDocumentationUrl: str | None = None Apis: TypeAlias = list[Api] @@ -55,9 +55,9 @@ class Api(Base): @dataclass class Event(Base): - name: Optional[str] = None + name: str | None = None @dataclass class Result(Base): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/dataclass_inheritance_field_ordering_py310.py b/tests/data/expected/main/openapi/dataclass_inheritance_field_ordering_py310.py index e43ca83e6..b8012611c 100644 --- a/tests/data/expected/main/openapi/dataclass_inheritance_field_ordering_py310.py +++ b/tests/data/expected/main/openapi/dataclass_inheritance_field_ordering_py310.py @@ -5,13 +5,12 @@ from __future__ import annotations from dataclasses import dataclass, field -from typing import Optional @dataclass class ParentWithDefault: - name: Optional[str] = 'default_name' - read_only_field: Optional[str] = None + name: str | None = 'default_name' + read_only_field: str | None = None @dataclass diff --git a/tests/data/expected/main/openapi/dataclass_keyword_only.py b/tests/data/expected/main/openapi/dataclass_keyword_only.py index a3d089302..a0c1f0a33 100644 --- a/tests/data/expected/main/openapi/dataclass_keyword_only.py +++ b/tests/data/expected/main/openapi/dataclass_keyword_only.py @@ -5,17 +5,16 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional @dataclass(kw_only=True) class Base: id: str - createdAt: Optional[str] = None - version: Optional[float] = 1 + createdAt: str | None = None + version: float | None = 1 @dataclass(kw_only=True) class Child(Base): title: str - url: Optional[str] = 'https://example.com' + url: str | None = 'https://example.com' diff --git a/tests/data/expected/main/openapi/default_object/Another.py b/tests/data/expected/main/openapi/default_object/Another.py index fcebdcb5f..8bc084fdf 100644 --- a/tests/data/expected/main/openapi/default_object/Another.py +++ b/tests/data/expected/main/openapi/default_object/Another.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field from . import Foo as Foo_1 @@ -17,9 +15,9 @@ class Foo(BaseModel): class Bar(BaseModel): - original_foo: Optional[Foo_1] = Field( + original_foo: Foo_1 | None = Field( default_factory=lambda: Foo_1.parse_obj({'text': 'abc', 'number': 123}) ) - nested_foo: Optional[list[Nested.Foo]] = Field( + nested_foo: list[Nested.Foo] | None = Field( default_factory=lambda: [Nested.Foo.parse_obj(v) for v in ['abc', 'efg']] ) diff --git a/tests/data/expected/main/openapi/default_object/Nested.py b/tests/data/expected/main/openapi/default_object/Nested.py index 7a628fac2..5e334d2b9 100644 --- a/tests/data/expected/main/openapi/default_object/Nested.py +++ b/tests/data/expected/main/openapi/default_object/Nested.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field from . import Foo as Foo_1 @@ -16,15 +14,13 @@ class Foo(BaseModel): class Bar(BaseModel): - foo: Optional[Foo_1] = Field( + foo: Foo_1 | None = Field( default_factory=lambda: Foo_1.parse_obj({'text': 'abc', 'number': 123}) ) - baz: Optional[list[Foo_1]] = Field( + baz: list[Foo_1] | None = Field( default_factory=lambda: [ Foo_1.parse_obj(v) for v in [{'text': 'abc', 'number': 123}, {'text': 'efg', 'number': 456}] ] ) - nested_foo: Optional[Foo] = Field( - default_factory=lambda: Foo.parse_obj('default foo') - ) + nested_foo: Foo | None = Field(default_factory=lambda: Foo.parse_obj('default foo')) diff --git a/tests/data/expected/main/openapi/default_object/__init__.py b/tests/data/expected/main/openapi/default_object/__init__.py index 57ae80f0d..e7b64564f 100644 --- a/tests/data/expected/main/openapi/default_object/__init__.py +++ b/tests/data/expected/main/openapi/default_object/__init__.py @@ -4,21 +4,19 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field class Foo(BaseModel): - text: Optional[str] = '987' - number: Optional[float] = None + text: str | None = '987' + number: float | None = None class Bar(BaseModel): - foo: Optional[Foo] = Field( + foo: Foo | None = Field( default_factory=lambda: Foo.parse_obj({'text': 'abc', 'number': 123}) ) - baz: Optional[list[Foo]] = Field( + baz: list[Foo] | None = Field( default_factory=lambda: [ Foo.parse_obj(v) for v in [{'text': 'abc', 'number': 123}, {'text': 'efg', 'number': 456}] diff --git a/tests/data/expected/main/openapi/disable_appending_item_suffix.py b/tests/data/expected/main/openapi/disable_appending_item_suffix.py index 44a1e61ef..259858d64 100644 --- a/tests/data/expected/main/openapi/disable_appending_item_suffix.py +++ b/tests/data/expected/main/openapi/disable_appending_item_suffix.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int = Field(..., ge=0, le=9223372036854775807) name: str = Field(..., max_length=256) - tag: Optional[str] = Field(None, max_length=64) + tag: str | None = Field(None, max_length=64) class Pets(BaseModel): @@ -34,14 +32,14 @@ class Fax(BaseModel): class User(BaseModel): id: int = Field(..., ge=0) name: str = Field(..., max_length=256) - tag: Optional[str] = Field(None, max_length=64) + tag: str | None = Field(None, max_length=64) uid: UID - phones: Optional[list[Phone]] = Field(None, max_items=10) - fax: Optional[list[Fax]] = None - height: Optional[Union[int, float]] = Field(None, ge=1.0, le=300.0) - weight: Optional[Union[float, int]] = Field(None, ge=1.0, le=1000.0) - age: Optional[int] = Field(None, gt=0, le=200) - rating: Optional[float] = Field(None, gt=0.0, le=5.0) + phones: list[Phone] | None = Field(None, max_items=10) + fax: list[Fax] | None = None + height: int | float | None = Field(None, ge=1.0, le=300.0) + weight: float | int | None = Field(None, ge=1.0, le=1000.0) + age: int | None = Field(None, gt=0, le=200) + rating: float | None = Field(None, gt=0.0, le=5.0) class Users(BaseModel): @@ -62,16 +60,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -81,8 +79,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/disable_timestamp.py b/tests/data/expected/main/openapi/disable_timestamp.py index 33f7a223d..08f36debf 100644 --- a/tests/data/expected/main/openapi/disable_timestamp.py +++ b/tests/data/expected/main/openapi/disable_timestamp.py @@ -3,15 +3,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -21,7 +19,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -42,16 +40,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -61,8 +59,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/discriminator/allof_no_subtypes.py b/tests/data/expected/main/openapi/discriminator/allof_no_subtypes.py index 4ec1e1440..930a1cb9f 100644 --- a/tests/data/expected/main/openapi/discriminator/allof_no_subtypes.py +++ b/tests/data/expected/main/openapi/discriminator/allof_no_subtypes.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field @@ -14,11 +12,11 @@ class BaseItem(BaseModel): class FooItem(BaseModel): - fooValue: Optional[str] = None + fooValue: str | None = None class BarItem(BaseModel): - barValue: Optional[int] = None + barValue: int | None = None class ItemContainer(BaseModel): diff --git a/tests/data/expected/main/openapi/discriminator/dataclass_enum_one_literal_as_default.py b/tests/data/expected/main/openapi/discriminator/dataclass_enum_one_literal_as_default.py index 3f14bff2d..40a3e5a63 100644 --- a/tests/data/expected/main/openapi/discriminator/dataclass_enum_one_literal_as_default.py +++ b/tests/data/expected/main/openapi/discriminator/dataclass_enum_one_literal_as_default.py @@ -6,7 +6,7 @@ from dataclasses import dataclass, field from enum import Enum -from typing import Literal, TypeAlias, Union +from typing import Literal, TypeAlias class RequestVersionEnum(Enum): @@ -30,4 +30,4 @@ class RequestV2(RequestBase): version: Literal['v2'] = 'v2' -Request: TypeAlias = Union[RequestV1, RequestV2] +Request: TypeAlias = RequestV1 | RequestV2 diff --git a/tests/data/expected/main/openapi/discriminator/dataclass_enum_one_literal_as_default_py310.py b/tests/data/expected/main/openapi/discriminator/dataclass_enum_one_literal_as_default_py310.py index 3f14bff2d..40a3e5a63 100644 --- a/tests/data/expected/main/openapi/discriminator/dataclass_enum_one_literal_as_default_py310.py +++ b/tests/data/expected/main/openapi/discriminator/dataclass_enum_one_literal_as_default_py310.py @@ -6,7 +6,7 @@ from dataclasses import dataclass, field from enum import Enum -from typing import Literal, TypeAlias, Union +from typing import Literal, TypeAlias class RequestVersionEnum(Enum): @@ -30,4 +30,4 @@ class RequestV2(RequestBase): version: Literal['v2'] = 'v2' -Request: TypeAlias = Union[RequestV1, RequestV2] +Request: TypeAlias = RequestV1 | RequestV2 diff --git a/tests/data/expected/main/openapi/discriminator/enum.py b/tests/data/expected/main/openapi/discriminator/enum.py index b2a4ad60f..71894bce9 100644 --- a/tests/data/expected/main/openapi/discriminator/enum.py +++ b/tests/data/expected/main/openapi/discriminator/enum.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Union +from typing import Literal from pydantic import BaseModel, Field, RootModel @@ -28,5 +28,5 @@ class RequestV2(RequestBase): version: Literal['v2'] -class Request(RootModel[Union[RequestV1, RequestV2]]): - root: Union[RequestV1, RequestV2] = Field(..., discriminator='version') +class Request(RootModel[RequestV1 | RequestV2]): + root: RequestV1 | RequestV2 = Field(..., discriminator='version') diff --git a/tests/data/expected/main/openapi/discriminator/enum_duplicate.py b/tests/data/expected/main/openapi/discriminator/enum_duplicate.py index 083fa72b4..afb3adbc5 100644 --- a/tests/data/expected/main/openapi/discriminator/enum_duplicate.py +++ b/tests/data/expected/main/openapi/discriminator/enum_duplicate.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -31,7 +31,5 @@ class Lizard(BaseModel): class Animal(BaseModel): - pet: Optional[Union[Cat, Dog, Lizard]] = Field( - None, discriminator='pet_type', title='Pet' - ) - n: Optional[int] = Field(None, title='N') + pet: Cat | Dog | Lizard | None = Field(None, discriminator='pet_type', title='Pet') + n: int | None = Field(None, title='N') diff --git a/tests/data/expected/main/openapi/discriminator/enum_one_literal_as_default.py b/tests/data/expected/main/openapi/discriminator/enum_one_literal_as_default.py index 26f9f87ce..5b4d9a864 100644 --- a/tests/data/expected/main/openapi/discriminator/enum_one_literal_as_default.py +++ b/tests/data/expected/main/openapi/discriminator/enum_one_literal_as_default.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Union +from typing import Literal from pydantic import BaseModel, Field, RootModel @@ -28,5 +28,5 @@ class RequestV2(RequestBase): version: Literal['v2'] = 'v2' -class Request(RootModel[Union[RequestV1, RequestV2]]): - root: Union[RequestV1, RequestV2] = Field(..., discriminator='version') +class Request(RootModel[RequestV1 | RequestV2]): + root: RequestV1 | RequestV2 = Field(..., discriminator='version') diff --git a/tests/data/expected/main/openapi/discriminator/enum_single_value_anyof.py b/tests/data/expected/main/openapi/discriminator/enum_single_value_anyof.py index 6fe6eefc6..6ee0d65bd 100644 --- a/tests/data/expected/main/openapi/discriminator/enum_single_value_anyof.py +++ b/tests/data/expected/main/openapi/discriminator/enum_single_value_anyof.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Union +from typing import Literal from pydantic import BaseModel, Field, RootModel @@ -23,5 +23,5 @@ class CustomToolCall(BaseModel): type: Literal['CustomToolCall'] -class ToolCallUnion(RootModel[Union[FunctionToolCall, CustomToolCall]]): - root: Union[FunctionToolCall, CustomToolCall] = Field(..., discriminator='type') +class ToolCallUnion(RootModel[FunctionToolCall | CustomToolCall]): + root: FunctionToolCall | CustomToolCall = Field(..., discriminator='type') diff --git a/tests/data/expected/main/openapi/discriminator/enum_single_value_anyof_use_enum.py b/tests/data/expected/main/openapi/discriminator/enum_single_value_anyof_use_enum.py index fa41c60ed..4e4ef0c95 100644 --- a/tests/data/expected/main/openapi/discriminator/enum_single_value_anyof_use_enum.py +++ b/tests/data/expected/main/openapi/discriminator/enum_single_value_anyof_use_enum.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Union +from typing import Literal from pydantic import BaseModel, Field, RootModel @@ -23,5 +23,5 @@ class CustomToolCall(BaseModel): type: Literal['CustomToolCall'] -class ToolCallUnion(RootModel[Union[FunctionToolCall, CustomToolCall]]): - root: Union[FunctionToolCall, CustomToolCall] = Field(..., discriminator='type') +class ToolCallUnion(RootModel[FunctionToolCall | CustomToolCall]): + root: FunctionToolCall | CustomToolCall = Field(..., discriminator='type') diff --git a/tests/data/expected/main/openapi/discriminator/enum_use_enum_values.py b/tests/data/expected/main/openapi/discriminator/enum_use_enum_values.py index 6de261f4e..d2b8b4cee 100644 --- a/tests/data/expected/main/openapi/discriminator/enum_use_enum_values.py +++ b/tests/data/expected/main/openapi/discriminator/enum_use_enum_values.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Union +from typing import Literal from pydantic import BaseModel, Field, RootModel @@ -28,5 +28,5 @@ class RequestV2(RequestBase): version: Literal[RequestVersionEnum.v2] -class Request(RootModel[Union[RequestV1, RequestV2]]): - root: Union[RequestV1, RequestV2] = Field(..., discriminator='version') +class Request(RootModel[RequestV1 | RequestV2]): + root: RequestV1 | RequestV2 = Field(..., discriminator='version') diff --git a/tests/data/expected/main/openapi/discriminator/enum_use_enum_values_sanitized.py b/tests/data/expected/main/openapi/discriminator/enum_use_enum_values_sanitized.py index 1bac3adb4..dde862179 100644 --- a/tests/data/expected/main/openapi/discriminator/enum_use_enum_values_sanitized.py +++ b/tests/data/expected/main/openapi/discriminator/enum_use_enum_values_sanitized.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Union +from typing import Literal from pydantic import BaseModel, Field, RootModel @@ -28,5 +28,5 @@ class RequestV2(RequestBase): version: Literal[RequestVersionEnum.v2] -class Request(RootModel[Union[RequestV1, RequestV2]]): - root: Union[RequestV1, RequestV2] = Field(..., discriminator='version') +class Request(RootModel[RequestV1 | RequestV2]): + root: RequestV1 | RequestV2 = Field(..., discriminator='version') diff --git a/tests/data/expected/main/openapi/discriminator/general.py b/tests/data/expected/main/openapi/discriminator/general.py index d45395c50..8db6e9fff 100644 --- a/tests/data/expected/main/openapi/discriminator/general.py +++ b/tests/data/expected/main/openapi/discriminator/general.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -17,7 +17,7 @@ class Type(Enum): class ObjectBase(BaseModel): - name: Optional[str] = Field(None, description='Name of the object') + name: str | None = Field(None, description='Name of the object') type: Literal['type1'] = Field(..., description='Object type') @@ -31,6 +31,6 @@ class UpdateObjectRequest(ObjectBase): class Demo(BaseModel): - __root__: Union[ObjectBase, CreateObjectRequest, UpdateObjectRequest] = Field( + __root__: ObjectBase | CreateObjectRequest | UpdateObjectRequest = Field( ..., discriminator='type' ) diff --git a/tests/data/expected/main/openapi/discriminator/in_array.py b/tests/data/expected/main/openapi/discriminator/in_array.py index 0b3c5fed9..1638eb907 100644 --- a/tests/data/expected/main/openapi/discriminator/in_array.py +++ b/tests/data/expected/main/openapi/discriminator/in_array.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -16,7 +16,7 @@ class Type(Enum): class ObjectBase(BaseModel): - name: Optional[str] = Field(None, description='Name of the object') + name: str | None = Field(None, description='Name of the object') type: Literal['type1'] = Field(..., description='Object type') @@ -30,7 +30,7 @@ class UpdateObjectRequest(ObjectBase): class MyArray(BaseModel): - __root__: Union[ObjectBase, CreateObjectRequest, UpdateObjectRequest] = Field( + __root__: ObjectBase | CreateObjectRequest | UpdateObjectRequest = Field( ..., discriminator='type' ) diff --git a/tests/data/expected/main/openapi/discriminator/in_array_collapse_root_models.py b/tests/data/expected/main/openapi/discriminator/in_array_collapse_root_models.py index 71d43e72b..d1b3a7970 100644 --- a/tests/data/expected/main/openapi/discriminator/in_array_collapse_root_models.py +++ b/tests/data/expected/main/openapi/discriminator/in_array_collapse_root_models.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -16,7 +16,7 @@ class Type(Enum): class ObjectBase(BaseModel): - name: Optional[str] = Field(None, description='Name of the object') + name: str | None = Field(None, description='Name of the object') type: Literal['type1'] = Field(..., description='Object type') @@ -30,4 +30,4 @@ class UpdateObjectRequest(ObjectBase): class Demo(BaseModel): - myArray: list[Union[ObjectBase, CreateObjectRequest, UpdateObjectRequest]] + myArray: list[ObjectBase | CreateObjectRequest | UpdateObjectRequest] diff --git a/tests/data/expected/main/openapi/discriminator/with_properties.py b/tests/data/expected/main/openapi/discriminator/with_properties.py index 3d4aaace1..20778b1b1 100644 --- a/tests/data/expected/main/openapi/discriminator/with_properties.py +++ b/tests/data/expected/main/openapi/discriminator/with_properties.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field, RootModel @@ -17,8 +17,8 @@ class UserContextVariable(BaseModel): class IssueContextVariable(BaseModel): - id: Optional[int] = Field(None, description='The issue ID.') - key: Optional[str] = Field(None, description='The issue key.') + id: int | None = Field(None, description='The issue ID.') + key: str | None = Field(None, description='The issue key.') field_type: str = Field( ..., alias='@type', description='Type of custom context variable.' ) @@ -36,9 +36,7 @@ class CustomContextVariable2(IssueContextVariable): ) -class CustomContextVariable( - RootModel[Union[CustomContextVariable1, CustomContextVariable2]] -): - root: Union[CustomContextVariable1, CustomContextVariable2] = Field( +class CustomContextVariable(RootModel[CustomContextVariable1 | CustomContextVariable2]): + root: CustomContextVariable1 | CustomContextVariable2 = Field( ..., discriminator='field_type' ) diff --git a/tests/data/expected/main/openapi/discriminator/without_mapping.py b/tests/data/expected/main/openapi/discriminator/without_mapping.py index 9a4dfb26c..5217523b1 100644 --- a/tests/data/expected/main/openapi/discriminator/without_mapping.py +++ b/tests/data/expected/main/openapi/discriminator/without_mapping.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -17,7 +17,7 @@ class Type(Enum): class ObjectBase(BaseModel): - name: Optional[str] = Field(None, description='Name of the object') + name: str | None = Field(None, description='Name of the object') type: Literal['ObjectBase'] = Field(..., description='Object type') @@ -31,6 +31,6 @@ class UpdateObjectRequest(ObjectBase): class Demo(BaseModel): - __root__: Union[ObjectBase, CreateObjectRequest, UpdateObjectRequest] = Field( + __root__: ObjectBase | CreateObjectRequest | UpdateObjectRequest = Field( ..., discriminator='type' ) diff --git a/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/__init__.py b/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/__init__.py index 89292381f..935b59101 100644 --- a/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/__init__.py +++ b/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/__init__.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Animal(BaseModel): - species: Optional[str] = None + species: str | None = None diff --git a/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/mammal/__init__.py b/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/mammal/__init__.py index 413d3c57d..2f5eb0132 100644 --- a/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/mammal/__init__.py +++ b/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/mammal/__init__.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from .. import Animal class Dog(Animal): - breed: Optional[str] = None + breed: str | None = None diff --git a/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/mammal/canine.py b/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/mammal/canine.py index 5427f948c..756154e19 100644 --- a/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/mammal/canine.py +++ b/tests/data/expected/main/openapi/dot_notation_deep_inheritance/v0/mammal/canine.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from .. import Animal class Puppy(Animal): - age_weeks: Optional[int] = None + age_weeks: int | None = None diff --git a/tests/data/expected/main/openapi/dot_notation_inheritance/v0/__init__.py b/tests/data/expected/main/openapi/dot_notation_inheritance/v0/__init__.py index 8a30830e6..8110f5f8d 100644 --- a/tests/data/expected/main/openapi/dot_notation_inheritance/v0/__init__.py +++ b/tests/data/expected/main/openapi/dot_notation_inheritance/v0/__init__.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Properties(BaseModel): - name: Optional[str] = None + name: str | None = None class Animal(BaseModel): - species: Optional[str] = None - props: Optional[Properties] = None + species: str | None = None + props: Properties | None = None diff --git a/tests/data/expected/main/openapi/dot_notation_inheritance/v0/animal.py b/tests/data/expected/main/openapi/dot_notation_inheritance/v0/animal.py index b7d1015fa..114c8f922 100644 --- a/tests/data/expected/main/openapi/dot_notation_inheritance/v0/animal.py +++ b/tests/data/expected/main/openapi/dot_notation_inheritance/v0/animal.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from . import Animal class Dog(Animal): - breed: Optional[str] = None + breed: str | None = None diff --git a/tests/data/expected/main/openapi/duplicate_models2.py b/tests/data/expected/main/openapi/duplicate_models2.py index 8ff4b940c..ee20fd703 100644 --- a/tests/data/expected/main/openapi/duplicate_models2.py +++ b/tests/data/expected/main/openapi/duplicate_models2.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional +from typing import Any from pydantic import BaseModel, RootModel @@ -15,15 +15,15 @@ class PetType(Enum): class PetDetails(BaseModel): - race: Optional[str] = None + race: str | None = None class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None type: PetType - details: Optional[PetDetails] = None + details: PetDetails | None = None class CarType(Enum): @@ -31,15 +31,15 @@ class CarType(Enum): class CarDetails(BaseModel): - brand: Optional[str] = None + brand: str | None = None class Car(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None type: CarType - details: Optional[CarDetails] = None + details: CarDetails | None = None class Cars(RootModel[Any]): diff --git a/tests/data/expected/main/openapi/enable_command_header.py b/tests/data/expected/main/openapi/enable_command_header.py index 4e2b26608..feca7bb4c 100644 --- a/tests/data/expected/main/openapi/enable_command_header.py +++ b/tests/data/expected/main/openapi/enable_command_header.py @@ -5,15 +5,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -23,7 +21,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -44,16 +42,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -63,8 +61,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/enable_faux_immutability.py b/tests/data/expected/main/openapi/enable_faux_immutability.py index fdc0c3c35..77c4a0df1 100644 --- a/tests/data/expected/main/openapi/enable_faux_immutability.py +++ b/tests/data/expected/main/openapi/enable_faux_immutability.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field @@ -15,7 +13,7 @@ class Config: id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -31,7 +29,7 @@ class Config: id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -67,16 +65,16 @@ class Api(BaseModel): class Config: allow_mutation = False - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -92,11 +90,11 @@ class Event(BaseModel): class Config: allow_mutation = False - name: Optional[str] = None + name: str | None = None class Result(BaseModel): class Config: allow_mutation = False - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/enable_faux_immutability_pydantic_v2.py b/tests/data/expected/main/openapi/enable_faux_immutability_pydantic_v2.py index a550d7f45..6f58adc52 100644 --- a/tests/data/expected/main/openapi/enable_faux_immutability_pydantic_v2.py +++ b/tests/data/expected/main/openapi/enable_faux_immutability_pydantic_v2.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel @@ -15,7 +13,7 @@ class Pet(BaseModel): ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(RootModel[list[Pet]]): @@ -31,7 +29,7 @@ class User(BaseModel): ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(RootModel[list[User]]): @@ -67,16 +65,16 @@ class Api(BaseModel): model_config = ConfigDict( frozen=True, ) - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -92,11 +90,11 @@ class Event(BaseModel): model_config = ConfigDict( frozen=True, ) - name: Optional[str] = None + name: str | None = None class Result(BaseModel): model_config = ConfigDict( frozen=True, ) - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/enable_version_header.py b/tests/data/expected/main/openapi/enable_version_header.py index 3f608ec5a..5d613298b 100644 --- a/tests/data/expected/main/openapi/enable_version_header.py +++ b/tests/data/expected/main/openapi/enable_version_header.py @@ -5,15 +5,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -23,7 +21,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -44,16 +42,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -63,8 +61,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/enum_models/one.py b/tests/data/expected/main/openapi/enum_models/one.py index 9d3ff6a10..2d04cac25 100644 --- a/tests/data/expected/main/openapi/enum_models/one.py +++ b/tests/data/expected/main/openapi/enum_models/one.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -18,9 +18,9 @@ class Kind(Enum): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - kind: Optional[Kind] = None - type: Optional[Literal['animal']] = None + tag: str | None = None + kind: Kind | None = None + type: Literal['animal'] | None = None number: Literal[1] boolean: Literal[True] @@ -35,7 +35,7 @@ class Kind1(Enum): class Animal(BaseModel): - kind: Optional[Kind1] = None + kind: Kind1 | None = None class Error(BaseModel): @@ -49,7 +49,7 @@ class Type(Enum): class EnumObject(BaseModel): - type: Optional[Type] = None + type: Type | None = None class EnumRoot(Enum): @@ -81,7 +81,7 @@ class SingleEnum(BaseModel): class ArrayEnum(BaseModel): - __root__: list[Union[Literal['cat'], Literal['dog']]] + __root__: list[Literal['cat'] | Literal['dog']] class NestedVersionEnum(Enum): @@ -94,13 +94,13 @@ class NestedVersionEnum(Enum): class NestedVersion(BaseModel): - __root__: Optional[NestedVersionEnum] = Field( + __root__: NestedVersionEnum | None = Field( 'RC1', description='nullable enum', example='RC2' ) class NestedNullableEnum(BaseModel): - nested_version: Optional[NestedVersion] = Field( + nested_version: NestedVersion | None = Field( default_factory=lambda: NestedVersion.parse_obj('RC1'), description='nullable enum', example='RC2', @@ -117,6 +117,6 @@ class VersionEnum(Enum): class Version(BaseModel): - __root__: Optional[VersionEnum] = Field( + __root__: VersionEnum | None = Field( 'RC1', description='nullable enum', example='RC2' ) diff --git a/tests/data/expected/main/openapi/enum_models/one_literal_as_default.py b/tests/data/expected/main/openapi/enum_models/one_literal_as_default.py index 7a8b7cb88..b9cd0d52d 100644 --- a/tests/data/expected/main/openapi/enum_models/one_literal_as_default.py +++ b/tests/data/expected/main/openapi/enum_models/one_literal_as_default.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -18,9 +18,9 @@ class Kind(Enum): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - kind: Optional[Kind] = None - type: Optional[Literal['animal']] = None + tag: str | None = None + kind: Kind | None = None + type: Literal['animal'] | None = None number: Literal[1] = 1 boolean: Literal[True] = True @@ -35,7 +35,7 @@ class Kind1(Enum): class Animal(BaseModel): - kind: Optional[Kind1] = None + kind: Kind1 | None = None class Error(BaseModel): @@ -49,7 +49,7 @@ class Type(Enum): class EnumObject(BaseModel): - type: Optional[Type] = None + type: Type | None = None class EnumRoot(Enum): @@ -81,7 +81,7 @@ class SingleEnum(BaseModel): class ArrayEnum(BaseModel): - __root__: list[Union[Literal['cat'], Literal['dog']]] + __root__: list[Literal['cat'] | Literal['dog']] class NestedVersionEnum(Enum): @@ -94,13 +94,13 @@ class NestedVersionEnum(Enum): class NestedVersion(BaseModel): - __root__: Optional[NestedVersionEnum] = Field( + __root__: NestedVersionEnum | None = Field( 'RC1', description='nullable enum', example='RC2' ) class NestedNullableEnum(BaseModel): - nested_version: Optional[NestedVersion] = Field( + nested_version: NestedVersion | None = Field( default_factory=lambda: NestedVersion.parse_obj('RC1'), description='nullable enum', example='RC2', @@ -117,6 +117,6 @@ class VersionEnum(Enum): class Version(BaseModel): - __root__: Optional[VersionEnum] = Field( + __root__: VersionEnum | None = Field( 'RC1', description='nullable enum', example='RC2' ) diff --git a/tests/data/expected/main/openapi/enum_specialized.py b/tests/data/expected/main/openapi/enum_specialized.py index c735a7976..74dd58aaa 100644 --- a/tests/data/expected/main/openapi/enum_specialized.py +++ b/tests/data/expected/main/openapi/enum_specialized.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import StrEnum -from typing import Optional from pydantic import BaseModel, Field @@ -17,6 +16,6 @@ class ProcessingStatus(StrEnum): class ProcessingTask(BaseModel): - processing_status: Optional[ProcessingStatus] = Field( + processing_status: ProcessingStatus | None = Field( 'COMPLETED', title='Status of the task' ) diff --git a/tests/data/expected/main/openapi/external_relative_ref/module_openapi/model_a.py b/tests/data/expected/main/openapi/external_relative_ref/module_openapi/model_a.py index 4a29df373..fd2d3d7ea 100644 --- a/tests/data/expected/main/openapi/external_relative_ref/module_openapi/model_a.py +++ b/tests/data/expected/main/openapi/external_relative_ref/module_openapi/model_a.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Input(BaseModel): - name: Optional[str] = None + name: str | None = None class Output(BaseModel): - output: Optional[str] = None - input: Optional[Input] = None + output: str | None = None + input: Input | None = None diff --git a/tests/data/expected/main/openapi/external_relative_ref/module_openapi/modules/quality_evaluation.py b/tests/data/expected/main/openapi/external_relative_ref/module_openapi/modules/quality_evaluation.py index c92d13cc3..742cfd4d1 100644 --- a/tests/data/expected/main/openapi/external_relative_ref/module_openapi/modules/quality_evaluation.py +++ b/tests/data/expected/main/openapi/external_relative_ref/module_openapi/modules/quality_evaluation.py @@ -4,12 +4,10 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .. import model_a class QualityEvaluationRequest(BaseModel): - input: Optional[model_a.Output] = None + input: model_a.Output | None = None diff --git a/tests/data/expected/main/openapi/extra_template_data_config.py b/tests/data/expected/main/openapi/extra_template_data_config.py index 7a7c7a8c8..4cc7746a5 100644 --- a/tests/data/expected/main/openapi/extra_template_data_config.py +++ b/tests/data/expected/main/openapi/extra_template_data_config.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field @@ -15,7 +13,7 @@ class Config: id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -25,7 +23,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -46,16 +44,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -65,8 +63,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/extra_template_data_config_pydantic_v2.py b/tests/data/expected/main/openapi/extra_template_data_config_pydantic_v2.py index 9ea588ada..80a854eef 100644 --- a/tests/data/expected/main/openapi/extra_template_data_config_pydantic_v2.py +++ b/tests/data/expected/main/openapi/extra_template_data_config_pydantic_v2.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel @@ -16,7 +14,7 @@ class Pet(BaseModel): # 1 2, 1 2, this is just a pet ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(RootModel[list[Pet]]): @@ -26,7 +24,7 @@ class Pets(RootModel[list[Pet]]): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(RootModel[list[User]]): @@ -47,16 +45,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -66,8 +64,8 @@ class Apis(RootModel[list[Api]]): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/force_optional.py b/tests/data/expected/main/openapi/force_optional.py index af8d89e79..db75449ef 100644 --- a/tests/data/expected/main/openapi/force_optional.py +++ b/tests/data/expected/main/openapi/force_optional.py @@ -4,66 +4,64 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): - id: Optional[int] = 1 - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = 1 + name: str | None = None + tag: str | None = None class Pets(BaseModel): - __root__: Optional[list[Pet]] = None + __root__: list[Pet] | None = None class User(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None class Users(BaseModel): - __root__: Optional[list[User]] = None + __root__: list[User] | None = None class Id(BaseModel): - __root__: Optional[str] = None + __root__: str | None = None class Rules(BaseModel): - __root__: Optional[list[str]] = None + __root__: list[str] | None = None class Error(BaseModel): - code: Optional[int] = None - message: Optional[str] = None + code: int | None = None + message: str | None = None class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) class Apis(BaseModel): - __root__: Optional[list[Api]] = None + __root__: list[Api] | None = None class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/general.py b/tests/data/expected/main/openapi/general.py index b753b36f2..fcd2dade2 100644 --- a/tests/data/expected/main/openapi/general.py +++ b/tests/data/expected/main/openapi/general.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -22,7 +20,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -43,16 +41,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -62,8 +60,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/http_refs.py b/tests/data/expected/main/openapi/http_refs.py index c960e3a26..4342c52ac 100644 --- a/tests/data/expected/main/openapi/http_refs.py +++ b/tests/data/expected/main/openapi/http_refs.py @@ -4,31 +4,29 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field, conint class Problem(BaseModel): - detail: Optional[str] = Field( + detail: str | None = Field( None, description='A human readable explanation specific to this occurrence of the\nproblem. You MUST NOT expose internal information, personal\ndata or implementation details through this field.\n', example='Request took too long to complete.', ) - instance: Optional[AnyUrl] = Field( + instance: AnyUrl | None = Field( None, description='An absolute URI that identifies the specific occurrence of the problem.\nIt may or may not yield further information if dereferenced.\n', ) - status: Optional[conint(ge=100, lt=600)] = Field( + status: conint(ge=100, lt=600) | None = Field( None, description='The HTTP status code generated by the origin server for this occurrence\nof the problem.\n', example=503, ) - title: Optional[str] = Field( + title: str | None = Field( None, description='A short, summary of the problem type. Written in english and readable\nfor engineers (usually not suited for non technical stakeholders and\nnot localized); example: Service Unavailable\n', ) - type: Optional[AnyUrl] = Field( + type: AnyUrl | None = Field( 'about:blank', description='An absolute URI that identifies the problem type. When dereferenced,\nit SHOULD provide human-readable documentation for the problem type\n(e.g., using HTML).\n', example='https://tools.ietf.org/html/rfc7231#section-6.6.4', diff --git a/tests/data/expected/main/openapi/json_pointer.py b/tests/data/expected/main/openapi/json_pointer.py index 0885b0741..911e978ae 100644 --- a/tests/data/expected/main/openapi/json_pointer.py +++ b/tests/data/expected/main/openapi/json_pointer.py @@ -4,18 +4,16 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class TestNestedNested(BaseModel): - test_nested_nested_string: Optional[str] = None + test_nested_nested_string: str | None = None class TestNested(BaseModel): - test_string: Optional[str] = None - nested_nested: Optional[TestNestedNested] = None + test_string: str | None = None + nested_nested: TestNestedNested | None = None class Test(TestNested): diff --git a/tests/data/expected/main/openapi/max_items_enum.py b/tests/data/expected/main/openapi/max_items_enum.py index 3acc6657e..bd7bdd336 100644 --- a/tests/data/expected/main/openapi/max_items_enum.py +++ b/tests/data/expected/main/openapi/max_items_enum.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import BaseModel, Field @@ -16,4 +15,4 @@ class BarEnum(Enum): class Foo(BaseModel): - bar: Optional[list[BarEnum]] = Field(None, max_items=3) + bar: list[BarEnum] | None = Field(None, max_items=3) diff --git a/tests/data/expected/main/openapi/max_min_number.py b/tests/data/expected/main/openapi/max_min_number.py index eb7af6d59..ea9365f0b 100644 --- a/tests/data/expected/main/openapi/max_min_number.py +++ b/tests/data/expected/main/openapi/max_min_number.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, confloat class Product(BaseModel): - price: Optional[confloat(ge=-999999.999999, le=999999.999999)] = None + price: confloat(ge=-999999.999999, le=999999.999999) | None = None diff --git a/tests/data/expected/main/openapi/modular/__init__.py b/tests/data/expected/main/openapi/modular/__init__.py index 1a2ee19c2..76ac6d5e5 100644 --- a/tests/data/expected/main/openapi/modular/__init__.py +++ b/tests/data/expected/main/openapi/modular/__init__.py @@ -2,6 +2,6 @@ # filename: modular.yaml # timestamp: 1985-10-26T08:21:00+00:00 -from ._internal import DifferentTea, Error, Id, OptionalModel, Result, Source +from ._internal import DifferentTea, Error, Id, Optional, Result, Source -__all__ = ["DifferentTea", "Error", "Id", "OptionalModel", "Result", "Source"] +__all__ = ["DifferentTea", "Error", "Id", "Optional", "Result", "Source"] diff --git a/tests/data/expected/main/openapi/modular/_internal.py b/tests/data/expected/main/openapi/modular/_internal.py index 76b39b1b2..4417262c9 100644 --- a/tests/data/expected/main/openapi/modular/_internal.py +++ b/tests/data/expected/main/openapi/modular/_internal.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import models -class OptionalModel(BaseModel): +class Optional(BaseModel): __root__: str @@ -25,39 +23,39 @@ class Error(BaseModel): class Result(BaseModel): - event: Optional[models.Event] = None + event: models.Event | None = None class Source(BaseModel): - country: Optional[str] = None + country: str | None = None class DifferentTea(BaseModel): - foo: Optional[Tea] = None - nested: Optional[Tea_1] = None + foo: Tea | None = None + nested: Tea_1 | None = None class Tea(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None + flavour: str | None = None + id: Id | None = None class Cocoa(BaseModel): - quality: Optional[int] = None + quality: int | None = None class Tea_1(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class TeaClone(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class List(BaseModel): diff --git a/tests/data/expected/main/openapi/modular/collections.py b/tests/data/expected/main/openapi/modular/collections.py index da99bbf1b..60eac2479 100644 --- a/tests/data/expected/main/openapi/modular/collections.py +++ b/tests/data/expected/main/openapi/modular/collections.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import AnyUrl, BaseModel, Field @@ -32,19 +31,19 @@ class Stage(Enum): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) - stage: Optional[Stage] = None + stage: Stage | None = None class Apis(BaseModel): diff --git a/tests/data/expected/main/openapi/modular/foo/bar.py b/tests/data/expected/main/openapi/modular/foo/bar.py index cf51a68fb..9d734e0a1 100644 --- a/tests/data/expected/main/openapi/modular/foo/bar.py +++ b/tests/data/expected/main/openapi/modular/foo/bar.py @@ -4,22 +4,22 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Thing(BaseModel): - attributes: Optional[dict[str, Any]] = None + attributes: dict[str, Any] | None = None class Thang(BaseModel): - attributes: Optional[list[dict[str, Any]]] = None + attributes: list[dict[str, Any]] | None = None class Others(BaseModel): - name: Optional[str] = None + name: str | None = None class Clone(Thing): - others: Optional[Others] = None + others: Others | None = None diff --git a/tests/data/expected/main/openapi/modular/models.py b/tests/data/expected/main/openapi/modular/models.py index 2c32d9762..30297a5d2 100644 --- a/tests/data/expected/main/openapi/modular/models.py +++ b/tests/data/expected/main/openapi/modular/models.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel @@ -19,15 +19,15 @@ class Species(Enum): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - species: Optional[Species] = None + tag: str | None = None + species: Species | None = None class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Event(BaseModel): - name: Optional[Union[str, float, int, bool, dict[str, Any], list[str]]] = None + name: str | float | int | bool | dict[str, Any] | list[str] | None = None diff --git a/tests/data/expected/main/openapi/modular/woo/boo.py b/tests/data/expected/main/openapi/modular/woo/boo.py index ff24b8606..6564c88fa 100644 --- a/tests/data/expected/main/openapi/modular/woo/boo.py +++ b/tests/data/expected/main/openapi/modular/woo/boo.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .. import bar @@ -13,7 +11,7 @@ class Chocolate(BaseModel): - flavour: Optional[str] = None - source: Optional[Source] = None - cocoa: Optional[Cocoa] = None - field: Optional[bar.FieldModel] = None + flavour: str | None = None + source: Source | None = None + cocoa: Cocoa | None = None + field: bar.FieldModel | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_children/__init__.py b/tests/data/expected/main/openapi/modular_all_exports_children/__init__.py index 86e6a938c..6e3120581 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children/__init__.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children/__init__.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: modular.yaml -from ._internal import DifferentTea, Error, Id, OptionalModel, Result, Source +from ._internal import DifferentTea, Error, Id, Optional, Result, Source -__all__ = ["DifferentTea", "Error", "Id", "OptionalModel", "Result", "Source"] +__all__ = ["DifferentTea", "Error", "Id", "Optional", "Result", "Source"] diff --git a/tests/data/expected/main/openapi/modular_all_exports_children/_internal.py b/tests/data/expected/main/openapi/modular_all_exports_children/_internal.py index e4b27d245..1d1daa620 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children/_internal.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children/_internal.py @@ -3,14 +3,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import models -class OptionalModel(BaseModel): +class Optional(BaseModel): __root__: str @@ -24,39 +22,39 @@ class Error(BaseModel): class Result(BaseModel): - event: Optional[models.Event] = None + event: models.Event | None = None class Source(BaseModel): - country: Optional[str] = None + country: str | None = None class DifferentTea(BaseModel): - foo: Optional[Tea] = None - nested: Optional[Tea_1] = None + foo: Tea | None = None + nested: Tea_1 | None = None class Tea(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None + flavour: str | None = None + id: Id | None = None class Cocoa(BaseModel): - quality: Optional[int] = None + quality: int | None = None class Tea_1(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class TeaClone(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class List(BaseModel): diff --git a/tests/data/expected/main/openapi/modular_all_exports_children/collections.py b/tests/data/expected/main/openapi/modular_all_exports_children/collections.py index d91fc0276..62ed8b636 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children/collections.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children/collections.py @@ -4,7 +4,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import AnyUrl, BaseModel, Field @@ -31,19 +30,19 @@ class Stage(Enum): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) - stage: Optional[Stage] = None + stage: Stage | None = None class Apis(BaseModel): diff --git a/tests/data/expected/main/openapi/modular_all_exports_children/foo/bar.py b/tests/data/expected/main/openapi/modular_all_exports_children/foo/bar.py index bccdfe8b7..283554880 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children/foo/bar.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children/foo/bar.py @@ -3,22 +3,22 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Thing(BaseModel): - attributes: Optional[dict[str, Any]] = None + attributes: dict[str, Any] | None = None class Thang(BaseModel): - attributes: Optional[list[dict[str, Any]]] = None + attributes: list[dict[str, Any]] | None = None class Others(BaseModel): - name: Optional[str] = None + name: str | None = None class Clone(Thing): - others: Optional[Others] = None + others: Others | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_children/models.py b/tests/data/expected/main/openapi/modular_all_exports_children/models.py index 1ea7fabaf..5c2a20704 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children/models.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children/models.py @@ -4,7 +4,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel @@ -18,15 +18,15 @@ class Species(Enum): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - species: Optional[Species] = None + tag: str | None = None + species: Species | None = None class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Event(BaseModel): - name: Optional[Union[str, float, int, bool, dict[str, Any], list[str]]] = None + name: str | float | int | bool | dict[str, Any] | list[str] | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_children/woo/boo.py b/tests/data/expected/main/openapi/modular_all_exports_children/woo/boo.py index e5240b913..86fb4e5af 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children/woo/boo.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children/woo/boo.py @@ -3,8 +3,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .. import bar @@ -12,7 +10,7 @@ class Chocolate(BaseModel): - flavour: Optional[str] = None - source: Optional[Source] = None - cocoa: Optional[Cocoa] = None - field: Optional[bar.FieldModel] = None + flavour: str | None = None + source: Source | None = None + cocoa: Cocoa | None = None + field: bar.FieldModel | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/__init__.py b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/__init__.py index d6d47a1ca..7eb5b469b 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/__init__.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/__init__.py @@ -6,6 +6,6 @@ from __future__ import annotations -from ._internal import DifferentTea, Error, Id, OptionalModel, Result, Source +from ._internal import DifferentTea, Error, Id, Optional, Result, Source -__all__ = ["DifferentTea", "Error", "Id", "OptionalModel", "Result", "Source"] +__all__ = ["DifferentTea", "Error", "Id", "Optional", "Result", "Source"] diff --git a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/_internal.py b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/_internal.py index adf02969e..2b7867265 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/_internal.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/_internal.py @@ -6,14 +6,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import models -class OptionalModel(BaseModel): +class Optional(BaseModel): __root__: str @@ -27,39 +25,39 @@ class Error(BaseModel): class Result(BaseModel): - event: Optional[models.Event] = None + event: models.Event | None = None class Source(BaseModel): - country: Optional[str] = None + country: str | None = None class DifferentTea(BaseModel): - foo: Optional[Tea] = None - nested: Optional[Tea_1] = None + foo: Tea | None = None + nested: Tea_1 | None = None class Tea(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None + flavour: str | None = None + id: Id | None = None class Cocoa(BaseModel): - quality: Optional[int] = None + quality: int | None = None class Tea_1(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class TeaClone(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class List(BaseModel): diff --git a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/collections.py b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/collections.py index aee46f795..9168ca4a5 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/collections.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/collections.py @@ -7,7 +7,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import AnyUrl, BaseModel, Field @@ -34,19 +33,19 @@ class Stage(Enum): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) - stage: Optional[Stage] = None + stage: Stage | None = None class Apis(BaseModel): diff --git a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/foo/bar.py b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/foo/bar.py index 735a1a268..bc22b9326 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/foo/bar.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/foo/bar.py @@ -6,22 +6,22 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Thing(BaseModel): - attributes: Optional[dict[str, Any]] = None + attributes: dict[str, Any] | None = None class Thang(BaseModel): - attributes: Optional[list[dict[str, Any]]] = None + attributes: list[dict[str, Any]] | None = None class Others(BaseModel): - name: Optional[str] = None + name: str | None = None class Clone(Thing): - others: Optional[Others] = None + others: Others | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/models.py b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/models.py index b8f6562b2..f63c7297b 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/models.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/models.py @@ -7,7 +7,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel @@ -21,15 +21,15 @@ class Species(Enum): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - species: Optional[Species] = None + tag: str | None = None + species: Species | None = None class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Event(BaseModel): - name: Optional[Union[str, float, int, bool, dict[str, Any], list[str]]] = None + name: str | float | int | bool | dict[str, Any] | list[str] | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/woo/boo.py b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/woo/boo.py index 0e1dec8a1..673223772 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_children_docstring/woo/boo.py +++ b/tests/data/expected/main/openapi/modular_all_exports_children_docstring/woo/boo.py @@ -6,8 +6,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .. import bar @@ -15,7 +13,7 @@ class Chocolate(BaseModel): - flavour: Optional[str] = None - source: Optional[Source] = None - cocoa: Optional[Cocoa] = None - field: Optional[bar.FieldModel] = None + flavour: str | None = None + source: Source | None = None + cocoa: Cocoa | None = None + field: bar.FieldModel | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive/__init__.py b/tests/data/expected/main/openapi/modular_all_exports_recursive/__init__.py index 86e6a938c..6e3120581 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive/__init__.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive/__init__.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: modular.yaml -from ._internal import DifferentTea, Error, Id, OptionalModel, Result, Source +from ._internal import DifferentTea, Error, Id, Optional, Result, Source -__all__ = ["DifferentTea", "Error", "Id", "OptionalModel", "Result", "Source"] +__all__ = ["DifferentTea", "Error", "Id", "Optional", "Result", "Source"] diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive/_internal.py b/tests/data/expected/main/openapi/modular_all_exports_recursive/_internal.py index e4b27d245..1d1daa620 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive/_internal.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive/_internal.py @@ -3,14 +3,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import models -class OptionalModel(BaseModel): +class Optional(BaseModel): __root__: str @@ -24,39 +22,39 @@ class Error(BaseModel): class Result(BaseModel): - event: Optional[models.Event] = None + event: models.Event | None = None class Source(BaseModel): - country: Optional[str] = None + country: str | None = None class DifferentTea(BaseModel): - foo: Optional[Tea] = None - nested: Optional[Tea_1] = None + foo: Tea | None = None + nested: Tea_1 | None = None class Tea(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None + flavour: str | None = None + id: Id | None = None class Cocoa(BaseModel): - quality: Optional[int] = None + quality: int | None = None class Tea_1(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class TeaClone(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class List(BaseModel): diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive/collections.py b/tests/data/expected/main/openapi/modular_all_exports_recursive/collections.py index d91fc0276..62ed8b636 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive/collections.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive/collections.py @@ -4,7 +4,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import AnyUrl, BaseModel, Field @@ -31,19 +30,19 @@ class Stage(Enum): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) - stage: Optional[Stage] = None + stage: Stage | None = None class Apis(BaseModel): diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive/foo/bar.py b/tests/data/expected/main/openapi/modular_all_exports_recursive/foo/bar.py index bccdfe8b7..283554880 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive/foo/bar.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive/foo/bar.py @@ -3,22 +3,22 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Thing(BaseModel): - attributes: Optional[dict[str, Any]] = None + attributes: dict[str, Any] | None = None class Thang(BaseModel): - attributes: Optional[list[dict[str, Any]]] = None + attributes: list[dict[str, Any]] | None = None class Others(BaseModel): - name: Optional[str] = None + name: str | None = None class Clone(Thing): - others: Optional[Others] = None + others: Others | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive/models.py b/tests/data/expected/main/openapi/modular_all_exports_recursive/models.py index 1ea7fabaf..5c2a20704 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive/models.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive/models.py @@ -4,7 +4,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel @@ -18,15 +18,15 @@ class Species(Enum): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - species: Optional[Species] = None + tag: str | None = None + species: Species | None = None class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Event(BaseModel): - name: Optional[Union[str, float, int, bool, dict[str, Any], list[str]]] = None + name: str | float | int | bool | dict[str, Any] | list[str] | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive/woo/boo.py b/tests/data/expected/main/openapi/modular_all_exports_recursive/woo/boo.py index e5240b913..86fb4e5af 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive/woo/boo.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive/woo/boo.py @@ -3,8 +3,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .. import bar @@ -12,7 +10,7 @@ class Chocolate(BaseModel): - flavour: Optional[str] = None - source: Optional[Source] = None - cocoa: Optional[Cocoa] = None - field: Optional[bar.FieldModel] = None + flavour: str | None = None + source: Source | None = None + cocoa: Cocoa | None = None + field: bar.FieldModel | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/__init__.py b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/__init__.py index 86e6a938c..6e3120581 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/__init__.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/__init__.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: modular.yaml -from ._internal import DifferentTea, Error, Id, OptionalModel, Result, Source +from ._internal import DifferentTea, Error, Id, Optional, Result, Source -__all__ = ["DifferentTea", "Error", "Id", "OptionalModel", "Result", "Source"] +__all__ = ["DifferentTea", "Error", "Id", "Optional", "Result", "Source"] diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/_internal.py b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/_internal.py index e4b27d245..1d1daa620 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/_internal.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/_internal.py @@ -3,14 +3,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import models -class OptionalModel(BaseModel): +class Optional(BaseModel): __root__: str @@ -24,39 +22,39 @@ class Error(BaseModel): class Result(BaseModel): - event: Optional[models.Event] = None + event: models.Event | None = None class Source(BaseModel): - country: Optional[str] = None + country: str | None = None class DifferentTea(BaseModel): - foo: Optional[Tea] = None - nested: Optional[Tea_1] = None + foo: Tea | None = None + nested: Tea_1 | None = None class Tea(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None + flavour: str | None = None + id: Id | None = None class Cocoa(BaseModel): - quality: Optional[int] = None + quality: int | None = None class Tea_1(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class TeaClone(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class List(BaseModel): diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/collections.py b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/collections.py index d91fc0276..62ed8b636 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/collections.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/collections.py @@ -4,7 +4,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import AnyUrl, BaseModel, Field @@ -31,19 +30,19 @@ class Stage(Enum): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) - stage: Optional[Stage] = None + stage: Stage | None = None class Apis(BaseModel): diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/foo/bar.py b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/foo/bar.py index bccdfe8b7..283554880 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/foo/bar.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/foo/bar.py @@ -3,22 +3,22 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Thing(BaseModel): - attributes: Optional[dict[str, Any]] = None + attributes: dict[str, Any] | None = None class Thang(BaseModel): - attributes: Optional[list[dict[str, Any]]] = None + attributes: list[dict[str, Any]] | None = None class Others(BaseModel): - name: Optional[str] = None + name: str | None = None class Clone(Thing): - others: Optional[Others] = None + others: Others | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/models.py b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/models.py index 1ea7fabaf..5c2a20704 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/models.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/models.py @@ -4,7 +4,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel @@ -18,15 +18,15 @@ class Species(Enum): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - species: Optional[Species] = None + tag: str | None = None + species: Species | None = None class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Event(BaseModel): - name: Optional[Union[str, float, int, bool, dict[str, Any], list[str]]] = None + name: str | float | int | bool | dict[str, Any] | list[str] | None = None diff --git a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/woo/boo.py b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/woo/boo.py index e5240b913..86fb4e5af 100644 --- a/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/woo/boo.py +++ b/tests/data/expected/main/openapi/modular_all_exports_recursive_full_prefix/woo/boo.py @@ -3,8 +3,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .. import bar @@ -12,7 +10,7 @@ class Chocolate(BaseModel): - flavour: Optional[str] = None - source: Optional[Source] = None - cocoa: Optional[Cocoa] = None - field: Optional[bar.FieldModel] = None + flavour: str | None = None + source: Source | None = None + cocoa: Cocoa | None = None + field: bar.FieldModel | None = None diff --git a/tests/data/expected/main/openapi/modular_custom_class_name/_internal.py b/tests/data/expected/main/openapi/modular_custom_class_name/_internal.py index cbffee92f..c9a27b17b 100644 --- a/tests/data/expected/main/openapi/modular_custom_class_name/_internal.py +++ b/tests/data/expected/main/openapi/modular_custom_class_name/_internal.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import models @@ -25,39 +23,39 @@ class CustomError(BaseModel): class CustomResult(BaseModel): - event: Optional[models.CustomEvent] = None + event: models.CustomEvent | None = None class CustomSource(BaseModel): - country: Optional[str] = None + country: str | None = None class CustomDifferentTea(BaseModel): - foo: Optional[CustomTea] = None - nested: Optional[CustomTea_1] = None + foo: CustomTea | None = None + nested: CustomTea_1 | None = None class CustomTea(BaseModel): - flavour: Optional[str] = None - id: Optional[CustomId] = None + flavour: str | None = None + id: CustomId | None = None class CustomCocoa(BaseModel): - quality: Optional[int] = None + quality: int | None = None class CustomTea_1(BaseModel): - flavour: Optional[str] = None - id: Optional[CustomId] = None - self: Optional[CustomTea_1] = None - optional: Optional[list[CustomOptional]] = None + flavour: str | None = None + id: CustomId | None = None + self: CustomTea_1 | None = None + optional: list[CustomOptional] | None = None class CustomTeaClone(BaseModel): - flavour: Optional[str] = None - id: Optional[CustomId] = None - self: Optional[CustomTea_1] = None - optional: Optional[list[CustomOptional]] = None + flavour: str | None = None + id: CustomId | None = None + self: CustomTea_1 | None = None + optional: list[CustomOptional] | None = None class CustomList(BaseModel): diff --git a/tests/data/expected/main/openapi/modular_custom_class_name/collections.py b/tests/data/expected/main/openapi/modular_custom_class_name/collections.py index 005ece4ff..da95d4bc8 100644 --- a/tests/data/expected/main/openapi/modular_custom_class_name/collections.py +++ b/tests/data/expected/main/openapi/modular_custom_class_name/collections.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import AnyUrl, BaseModel, Field @@ -32,19 +31,19 @@ class CustomStage(Enum): class CustomApi(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) - stage: Optional[CustomStage] = None + stage: CustomStage | None = None class CustomApis(BaseModel): diff --git a/tests/data/expected/main/openapi/modular_custom_class_name/foo/bar.py b/tests/data/expected/main/openapi/modular_custom_class_name/foo/bar.py index 2ebf3e42c..a1046e1a6 100644 --- a/tests/data/expected/main/openapi/modular_custom_class_name/foo/bar.py +++ b/tests/data/expected/main/openapi/modular_custom_class_name/foo/bar.py @@ -4,22 +4,22 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class CustomThing(BaseModel): - attributes: Optional[dict[str, Any]] = None + attributes: dict[str, Any] | None = None class CustomThang(BaseModel): - attributes: Optional[list[dict[str, Any]]] = None + attributes: list[dict[str, Any]] | None = None class CustomOthers(BaseModel): - name: Optional[str] = None + name: str | None = None class CustomClone(CustomThing): - others: Optional[CustomOthers] = None + others: CustomOthers | None = None diff --git a/tests/data/expected/main/openapi/modular_custom_class_name/models.py b/tests/data/expected/main/openapi/modular_custom_class_name/models.py index a6377e1c3..c19d93f5d 100644 --- a/tests/data/expected/main/openapi/modular_custom_class_name/models.py +++ b/tests/data/expected/main/openapi/modular_custom_class_name/models.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel @@ -19,15 +19,15 @@ class CustomSpecies(Enum): class CustomPet(BaseModel): id: int name: str - tag: Optional[str] = None - species: Optional[CustomSpecies] = None + tag: str | None = None + species: CustomSpecies | None = None class CustomUser(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class CustomEvent(BaseModel): - name: Optional[Union[str, float, int, bool, dict[str, Any], list[str]]] = None + name: str | float | int | bool | dict[str, Any] | list[str] | None = None diff --git a/tests/data/expected/main/openapi/modular_custom_class_name/woo/boo.py b/tests/data/expected/main/openapi/modular_custom_class_name/woo/boo.py index 082d117bb..6d25ced08 100644 --- a/tests/data/expected/main/openapi/modular_custom_class_name/woo/boo.py +++ b/tests/data/expected/main/openapi/modular_custom_class_name/woo/boo.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .. import bar @@ -13,7 +11,7 @@ class CustomChocolate(BaseModel): - flavour: Optional[str] = None - source: Optional[CustomSource] = None - cocoa: Optional[CustomCocoa] = None - field: Optional[bar.CustomField] = None + flavour: str | None = None + source: CustomSource | None = None + cocoa: CustomCocoa | None = None + field: bar.CustomField | None = None diff --git a/tests/data/expected/main/openapi/modular_reuse_model/__init__.py b/tests/data/expected/main/openapi/modular_reuse_model/__init__.py index 1a2ee19c2..76ac6d5e5 100644 --- a/tests/data/expected/main/openapi/modular_reuse_model/__init__.py +++ b/tests/data/expected/main/openapi/modular_reuse_model/__init__.py @@ -2,6 +2,6 @@ # filename: modular.yaml # timestamp: 1985-10-26T08:21:00+00:00 -from ._internal import DifferentTea, Error, Id, OptionalModel, Result, Source +from ._internal import DifferentTea, Error, Id, Optional, Result, Source -__all__ = ["DifferentTea", "Error", "Id", "OptionalModel", "Result", "Source"] +__all__ = ["DifferentTea", "Error", "Id", "Optional", "Result", "Source"] diff --git a/tests/data/expected/main/openapi/modular_reuse_model/_internal.py b/tests/data/expected/main/openapi/modular_reuse_model/_internal.py index 74df229b4..187327b24 100644 --- a/tests/data/expected/main/openapi/modular_reuse_model/_internal.py +++ b/tests/data/expected/main/openapi/modular_reuse_model/_internal.py @@ -4,18 +4,16 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import models -class OptionalModel(BaseModel): +class Optional(BaseModel): __root__: str -class Id(OptionalModel): +class Id(Optional): pass @@ -25,32 +23,32 @@ class Error(BaseModel): class Result(BaseModel): - event: Optional[models.Event] = None + event: models.Event | None = None class Source(BaseModel): - country: Optional[str] = None + country: str | None = None class DifferentTea(BaseModel): - foo: Optional[Tea] = None - nested: Optional[Tea_1] = None + foo: Tea | None = None + nested: Tea_1 | None = None class Tea(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None + flavour: str | None = None + id: Id | None = None class Cocoa(BaseModel): - quality: Optional[int] = None + quality: int | None = None class Tea_1(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class TeaClone(Tea_1): diff --git a/tests/data/expected/main/openapi/modular_reuse_model/collections.py b/tests/data/expected/main/openapi/modular_reuse_model/collections.py index da99bbf1b..60eac2479 100644 --- a/tests/data/expected/main/openapi/modular_reuse_model/collections.py +++ b/tests/data/expected/main/openapi/modular_reuse_model/collections.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional from pydantic import AnyUrl, BaseModel, Field @@ -32,19 +31,19 @@ class Stage(Enum): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) - stage: Optional[Stage] = None + stage: Stage | None = None class Apis(BaseModel): diff --git a/tests/data/expected/main/openapi/modular_reuse_model/foo/bar.py b/tests/data/expected/main/openapi/modular_reuse_model/foo/bar.py index cf51a68fb..9d734e0a1 100644 --- a/tests/data/expected/main/openapi/modular_reuse_model/foo/bar.py +++ b/tests/data/expected/main/openapi/modular_reuse_model/foo/bar.py @@ -4,22 +4,22 @@ from __future__ import annotations -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Thing(BaseModel): - attributes: Optional[dict[str, Any]] = None + attributes: dict[str, Any] | None = None class Thang(BaseModel): - attributes: Optional[list[dict[str, Any]]] = None + attributes: list[dict[str, Any]] | None = None class Others(BaseModel): - name: Optional[str] = None + name: str | None = None class Clone(Thing): - others: Optional[Others] = None + others: Others | None = None diff --git a/tests/data/expected/main/openapi/modular_reuse_model/models.py b/tests/data/expected/main/openapi/modular_reuse_model/models.py index 2c32d9762..30297a5d2 100644 --- a/tests/data/expected/main/openapi/modular_reuse_model/models.py +++ b/tests/data/expected/main/openapi/modular_reuse_model/models.py @@ -5,7 +5,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel @@ -19,15 +19,15 @@ class Species(Enum): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - species: Optional[Species] = None + tag: str | None = None + species: Species | None = None class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Event(BaseModel): - name: Optional[Union[str, float, int, bool, dict[str, Any], list[str]]] = None + name: str | float | int | bool | dict[str, Any] | list[str] | None = None diff --git a/tests/data/expected/main/openapi/modular_reuse_model/woo/boo.py b/tests/data/expected/main/openapi/modular_reuse_model/woo/boo.py index ff24b8606..6564c88fa 100644 --- a/tests/data/expected/main/openapi/modular_reuse_model/woo/boo.py +++ b/tests/data/expected/main/openapi/modular_reuse_model/woo/boo.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .. import bar @@ -13,7 +11,7 @@ class Chocolate(BaseModel): - flavour: Optional[str] = None - source: Optional[Source] = None - cocoa: Optional[Cocoa] = None - field: Optional[bar.FieldModel] = None + flavour: str | None = None + source: Source | None = None + cocoa: Cocoa | None = None + field: bar.FieldModel | None = None diff --git a/tests/data/expected/main/openapi/modular_typed_dict/models.py b/tests/data/expected/main/openapi/modular_typed_dict/models.py index fc9b5a4b6..2c4895d1a 100644 --- a/tests/data/expected/main/openapi/modular_typed_dict/models.py +++ b/tests/data/expected/main/openapi/modular_typed_dict/models.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Any, Literal, NotRequired, TypeAlias, TypedDict, Union +from typing import Any, Literal, NotRequired, TypeAlias, TypedDict Species: TypeAlias = Literal['dog', 'cat', 'snake'] @@ -23,4 +23,4 @@ class User(TypedDict): class Event(TypedDict): - name: NotRequired[Union[str, float, int, bool, dict[str, Any], list[str]]] + name: NotRequired[str | float | int | bool | dict[str, Any] | list[str]] diff --git a/tests/data/expected/main/openapi/module_class_name_collision/A.py b/tests/data/expected/main/openapi/module_class_name_collision/A.py index 150cbd377..b8e5f5c46 100644 --- a/tests/data/expected/main/openapi/module_class_name_collision/A.py +++ b/tests/data/expected/main/openapi/module_class_name_collision/A.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class A(BaseModel): - name: Optional[str] = None + name: str | None = None diff --git a/tests/data/expected/main/openapi/module_class_name_collision_deep/A/B.py b/tests/data/expected/main/openapi/module_class_name_collision_deep/A/B.py index 1baf64eec..101fad8fc 100644 --- a/tests/data/expected/main/openapi/module_class_name_collision_deep/A/B.py +++ b/tests/data/expected/main/openapi/module_class_name_collision_deep/A/B.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class B(BaseModel): - value: Optional[int] = None + value: int | None = None diff --git a/tests/data/expected/main/openapi/msgspec_anyof.py b/tests/data/expected/main/openapi/msgspec_anyof.py index 7ce5466da..b6556492e 100644 --- a/tests/data/expected/main/openapi/msgspec_anyof.py +++ b/tests/data/expected/main/openapi/msgspec_anyof.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, TypeAlias, Union +from typing import Annotated, TypeAlias from msgspec import UNSET, Meta, Struct, UnsetType @@ -12,45 +12,45 @@ class Pet(Struct): id: int name: str - tag: Union[str, UnsetType] = UNSET + tag: str | UnsetType = UNSET class Car(Struct): id: int name: str - tag: Union[str, UnsetType] = UNSET + tag: str | UnsetType = UNSET class AnyOfItem1(Struct): - name: Union[str, UnsetType] = UNSET + name: str | UnsetType = UNSET AnyOfItem2: TypeAlias = Annotated[str, Meta(max_length=5000)] -AnyOfItem: TypeAlias = Union[Pet, Car, AnyOfItem1, AnyOfItem2] +AnyOfItem: TypeAlias = Pet | Car | AnyOfItem1 | AnyOfItem2 class Item(Struct): - name: Union[str, UnsetType] = UNSET + name: str | UnsetType = UNSET Item1: TypeAlias = Annotated[str, Meta(max_length=5000)] class AnyOfobj(Struct): - item: Union[Pet, Car, Item, Item1, UnsetType] = UNSET + item: Pet | Car | Item | Item1 | UnsetType = UNSET class AnyOfArray1(Struct): - name: Union[str, UnsetType] = UNSET - birthday: Union[str, UnsetType] = UNSET + name: str | UnsetType = UNSET + birthday: str | UnsetType = UNSET AnyOfArray2: TypeAlias = Annotated[str, Meta(max_length=5000)] -AnyOfArray: TypeAlias = list[Union[Pet, Car, AnyOfArray1, AnyOfArray2]] +AnyOfArray: TypeAlias = list[Pet | Car | AnyOfArray1 | AnyOfArray2] class Error(Struct): @@ -59,4 +59,4 @@ class Error(Struct): class Config(Struct): - setting: Union[dict[str, Union[str, list[str]]], UnsetType] = UNSET + setting: dict[str, str | list[str]] | UnsetType = UNSET diff --git a/tests/data/expected/main/openapi/msgspec_default_object/Another.py b/tests/data/expected/main/openapi/msgspec_default_object/Another.py index 60485fb6a..8bc00a20b 100644 --- a/tests/data/expected/main/openapi/msgspec_default_object/Another.py +++ b/tests/data/expected/main/openapi/msgspec_default_object/Another.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TypeAlias, Union +from typing import TypeAlias from msgspec import Struct, UnsetType, convert, field @@ -15,9 +15,9 @@ class Bar(Struct): - original_foo: Union[Foo_1, UnsetType] = field( + original_foo: Foo_1 | UnsetType = field( default_factory=lambda: convert({'text': 'abc', 'number': 123}, type=Foo_1) ) - nested_foo: Union[list[Nested.Foo], UnsetType] = field( + nested_foo: list[Nested.Foo] | UnsetType = field( default_factory=lambda: convert(['abc', 'efg'], type=list[Nested.Foo]) ) diff --git a/tests/data/expected/main/openapi/msgspec_default_object/Nested.py b/tests/data/expected/main/openapi/msgspec_default_object/Nested.py index 84ace710e..a8b3a1016 100644 --- a/tests/data/expected/main/openapi/msgspec_default_object/Nested.py +++ b/tests/data/expected/main/openapi/msgspec_default_object/Nested.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TypeAlias, Union +from typing import TypeAlias from msgspec import Struct, UnsetType, convert, field @@ -14,13 +14,13 @@ class Bar(Struct): - foo: Union[Foo_1, UnsetType] = field( + foo: Foo_1 | UnsetType = field( default_factory=lambda: convert({'text': 'abc', 'number': 123}, type=Foo_1) ) - baz: Union[list[Foo_1], UnsetType] = field( + baz: list[Foo_1] | UnsetType = field( default_factory=lambda: convert( [{'text': 'abc', 'number': 123}, {'text': 'efg', 'number': 456}], type=list[Foo_1], ) ) - nested_foo: Union[Foo, UnsetType] = 'default foo' + nested_foo: Foo | UnsetType = 'default foo' diff --git a/tests/data/expected/main/openapi/msgspec_default_object/__init__.py b/tests/data/expected/main/openapi/msgspec_default_object/__init__.py index 962898297..a24ca1aa6 100644 --- a/tests/data/expected/main/openapi/msgspec_default_object/__init__.py +++ b/tests/data/expected/main/openapi/msgspec_default_object/__init__.py @@ -4,21 +4,19 @@ from __future__ import annotations -from typing import Union - from msgspec import UNSET, Struct, UnsetType, convert, field class Foo(Struct): - text: Union[str, UnsetType] = '987' - number: Union[float, UnsetType] = UNSET + text: str | UnsetType = '987' + number: float | UnsetType = UNSET class Bar(Struct): - foo: Union[Foo, UnsetType] = field( + foo: Foo | UnsetType = field( default_factory=lambda: convert({'text': 'abc', 'number': 123}, type=Foo) ) - baz: Union[list[Foo], UnsetType] = field( + baz: list[Foo] | UnsetType = field( default_factory=lambda: convert( [{'text': 'abc', 'number': 123}, {'text': 'efg', 'number': 456}], type=list[Foo], diff --git a/tests/data/expected/main/openapi/msgspec_keyword_only.py b/tests/data/expected/main/openapi/msgspec_keyword_only.py index 730de31c2..8f9560c41 100644 --- a/tests/data/expected/main/openapi/msgspec_keyword_only.py +++ b/tests/data/expected/main/openapi/msgspec_keyword_only.py @@ -4,17 +4,15 @@ from __future__ import annotations -from typing import Union - from msgspec import UNSET, Struct, UnsetType class Base(Struct, kw_only=True): id: str - createdAt: Union[str, UnsetType] = UNSET - version: Union[float, UnsetType] = 1 + createdAt: str | UnsetType = UNSET + version: float | UnsetType = 1 class Child(Base, kw_only=True): title: str - url: Union[str, UnsetType] = 'https://example.com' + url: str | UnsetType = 'https://example.com' diff --git a/tests/data/expected/main/openapi/msgspec_keyword_only_omit_defaults.py b/tests/data/expected/main/openapi/msgspec_keyword_only_omit_defaults.py index 5b191f2f9..225d0c077 100644 --- a/tests/data/expected/main/openapi/msgspec_keyword_only_omit_defaults.py +++ b/tests/data/expected/main/openapi/msgspec_keyword_only_omit_defaults.py @@ -4,17 +4,15 @@ from __future__ import annotations -from typing import Union - from msgspec import UNSET, Struct, UnsetType class Base(Struct, omit_defaults=True, kw_only=True): id: str - createdAt: Union[str, UnsetType] = UNSET - version: Union[float, UnsetType] = 1 + createdAt: str | UnsetType = UNSET + version: float | UnsetType = 1 class Child(Base, omit_defaults=True, kw_only=True): title: str - url: Union[str, UnsetType] = 'https://example.com' + url: str | UnsetType = 'https://example.com' diff --git a/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py b/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py index 12631f6e5..2dcd73e82 100644 --- a/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py +++ b/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py @@ -4,9 +4,9 @@ from __future__ import annotations -from typing import TypeAlias, Union +from typing import TypeAlias -NodeA: TypeAlias = Union[int, "NodeB"] +NodeA: TypeAlias = int | "NodeB" -NodeB: TypeAlias = Union[str, NodeA] +NodeB: TypeAlias = str | NodeA diff --git a/tests/data/expected/main/openapi/msgspec_nullable.py b/tests/data/expected/main/openapi/msgspec_nullable.py index 8e27fbb35..66c469a8a 100644 --- a/tests/data/expected/main/openapi/msgspec_nullable.py +++ b/tests/data/expected/main/openapi/msgspec_nullable.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Optional, TypeAlias, Union +from typing import Annotated, TypeAlias from msgspec import UNSET, Meta, Struct, UnsetType, field @@ -12,8 +12,8 @@ class Cursors(Struct): prev: str index: float - next: Union[str, UnsetType] = 'last' - tag: Union[str, UnsetType] = UNSET + next: str | UnsetType = 'last' + tag: str | UnsetType = UNSET class TopLevel(Struct): @@ -29,32 +29,32 @@ class User(Struct): class Api(Struct): - apiKey: Union[ - Annotated[str, Meta(description='To be used as a dataset parameter value')], - UnsetType, - ] = UNSET - apiVersionNumber: Union[ - Annotated[str, Meta(description='To be used as a version parameter value')], - UnsetType, - ] = UNSET - apiUrl: Union[ - Annotated[str, Meta(description="The URL describing the dataset's fields")], - UnsetType, - ] = UNSET - apiDocumentationUrl: Union[ - Annotated[str, Meta(description='A URL to the API console for each API')], - UnsetType, - ] = UNSET - - -Apis: TypeAlias = Optional[list[Api]] + apiKey: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = UNSET + apiVersionNumber: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = UNSET + apiUrl: ( + Annotated[str, Meta(description="The URL describing the dataset's fields")] + | UnsetType + ) = UNSET + apiDocumentationUrl: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = UNSET + + +Apis: TypeAlias = list[Api] | None class EmailItem(Struct): author: str address: Annotated[str, Meta(description='email address')] - description: Union[str, UnsetType] = 'empty' - tag: Union[str, UnsetType] = UNSET + description: str | UnsetType = 'empty' + tag: str | UnsetType = UNSET Email: TypeAlias = list[EmailItem] @@ -63,19 +63,19 @@ class EmailItem(Struct): Id: TypeAlias = int -Description: TypeAlias = Annotated[Optional[str], 'example'] +Description: TypeAlias = Annotated[str | None, 'example'] -Name: TypeAlias = Optional[str] +Name: TypeAlias = str | None Tag: TypeAlias = str class Notes(Struct): - comments: Union[list[str], UnsetType] = field(default_factory=list) + comments: list[str] | UnsetType = field(default_factory=list) class Options(Struct): comments: list[str] - oneOfComments: list[Union[str, float]] + oneOfComments: list[str | float] diff --git a/tests/data/expected/main/openapi/msgspec_oneof_with_null.py b/tests/data/expected/main/openapi/msgspec_oneof_with_null.py index 011f5d053..e2dd2828f 100644 --- a/tests/data/expected/main/openapi/msgspec_oneof_with_null.py +++ b/tests/data/expected/main/openapi/msgspec_oneof_with_null.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, TypeAlias, Union +from typing import Annotated, TypeAlias from msgspec import UNSET, Meta, Struct, UnsetType @@ -13,16 +13,16 @@ class Model(Struct): required_field: str - optional_oneof_with_null: Union[str, None, UnsetType] = UNSET - optional_anyof_with_null: Union[str, None, UnsetType] = UNSET - optional_field_not_nullable: Union[str, UnsetType] = UNSET - optional_oneof_with_null_and_constraint: Union[ - OptionalOneofWithNullAndConstraint, None, UnsetType - ] = UNSET - optional_nullable_field: Union[str, UnsetType] = UNSET - optional_nullable_with_constraint: Union[ - Annotated[str, Meta(max_length=50)], UnsetType - ] = UNSET - optional_nullable_with_min_length: Union[ - Annotated[str, Meta(min_length=5)], UnsetType - ] = UNSET + optional_oneof_with_null: str | None | UnsetType = UNSET + optional_anyof_with_null: str | None | UnsetType = UNSET + optional_field_not_nullable: str | UnsetType = UNSET + optional_oneof_with_null_and_constraint: ( + OptionalOneofWithNullAndConstraint | None | UnsetType + ) = UNSET + optional_nullable_field: str | UnsetType = UNSET + optional_nullable_with_constraint: ( + Annotated[str, Meta(max_length=50)] | UnsetType + ) = UNSET + optional_nullable_with_min_length: ( + Annotated[str, Meta(min_length=5)] | UnsetType + ) = UNSET diff --git a/tests/data/expected/main/openapi/msgspec_struct.py b/tests/data/expected/main/openapi/msgspec_struct.py index 7b62176b2..881e9517b 100644 --- a/tests/data/expected/main/openapi/msgspec_struct.py +++ b/tests/data/expected/main/openapi/msgspec_struct.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, TypeAlias, Union +from typing import Annotated, TypeAlias from msgspec import UNSET, Meta, Struct, UnsetType @@ -12,7 +12,7 @@ class Pet(Struct): id: int name: str - tag: Union[str, UnsetType] = UNSET + tag: str | UnsetType = UNSET Pets: TypeAlias = list[Pet] @@ -21,7 +21,7 @@ class Pet(Struct): class User(Struct): id: int name: str - tag: Union[str, UnsetType] = UNSET + tag: str | UnsetType = UNSET Users: TypeAlias = list[User] @@ -39,30 +39,30 @@ class Error(Struct): class Api(Struct): - apiKey: Union[ - Annotated[str, Meta(description='To be used as a dataset parameter value')], - UnsetType, - ] = UNSET - apiVersionNumber: Union[ - Annotated[str, Meta(description='To be used as a version parameter value')], - UnsetType, - ] = UNSET - apiUrl: Union[ - Annotated[str, Meta(description="The URL describing the dataset's fields")], - UnsetType, - ] = UNSET - apiDocumentationUrl: Union[ - Annotated[str, Meta(description='A URL to the API console for each API')], - UnsetType, - ] = UNSET + apiKey: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = UNSET + apiVersionNumber: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = UNSET + apiUrl: ( + Annotated[str, Meta(description="The URL describing the dataset's fields")] + | UnsetType + ) = UNSET + apiDocumentationUrl: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = UNSET Apis: TypeAlias = list[Api] class Event(Struct): - name: Union[str, UnsetType] = UNSET + name: str | UnsetType = UNSET class Result(Struct): - event: Union[Event, UnsetType] = UNSET + event: Event | UnsetType = UNSET diff --git a/tests/data/expected/main/openapi/msgspec_struct_snake_case.py b/tests/data/expected/main/openapi/msgspec_struct_snake_case.py index 92e889da2..efca091ba 100644 --- a/tests/data/expected/main/openapi/msgspec_struct_snake_case.py +++ b/tests/data/expected/main/openapi/msgspec_struct_snake_case.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, TypeAlias, Union +from typing import Annotated, TypeAlias from msgspec import UNSET, Meta, Struct, UnsetType, field @@ -13,7 +13,7 @@ class Pet(Struct): id: int name: str before_tag: str = field(name='beforeTag') - tag: Union[str, UnsetType] = UNSET + tag: str | UnsetType = UNSET Pets: TypeAlias = list[Pet] @@ -22,7 +22,7 @@ class Pet(Struct): class User(Struct): id: int name: str - tag: Union[str, UnsetType] = UNSET + tag: str | UnsetType = UNSET Users: TypeAlias = list[User] @@ -40,30 +40,30 @@ class Error(Struct): class Api(Struct): - api_key: Union[ - Annotated[str, Meta(description='To be used as a dataset parameter value')], - UnsetType, - ] = field(name='apiKey', default=UNSET) - api_version_number: Union[ - Annotated[str, Meta(description='To be used as a version parameter value')], - UnsetType, - ] = field(name='apiVersionNumber', default=UNSET) - api_url: Union[ - Annotated[str, Meta(description="The URL describing the dataset's fields")], - UnsetType, - ] = field(name='apiUrl', default=UNSET) - api_documentation_url: Union[ - Annotated[str, Meta(description='A URL to the API console for each API')], - UnsetType, - ] = field(name='apiDocumentationUrl', default=UNSET) + api_key: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = field(name='apiKey', default=UNSET) + api_version_number: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = field(name='apiVersionNumber', default=UNSET) + api_url: ( + Annotated[str, Meta(description="The URL describing the dataset's fields")] + | UnsetType + ) = field(name='apiUrl', default=UNSET) + api_documentation_url: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = field(name='apiDocumentationUrl', default=UNSET) Apis: TypeAlias = list[Api] class Event(Struct): - name: Union[str, UnsetType] = UNSET + name: str | UnsetType = UNSET class Result(Struct): - event: Union[Event, UnsetType] = UNSET + event: Event | UnsetType = UNSET diff --git a/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py b/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py index 793df5600..18d486e5e 100644 --- a/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py +++ b/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, TypeAlias, Union +from typing import Annotated, TypeAlias from msgspec import UNSET, Meta, Struct, UnsetType @@ -12,7 +12,7 @@ class Pet(Struct): id: Annotated[int, Meta(ge=0, le=9223372036854775807)] name: Annotated[str, Meta(max_length=256)] - tag: Union[Annotated[str, Meta(max_length=64)], UnsetType] = UNSET + tag: Annotated[str, Meta(max_length=64)] | UnsetType = UNSET Pets: TypeAlias = list[Pet] @@ -31,17 +31,13 @@ class User(Struct): id: Annotated[int, Meta(ge=0)] name: Annotated[str, Meta(max_length=256)] uid: UID - tag: Union[Annotated[str, Meta(max_length=64)], UnsetType] = UNSET - phones: Union[list[Phone], UnsetType] = UNSET - fax: Union[list[FaxItem], UnsetType] = UNSET - height: Union[Annotated[Union[int, float], Meta(ge=1.0, le=300.0)], UnsetType] = ( - UNSET - ) - weight: Union[Annotated[Union[float, int], Meta(ge=1.0, le=1000.0)], UnsetType] = ( - UNSET - ) - age: Union[Annotated[int, Meta(gt=0, le=200)], UnsetType] = UNSET - rating: Union[Annotated[float, Meta(gt=0.0, le=5.0)], UnsetType] = UNSET + tag: Annotated[str, Meta(max_length=64)] | UnsetType = UNSET + phones: list[Phone] | UnsetType = UNSET + fax: list[FaxItem] | UnsetType = UNSET + height: Annotated[int | float, Meta(ge=1.0, le=300.0)] | UnsetType = UNSET + weight: Annotated[float | int, Meta(ge=1.0, le=1000.0)] | UnsetType = UNSET + age: Annotated[int, Meta(gt=0, le=200)] | UnsetType = UNSET + rating: Annotated[float, Meta(gt=0.0, le=5.0)] | UnsetType = UNSET Users: TypeAlias = list[User] @@ -59,33 +55,33 @@ class Error(Struct): class Api(Struct): - apiKey: Union[ - Annotated[str, Meta(description='To be used as a dataset parameter value')], - UnsetType, - ] = UNSET - apiVersionNumber: Union[ - Annotated[str, Meta(description='To be used as a version parameter value')], - UnsetType, - ] = UNSET - apiUrl: Union[ + apiKey: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = UNSET + apiVersionNumber: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = UNSET + apiUrl: ( Annotated[ str, Meta(description="The URL describing the dataset's fields", min_length=1), - ], - UnsetType, - ] = UNSET - apiDocumentationUrl: Union[ - Annotated[str, Meta(description='A URL to the API console for each API')], - UnsetType, - ] = UNSET + ] + | UnsetType + ) = UNSET + apiDocumentationUrl: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = UNSET Apis: TypeAlias = list[Api] class Event(Struct): - name: Union[str, UnsetType] = UNSET + name: str | UnsetType = UNSET class Result(Struct): - event: Union[Event, UnsetType] = UNSET + event: Event | UnsetType = UNSET diff --git a/tests/data/expected/main/openapi/multiple_required_any_of.py b/tests/data/expected/main/openapi/multiple_required_any_of.py index 55d1fb429..60e53751a 100644 --- a/tests/data/expected/main/openapi/multiple_required_any_of.py +++ b/tests/data/expected/main/openapi/multiple_required_any_of.py @@ -5,20 +5,19 @@ from __future__ import annotations from ipaddress import IPv4Address, IPv6Address -from typing import Optional, Union from pydantic import BaseModel class Addr1(BaseModel): ipv4Addr: IPv4Address - ipv6Addr: Optional[IPv6Address] = None + ipv6Addr: IPv6Address | None = None class Addr2(BaseModel): - ipv4Addr: Optional[IPv4Address] = None + ipv4Addr: IPv4Address | None = None ipv6Addr: IPv6Address class Addr(BaseModel): - __root__: Union[Addr1, Addr2] + __root__: Addr1 | Addr2 diff --git a/tests/data/expected/main/openapi/namespace_subns_ref/ns/__init__.py b/tests/data/expected/main/openapi/namespace_subns_ref/ns/__init__.py index 8f99c67ef..cc82d94bb 100644 --- a/tests/data/expected/main/openapi/namespace_subns_ref/ns/__init__.py +++ b/tests/data/expected/main/openapi/namespace_subns_ref/ns/__init__.py @@ -4,12 +4,10 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from . import subns class Wrapper(BaseModel): - item: Optional[subns.Item] = None + item: subns.Item | None = None diff --git a/tests/data/expected/main/openapi/namespace_subns_ref/ns/subns.py b/tests/data/expected/main/openapi/namespace_subns_ref/ns/subns.py index 9cd7c8e18..ba63417d5 100644 --- a/tests/data/expected/main/openapi/namespace_subns_ref/ns/subns.py +++ b/tests/data/expected/main/openapi/namespace_subns_ref/ns/subns.py @@ -4,10 +4,8 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Item(BaseModel): - name: Optional[str] = None + name: str | None = None diff --git a/tests/data/expected/main/openapi/nested_package_enum_default/io/example/api/v1.py b/tests/data/expected/main/openapi/nested_package_enum_default/io/example/api/v1.py index 67764bbb1..af939c224 100644 --- a/tests/data/expected/main/openapi/nested_package_enum_default/io/example/api/v1.py +++ b/tests/data/expected/main/openapi/nested_package_enum_default/io/example/api/v1.py @@ -6,7 +6,6 @@ from dataclasses import dataclass from enum import Enum -from typing import Optional class Resolution(Enum): @@ -21,6 +20,6 @@ class Policy(Enum): @dataclass class BucketSpec: - resolution: Optional[Resolution] = Resolution.Required - policy: Optional[Policy] = Policy.Allow - name: Optional[str] = None + resolution: Resolution | None = Resolution.Required + policy: Policy | None = Policy.Allow + name: str | None = None diff --git a/tests/data/expected/main/openapi/no_file.py b/tests/data/expected/main/openapi/no_file.py index b0ec865fc..2edc0ac2e 100644 --- a/tests/data/expected/main/openapi/no_file.py +++ b/tests/data/expected/main/openapi/no_file.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -22,7 +20,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -43,16 +41,16 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -62,8 +60,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None diff --git a/tests/data/expected/main/openapi/nullable.py b/tests/data/expected/main/openapi/nullable.py index 49d045d0a..eec0faa09 100644 --- a/tests/data/expected/main/openapi/nullable.py +++ b/tests/data/expected/main/openapi/nullable.py @@ -4,16 +4,14 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import AnyUrl, BaseModel, Field class Cursors(BaseModel): prev: str - next: Optional[str] = 'last' + next: str | None = 'last' index: float - tag: Optional[str] = None + tag: str | None = None class TopLevel(BaseModel): @@ -29,29 +27,29 @@ class User(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) class Apis(BaseModel): - __root__: Optional[list[Api]] = None + __root__: list[Api] | None = None class EmailItem(BaseModel): author: str address: str = Field(..., description='email address') - description: Optional[str] = 'empty' - tag: Optional[str] = None + description: str | None = 'empty' + tag: str | None = None class Email(BaseModel): @@ -63,11 +61,11 @@ class Id(BaseModel): class Description(BaseModel): - __root__: Optional[str] = 'example' + __root__: str | None = 'example' class Name(BaseModel): - __root__: Optional[str] = None + __root__: str | None = None class Tag(BaseModel): @@ -80,4 +78,4 @@ class Notes(BaseModel): class Options(BaseModel): comments: list[str] - oneOfComments: list[Union[str, float]] + oneOfComments: list[str | float] diff --git a/tests/data/expected/main/openapi/nullable_strict_nullable.py b/tests/data/expected/main/openapi/nullable_strict_nullable.py index 8777fd743..ad85cbb51 100644 --- a/tests/data/expected/main/openapi/nullable_strict_nullable.py +++ b/tests/data/expected/main/openapi/nullable_strict_nullable.py @@ -4,16 +4,14 @@ from __future__ import annotations -from typing import Optional, Union - from pydantic import AnyUrl, BaseModel, Field class Cursors(BaseModel): - prev: Optional[str] = Field(...) + prev: str | None = Field(...) next: str = 'last' index: float - tag: Optional[str] = None + tag: str | None = None class TopLevel(BaseModel): @@ -29,29 +27,29 @@ class User(BaseModel): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) class Apis(BaseModel): - __root__: Optional[list[Api]] = Field(...) + __root__: list[Api] | None = Field(...) class EmailItem(BaseModel): author: str address: str = Field(..., description='email address') description: str = 'empty' - tag: Optional[str] = None + tag: str | None = None class Email(BaseModel): @@ -63,11 +61,11 @@ class Id(BaseModel): class Description(BaseModel): - __root__: Optional[str] = 'example' + __root__: str | None = 'example' class Name(BaseModel): - __root__: Optional[str] = None + __root__: str | None = None class Tag(BaseModel): @@ -79,5 +77,5 @@ class Notes(BaseModel): class Options(BaseModel): - comments: list[Optional[str]] - oneOfComments: list[Union[Optional[str], Optional[float]]] + comments: list[str | None] + oneOfComments: list[str | float | None] diff --git a/tests/data/expected/main/openapi/oas_response_reference.py b/tests/data/expected/main/openapi/oas_response_reference.py index 79b1441c5..66f26c857 100644 --- a/tests/data/expected/main/openapi/oas_response_reference.py +++ b/tests/data/expected/main/openapi/oas_response_reference.py @@ -4,15 +4,13 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Error(BaseModel): diff --git a/tests/data/expected/main/openapi/openapi_non_operations_and_security.py b/tests/data/expected/main/openapi/openapi_non_operations_and_security.py index 69849bbe3..cd25bb069 100644 --- a/tests/data/expected/main/openapi/openapi_non_operations_and_security.py +++ b/tests/data/expected/main/openapi/openapi_non_operations_and_security.py @@ -4,14 +4,12 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None + id: int | None = None + name: str | None = None class PetsGetResponse(BaseModel): diff --git a/tests/data/expected/main/openapi/openapi_webhooks.py b/tests/data/expected/main/openapi/openapi_webhooks.py index 328c83800..88edf14bd 100644 --- a/tests/data/expected/main/openapi/openapi_webhooks.py +++ b/tests/data/expected/main/openapi/openapi_webhooks.py @@ -4,18 +4,16 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class PetUpdate(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None diff --git a/tests/data/expected/main/openapi/openapi_webhooks_with_parameters.py b/tests/data/expected/main/openapi/openapi_webhooks_with_parameters.py index 3ecb89866..6809d2f66 100644 --- a/tests/data/expected/main/openapi/openapi_webhooks_with_parameters.py +++ b/tests/data/expected/main/openapi/openapi_webhooks_with_parameters.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, Field @@ -15,7 +13,7 @@ class Pet(BaseModel): class PetNewPostParametersQuery(BaseModel): - X_Request_Id: Optional[str] = Field(None, alias='X-Request-Id') + X_Request_Id: str | None = Field(None, alias='X-Request-Id') X_Webhook_Id: str = Field(..., alias='X-Webhook-Id') diff --git a/tests/data/expected/main/openapi/override_required_all_of.py b/tests/data/expected/main/openapi/override_required_all_of.py index a6b6db60f..fe5c79211 100644 --- a/tests/data/expected/main/openapi/override_required_all_of.py +++ b/tests/data/expected/main/openapi/override_required_all_of.py @@ -5,7 +5,6 @@ from __future__ import annotations from enum import Enum -from typing import Optional, Union from pydantic import BaseModel, Field @@ -16,17 +15,17 @@ class Type(Enum): class ObjectBase(BaseModel): - name: Optional[str] = Field(None, description='Name of the object') - type: Optional[Type] = Field(None, description='Object type') - rank: Optional[Union[int, float]] = Field(None, description='User rank') - allIn: Optional[Union[Type, str, Union[int, float]]] = None + name: str | None = Field(None, description='Name of the object') + type: Type | None = Field(None, description='Object type') + rank: int | float | None = Field(None, description='User rank') + allIn: Type | str | int | float | None = None class CreateObjectRequest(ObjectBase): name: str = Field(..., description='Name of the object') type: Type = Field(..., description='Object type') - rank: Union[int, float] = Field(..., description='User rank') - allIn: Union[Type, str, Union[int, float]] + rank: int | float = Field(..., description='User rank') + allIn: Type | str | int | float class UpdateObjectRequest(ObjectBase): diff --git a/tests/data/expected/main/openapi/paths_external_ref.py b/tests/data/expected/main/openapi/paths_external_ref.py index f09f3ae94..e91fa5b02 100644 --- a/tests/data/expected/main/openapi/paths_external_ref.py +++ b/tests/data/expected/main/openapi/paths_external_ref.py @@ -4,11 +4,9 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel class Cat(BaseModel): - name: Optional[str] = None - breed: Optional[str] = None + name: str | None = None + breed: str | None = None diff --git a/tests/data/expected/main/openapi/paths_ref_with_external_schema.py b/tests/data/expected/main/openapi/paths_ref_with_external_schema.py index aa4710b94..7995e9574 100644 --- a/tests/data/expected/main/openapi/paths_ref_with_external_schema.py +++ b/tests/data/expected/main/openapi/paths_ref_with_external_schema.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel @@ -17,7 +15,7 @@ class Error(BaseModel): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): diff --git a/tests/data/expected/main/openapi/pattern/general.py b/tests/data/expected/main/openapi/pattern/general.py index 93da3e249..0158cb1d6 100644 --- a/tests/data/expected/main/openapi/pattern/general.py +++ b/tests/data/expected/main/openapi/pattern/general.py @@ -4,19 +4,18 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, constr class Info(BaseModel): - hostName: Optional[ + hostName: ( constr( regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' ) - ] = None - arn: Optional[ - constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') - ] = None - tel: Optional[constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$')] = None - comment: Optional[constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$')] = None + | None + ) = None + arn: ( + constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') | None + ) = None + tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None + comment: constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None diff --git a/tests/data/expected/main/openapi/pattern/msgspec_pattern.py b/tests/data/expected/main/openapi/pattern/msgspec_pattern.py index 1bff69eda..fb80408ef 100644 --- a/tests/data/expected/main/openapi/pattern/msgspec_pattern.py +++ b/tests/data/expected/main/openapi/pattern/msgspec_pattern.py @@ -4,23 +4,23 @@ from __future__ import annotations -from typing import Annotated, Union +from typing import Annotated from msgspec import UNSET, Meta, Struct, UnsetType class Info(Struct): - hostName: Union[str, UnsetType] = UNSET - arn: Union[ + hostName: str | UnsetType = UNSET + arn: ( Annotated[ str, Meta(pattern='(^arn:([^:]*):([^:]*):([^:]*):(|\\*|[\\d]{12}):(.+)$)|^\\*$'), - ], - UnsetType, - ] = UNSET - tel: Union[ - Annotated[str, Meta(pattern='^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$')], UnsetType - ] = UNSET - comment: Union[ - Annotated[str, Meta(pattern='[^\\b\\f\\n\\r\\t\\\\a+.?\'"|()]+$')], UnsetType - ] = UNSET + ] + | UnsetType + ) = UNSET + tel: ( + Annotated[str, Meta(pattern='^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$')] | UnsetType + ) = UNSET + comment: ( + Annotated[str, Meta(pattern='[^\\b\\f\\n\\r\\t\\\\a+.?\'"|()]+$')] | UnsetType + ) = UNSET diff --git a/tests/data/expected/main/openapi/pattern/pydantic_v2.py b/tests/data/expected/main/openapi/pattern/pydantic_v2.py index e14ff6a55..7d3ef3535 100644 --- a/tests/data/expected/main/openapi/pattern/pydantic_v2.py +++ b/tests/data/expected/main/openapi/pattern/pydantic_v2.py @@ -4,19 +4,19 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, constr class Info(BaseModel): - hostName: Optional[ + hostName: ( constr( pattern=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])$' ) - ] = None - arn: Optional[ + | None + ) = None + arn: ( constr(pattern=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') - ] = None - tel: Optional[constr(pattern=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$')] = None - comment: Optional[constr(pattern=r'[^\b\f\n\r\t\\a+.?\'"|()]+$')] = None + | None + ) = None + tel: constr(pattern=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None + comment: constr(pattern=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None diff --git a/tests/data/expected/main/openapi/pattern_with_lookaround_pydantic_v2.py b/tests/data/expected/main/openapi/pattern_with_lookaround_pydantic_v2.py index dac799334..6a61fe282 100644 --- a/tests/data/expected/main/openapi/pattern_with_lookaround_pydantic_v2.py +++ b/tests/data/expected/main/openapi/pattern_with_lookaround_pydantic_v2.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel, ConfigDict, constr @@ -13,4 +11,4 @@ class Info(BaseModel): model_config = ConfigDict( regex_engine="python-re", ) - name: Optional[constr(pattern=r'.*foo.*(? None: "# filename: input.json\n" "# timestamp: 2019-07-26T00:00:00+00:00\n\n" "from __future__ import annotations\n\n" - "from typing import Optional\n\n" "from pydantic import BaseModel\n\n" - "class FooBar(BaseModel):\n value: Optional[str] = None\n\n" - "class BazQux(BaseModel):\n value: Optional[int] = None\n\n" - "class Baz0qux(BaseModel):\n value: Optional[int] = None\n\n" - "class Foo1bar(BaseModel):\n value: Optional[str] = None\n\n" - "class Model(BaseModel):\n foo_bar: Optional[Foo1bar] = None\n baz_qux: Optional[Baz0qux] = None\n" + "class FooBar(BaseModel):\n value: str | None = None\n\n" + "class BazQux(BaseModel):\n value: int | None = None\n\n" + "class Baz0qux(BaseModel):\n value: int | None = None\n\n" + "class Foo1bar(BaseModel):\n value: str | None = None\n\n" + "class Model(BaseModel):\n foo_bar: Foo1bar | None = None\n baz_qux: Baz0qux | None = None\n" ) input_file = tmp_path / "input.json" @@ -3511,17 +3510,16 @@ def test_main_json_pointer_percent_encoded_segments(tmp_path: Path) -> None: "# filename: input.json\n" "# timestamp: 2019-07-26T00:00:00+00:00\n\n" "from __future__ import annotations\n\n" - "from typing import Optional\n\n" "from pydantic import BaseModel\n\n" - "class FooBar(BaseModel):\n value: Optional[str] = None\n\n" - "class BazQux(BaseModel):\n value: Optional[int] = None\n\n" - "class SpaceKey(BaseModel):\n value: Optional[bool] = None\n\n" - "class Baz7Equx(BaseModel):\n value: Optional[int] = None\n\n" - "class Foo2Fbar(BaseModel):\n value: Optional[str] = None\n\n" - "class Space20key(BaseModel):\n value: Optional[bool] = None\n\n" - "class Model(BaseModel):\n foo_bar: Optional[Foo2Fbar] = None\n" - " baz_qux: Optional[Baz7Equx] = None\n" - " space_key: Optional[Space20key] = None\n" + "class FooBar(BaseModel):\n value: str | None = None\n\n" + "class BazQux(BaseModel):\n value: int | None = None\n\n" + "class SpaceKey(BaseModel):\n value: bool | None = None\n\n" + "class Baz7Equx(BaseModel):\n value: int | None = None\n\n" + "class Foo2Fbar(BaseModel):\n value: str | None = None\n\n" + "class Space20key(BaseModel):\n value: bool | None = None\n\n" + "class Model(BaseModel):\n foo_bar: Foo2Fbar | None = None\n" + " baz_qux: Baz7Equx | None = None\n" + " space_key: Space20key | None = None\n" ) input_file = tmp_path / "input.json" @@ -4070,13 +4068,12 @@ def test_main_jsonschema_file_url_ref(tmp_path: Path) -> None: "# generated by datamodel-codegen:\n" "# filename: main.json\n\n" "from __future__ import annotations\n\n" - "from typing import Optional\n\n" "from pydantic import BaseModel\n\n\n" "class Pet(BaseModel):\n" " name: str\n" - " age: Optional[int] = None\n\n\n" + " age: int | None = None\n\n\n" "class Model(BaseModel):\n" - " pet: Optional[Pet] = None\n" + " pet: Pet | None = None\n" ) run_main_and_assert( input_path=main_file, @@ -4113,12 +4110,11 @@ def test_main_jsonschema_file_url_ref_percent_encoded(tmp_path: Path) -> None: "# generated by datamodel-codegen:\n" "# filename: main.json\n\n" "from __future__ import annotations\n\n" - "from typing import Optional\n\n" "from pydantic import BaseModel\n\n\n" "class Pet(BaseModel):\n" - " name: Optional[str] = None\n\n\n" + " name: str | None = None\n\n\n" "class Model(BaseModel):\n" - " pet: Optional[Pet] = None\n" + " pet: Pet | None = None\n" ) run_main_and_assert( input_path=main_file, From 9cf74cd7f61fbe43294b4be420fa4abaa8746973 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 19 Dec 2025 17:57:59 +0000 Subject: [PATCH 02/17] docs: update CLI reference documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated by GitHub Actions --- docs/cli-reference/base-options.md | 30 +- docs/cli-reference/field-customization.md | 441 +++++----- docs/cli-reference/general-options.md | 222 +++-- docs/cli-reference/index.md | 2 +- docs/cli-reference/model-customization.md | 822 +++++++++---------- docs/cli-reference/openapi-only-options.md | 81 +- docs/cli-reference/quick-reference.md | 4 +- docs/cli-reference/template-customization.md | 213 +++-- docs/cli-reference/typing-customization.md | 454 +++++----- 9 files changed, 1051 insertions(+), 1218 deletions(-) diff --git a/docs/cli-reference/base-options.md b/docs/cli-reference/base-options.md index ebb995559..5fe6ba0d0 100644 --- a/docs/cli-reference/base-options.md +++ b/docs/cli-reference/base-options.md @@ -62,14 +62,12 @@ For consistent cross-platform behavior, explicitly specify `--encoding utf-8`. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, Field class 日本語Model(BaseModel): - 名前: Optional[str] = Field(None, description='ユーザー名') - 年齢: Optional[int] = None + 名前: str | None = Field(None, description='ユーザー名') + 年齢: int | None = None ``` --- @@ -122,15 +120,13 @@ schemas. Required unless using `--url` to fetch schema from a URL. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None ``` --- @@ -236,15 +232,13 @@ is written to stdout. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None ``` --- @@ -298,15 +292,13 @@ Format: `HeaderName:HeaderValue`. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None ``` --- diff --git a/docs/cli-reference/field-customization.md b/docs/cli-reference/field-customization.md index 0845cd2a6..dfc0515f5 100644 --- a/docs/cli-reference/field-customization.md +++ b/docs/cli-reference/field-customization.md @@ -243,15 +243,13 @@ providing fine-grained control over generated names independent of schema defini from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id_: int = Field(..., alias='id') name_: str = Field(..., alias='name') - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -261,7 +259,7 @@ providing fine-grained control over generated names independent of schema defini class User(BaseModel): id_: int = Field(..., alias='id') name_: str = Field(..., alias='name') - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -282,16 +280,16 @@ providing fine-grained control over generated names independent of schema defini class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -301,11 +299,11 @@ providing fine-grained control over generated names independent of schema defini class Event(BaseModel): - name_: Optional[str] = Field(None, alias='name') + name_: str | None = Field(None, alias='name') class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` === "msgspec" @@ -317,7 +315,7 @@ providing fine-grained control over generated names independent of schema defini from __future__ import annotations - from typing import Annotated, TypeAlias, Union + from typing import Annotated, TypeAlias from msgspec import UNSET, Meta, Struct, UnsetType, field @@ -325,7 +323,7 @@ providing fine-grained control over generated names independent of schema defini class Pet(Struct): id_: int = field(name='id') name_: str = field(name='name') - tag: Union[str, UnsetType] = UNSET + tag: str | UnsetType = UNSET Pets: TypeAlias = list[Pet] @@ -334,7 +332,7 @@ providing fine-grained control over generated names independent of schema defini class User(Struct): id_: int = field(name='id') name_: str = field(name='name') - tag: Union[str, UnsetType] = UNSET + tag: str | UnsetType = UNSET Users: TypeAlias = list[User] @@ -352,33 +350,33 @@ providing fine-grained control over generated names independent of schema defini class Api(Struct): - apiKey: Union[ - Annotated[str, Meta(description='To be used as a dataset parameter value')], - UnsetType, - ] = UNSET - apiVersionNumber: Union[ - Annotated[str, Meta(description='To be used as a version parameter value')], - UnsetType, - ] = UNSET - apiUrl: Union[ - Annotated[str, Meta(description="The URL describing the dataset's fields")], - UnsetType, - ] = UNSET - apiDocumentationUrl: Union[ - Annotated[str, Meta(description='A URL to the API console for each API')], - UnsetType, - ] = UNSET + apiKey: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = UNSET + apiVersionNumber: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = UNSET + apiUrl: ( + Annotated[str, Meta(description="The URL describing the dataset's fields")] + | UnsetType + ) = UNSET + apiDocumentationUrl: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = UNSET Apis: TypeAlias = list[Api] class Event(Struct): - name_: Union[str, UnsetType] = field(name='name', default=UNSET) + name_: str | UnsetType = field(name='name', default=UNSET) class Result(Struct): - event: Union[Event, UnsetType] = UNSET + event: Event | UnsetType = UNSET ``` === "JSON Schema" @@ -431,25 +429,23 @@ providing fine-grained control over generated names independent of schema defini from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, Field class User(BaseModel): - user_name: Optional[str] = Field(None, alias='name') - id: Optional[int] = None + user_name: str | None = Field(None, alias='name') + id: int | None = None class Address(BaseModel): - address_name: Optional[str] = Field(None, alias='name') - city: Optional[str] = None + address_name: str | None = Field(None, alias='name') + city: str | None = None class Root(BaseModel): - root_name: Optional[str] = Field(None, alias='name') - user: Optional[User] = Field(None, title='User') - address: Optional[Address] = Field(None, title='Address') + root_name: str | None = Field(None, alias='name') + user: User | None = Field(None, title='User') + address: Address | None = Field(None, title='Address') ``` === "GraphQL" @@ -474,7 +470,7 @@ providing fine-grained control over generated names independent of schema defini from __future__ import annotations - from typing import Annotated, Literal, Optional + from typing import Annotated, Literal from pydantic import BaseModel, Field from typing_extensions import TypeAliasType @@ -498,7 +494,7 @@ providing fine-grained control over generated names independent of schema defini periodFrom: Annotated[DateTime, Field(alias='from')] periodTo: Annotated[DateTime, Field(alias='to')] typename__: Annotated[ - Optional[Literal['DateTimePeriod']], Field(alias='__typename') + Literal['DateTimePeriod'] | None, Field(alias='__typename') ] = 'DateTimePeriod' ``` @@ -606,7 +602,6 @@ The `--empty-enum-field-name` flag configures the code generation behavior. from __future__ import annotations from enum import Enum - from typing import Optional from pydantic import BaseModel @@ -623,7 +618,7 @@ The `--empty-enum-field-name` flag configures the code generation behavior. class Model(BaseModel): - __root__: Optional[ModelEnum] = None + __root__: ModelEnum | None = None ``` --- @@ -802,7 +797,7 @@ store fields not defined in the schema. Options: allow, ignore, forbid. from __future__ import annotations - from typing import Literal, Optional, TypeAlias + from typing import Literal, TypeAlias from pydantic import BaseModel, Extra, Field @@ -842,7 +837,7 @@ store fields not defined in the schema. Options: allow, ignore, forbid. opening_crawl: String planets: list[Planet] planets_ids: list[ID] - producer: Optional[String] = None + producer: String | None = None release_date: String species: list[Species] species_ids: list[ID] @@ -851,123 +846,123 @@ store fields not defined in the schema. Options: allow, ignore, forbid. title: String vehicles: list[Vehicle] vehicles_ids: list[ID] - typename__: Optional[Literal['Film']] = Field('Film', alias='__typename') + typename__: Literal['Film'] | None = Field('Film', alias='__typename') class Person(BaseModel): class Config: extra = Extra.allow - birth_year: Optional[String] = None - eye_color: Optional[String] = None + birth_year: String | None = None + eye_color: String | None = None films: list[Film] films_ids: list[ID] - gender: Optional[String] = None - hair_color: Optional[String] = None - height: Optional[Int] = None - homeworld: Optional[Planet] = None - homeworld_id: Optional[ID] = None + gender: String | None = None + hair_color: String | None = None + height: Int | None = None + homeworld: Planet | None = None + homeworld_id: ID | None = None id: ID - mass: Optional[Int] = None + mass: Int | None = None name: String - skin_color: Optional[String] = None + skin_color: String | None = None species: list[Species] species_ids: list[ID] starships: list[Starship] starships_ids: list[ID] vehicles: list[Vehicle] vehicles_ids: list[ID] - typename__: Optional[Literal['Person']] = Field('Person', alias='__typename') + typename__: Literal['Person'] | None = Field('Person', alias='__typename') class Planet(BaseModel): class Config: extra = Extra.allow - climate: Optional[String] = None - diameter: Optional[String] = None + climate: String | None = None + diameter: String | None = None films: list[Film] films_ids: list[ID] - gravity: Optional[String] = None + gravity: String | None = None id: ID name: String - orbital_period: Optional[String] = None - population: Optional[String] = None + orbital_period: String | None = None + population: String | None = None residents: list[Person] residents_ids: list[ID] - rotation_period: Optional[String] = None - surface_water: Optional[String] = None - terrain: Optional[String] = None - typename__: Optional[Literal['Planet']] = Field('Planet', alias='__typename') + rotation_period: String | None = None + surface_water: String | None = None + terrain: String | None = None + typename__: Literal['Planet'] | None = Field('Planet', alias='__typename') class Species(BaseModel): class Config: extra = Extra.allow - average_height: Optional[String] = None - average_lifespan: Optional[String] = None - classification: Optional[String] = None - designation: Optional[String] = None - eye_colors: Optional[String] = None + average_height: String | None = None + average_lifespan: String | None = None + classification: String | None = None + designation: String | None = None + eye_colors: String | None = None films: list[Film] films_ids: list[ID] - hair_colors: Optional[String] = None + hair_colors: String | None = None id: ID - language: Optional[String] = None + language: String | None = None name: String people: list[Person] people_ids: list[ID] - skin_colors: Optional[String] = None - typename__: Optional[Literal['Species']] = Field('Species', alias='__typename') + skin_colors: String | None = None + typename__: Literal['Species'] | None = Field('Species', alias='__typename') class Starship(BaseModel): class Config: extra = Extra.allow - MGLT: Optional[String] = None - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None + MGLT: String | None = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None films: list[Film] films_ids: list[ID] - hyperdrive_rating: Optional[String] = None + hyperdrive_rating: String | None = None id: ID - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None name: String - passengers: Optional[String] = None + passengers: String | None = None pilots: list[Person] pilots_ids: list[ID] - starship_class: Optional[String] = None - typename__: Optional[Literal['Starship']] = Field('Starship', alias='__typename') + starship_class: String | None = None + typename__: Literal['Starship'] | None = Field('Starship', alias='__typename') class Vehicle(BaseModel): class Config: extra = Extra.allow - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None films: list[Film] films_ids: list[ID] id: ID - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None name: String - passengers: Optional[String] = None + passengers: String | None = None pilots: list[Person] pilots_ids: list[ID] - vehicle_class: Optional[String] = None - typename__: Optional[Literal['Vehicle']] = Field('Vehicle', alias='__typename') + vehicle_class: String | None = None + typename__: Literal['Vehicle'] | None = Field('Vehicle', alias='__typename') Film.update_forward_refs() @@ -1245,15 +1240,13 @@ Output differs between Pydantic v1 and v2 due to API changes. from __future__ import annotations - from typing import Optional, Union - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int = Field(..., ge=0, le=9223372036854775807) name: str = Field(..., max_length=256) - tag: Optional[str] = Field(None, max_length=64) + tag: str | None = Field(None, max_length=64) class Pets(BaseModel): @@ -1275,14 +1268,14 @@ Output differs between Pydantic v1 and v2 due to API changes. class User(BaseModel): id: int = Field(..., ge=0) name: str = Field(..., max_length=256) - tag: Optional[str] = Field(None, max_length=64) + tag: str | None = Field(None, max_length=64) uid: UID - phones: Optional[list[Phone]] = Field(None, max_items=10) - fax: Optional[list[FaxItem]] = None - height: Optional[Union[int, float]] = Field(None, ge=1.0, le=300.0) - weight: Optional[Union[float, int]] = Field(None, ge=1.0, le=1000.0) - age: Optional[int] = Field(None, gt=0, le=200) - rating: Optional[float] = Field(None, gt=0.0, le=5.0) + phones: list[Phone] | None = Field(None, max_items=10) + fax: list[FaxItem] | None = None + height: int | float | None = Field(None, ge=1.0, le=300.0) + weight: float | int | None = Field(None, ge=1.0, le=1000.0) + age: int | None = Field(None, gt=0, le=200) + rating: float | None = Field(None, gt=0.0, le=5.0) class Users(BaseModel): @@ -1303,16 +1296,16 @@ Output differs between Pydantic v1 and v2 due to API changes. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -1322,11 +1315,11 @@ Output differs between Pydantic v1 and v2 due to API changes. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` === "Pydantic v2" @@ -1338,15 +1331,13 @@ Output differs between Pydantic v1 and v2 due to API changes. from __future__ import annotations - from typing import Optional, Union - from pydantic import AnyUrl, BaseModel, Field, RootModel class Pet(BaseModel): id: int = Field(..., ge=0, le=9223372036854775807) name: str = Field(..., max_length=256) - tag: Optional[str] = Field(None, max_length=64) + tag: str | None = Field(None, max_length=64) class Pets(RootModel[list[Pet]]): @@ -1368,14 +1359,14 @@ Output differs between Pydantic v1 and v2 due to API changes. class User(BaseModel): id: int = Field(..., ge=0) name: str = Field(..., max_length=256) - tag: Optional[str] = Field(None, max_length=64) + tag: str | None = Field(None, max_length=64) uid: UID - phones: Optional[list[Phone]] = Field(None, max_length=10) - fax: Optional[list[FaxItem]] = None - height: Optional[Union[int, float]] = Field(None, ge=1.0, le=300.0) - weight: Optional[Union[float, int]] = Field(None, ge=1.0, le=1000.0) - age: Optional[int] = Field(None, gt=0, le=200) - rating: Optional[float] = Field(None, gt=0.0, le=5.0) + phones: list[Phone] | None = Field(None, max_length=10) + fax: list[FaxItem] | None = None + height: int | float | None = Field(None, ge=1.0, le=300.0) + weight: float | int | None = Field(None, ge=1.0, le=1000.0) + age: int | None = Field(None, gt=0, le=200) + rating: float | None = Field(None, gt=0.0, le=5.0) class Users(RootModel[list[User]]): @@ -1396,16 +1387,16 @@ Output differs between Pydantic v1 and v2 due to API changes. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -1415,11 +1406,11 @@ Output differs between Pydantic v1 and v2 due to API changes. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` === "JSON Schema" @@ -1488,8 +1479,6 @@ Output differs between Pydantic v1 and v2 due to API changes. from __future__ import annotations - from typing import Optional - from pydantic import ( BaseModel, Field, @@ -1502,17 +1491,17 @@ Output differs between Pydantic v1 and v2 due to API changes. class User(BaseModel): - name: Optional[StrictStr] = Field(None, example='ken') - age: Optional[StrictInt] = None - salary: Optional[StrictInt] = Field(None, ge=0) - debt: Optional[StrictInt] = Field(None, le=0) - loan: Optional[StrictFloat] = Field(None, le=0.0) - tel: Optional[StrictStr] = Field(None, regex='^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$') - height: Optional[StrictFloat] = Field(None, ge=0.0) - weight: Optional[StrictFloat] = Field(None, ge=0.0) - score: Optional[StrictFloat] = Field(None, ge=1e-08) - active: Optional[StrictBool] = None - photo: Optional[StrictBytes] = Field(None, min_length=100) + name: StrictStr | None = Field(None, example='ken') + age: StrictInt | None = None + salary: StrictInt | None = Field(None, ge=0) + debt: StrictInt | None = Field(None, le=0) + loan: StrictFloat | None = Field(None, le=0.0) + tel: StrictStr | None = Field(None, regex='^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$') + height: StrictFloat | None = Field(None, ge=0.0) + weight: StrictFloat | None = Field(None, ge=0.0) + score: StrictFloat | None = Field(None, ge=1e-08) + active: StrictBool | None = None + photo: StrictBytes | None = Field(None, min_length=100) ``` --- @@ -1582,13 +1571,11 @@ The `--field-extra-keys` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, Field class Extras(BaseModel): - name: Optional[str] = Field( + name: str | None = Field( None, description='normal key', example='example', @@ -1596,7 +1583,7 @@ The `--field-extra-keys` flag configures the code generation behavior. key2=456, repr=True, ) - age: Optional[int] = Field(None, example=12, examples=[13, 20]) + age: int | None = Field(None, example=12, examples=[13, 20]) ``` === "Pydantic v2" @@ -1608,22 +1595,18 @@ The `--field-extra-keys` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, Field class Extras(BaseModel): - name: Optional[str] = Field( + name: str | None = Field( None, description='normal key', examples=['example'], json_schema_extra={'key2': 456, 'invalid-key-1': 'abc'}, repr=True, ) - age: Optional[int] = Field( - None, examples=[13, 20], json_schema_extra={'example': 12} - ) + age: int | None = Field(None, examples=[13, 20], json_schema_extra={'example': 12}) ``` --- @@ -1696,13 +1679,11 @@ in Field(). This is useful for custom schema extensions and vendor-specific meta from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, Field class Extras(BaseModel): - name: Optional[str] = Field( + name: str | None = Field( None, description='normal key', example='example', @@ -1718,7 +1699,7 @@ in Field(). This is useful for custom schema extensions and vendor-specific meta schema_='klm', x_abc=True, ) - age: Optional[int] = Field(None, example=12, examples=[13, 20], writeOnly=True) + age: int | None = Field(None, example=12, examples=[13, 20], writeOnly=True) ``` === "Pydantic v2" @@ -1730,13 +1711,11 @@ in Field(). This is useful for custom schema extensions and vendor-specific meta from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, Field class Extras(BaseModel): - name: Optional[str] = Field( + name: str | None = Field( None, description='normal key', examples=['example'], @@ -1754,7 +1733,7 @@ in Field(). This is useful for custom schema extensions and vendor-specific meta }, repr=True, ) - age: Optional[int] = Field( + age: int | None = Field( None, examples=[13, 20], json_schema_extra={'example': 12, 'writeOnly': True} ) ``` @@ -1817,18 +1796,18 @@ The `--field-include-all-keys` flag configures the code generation behavior. from __future__ import annotations - from typing import Any, Optional + from typing import Any from pydantic import BaseModel, Field, conint class Person(BaseModel): - firstName: Optional[str] = Field(None, description="The person's first name.") - lastName: Optional[str] = Field(None, description="The person's last name.") - age: Optional[conint(ge=0)] = Field( + firstName: str | None = Field(None, description="The person's first name.") + lastName: str | None = Field(None, description="The person's last name.") + age: conint(ge=0) | None = Field( None, description='Age in years which must be equal to or greater than zero.' ) - friends: Optional[list[Any]] = None + friends: list[Any] | None = None comment: None = None ``` @@ -1888,15 +1867,13 @@ With this flag, only Python-safe names are used without aliases. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Person(BaseModel): first_name: str last_name: str - email_address: Optional[str] = None + email_address: str | None = None ``` === "Without Option" @@ -1972,7 +1949,6 @@ snake_case conversion. from __future__ import annotations from enum import Enum - from typing import Optional from pydantic import BaseModel, Field @@ -1982,7 +1958,7 @@ snake_case conversion. class Model(BaseModel): - space_if: Optional[SpaceIF] = Field(None, alias='SpaceIF') + space_if: SpaceIF | None = Field(None, alias='SpaceIF') ``` --- @@ -2036,17 +2012,15 @@ The `--remove-special-field-name-prefix` flag configures the code generation beh from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Model(BaseModel): id: AnyUrl = Field(..., alias='@id', title='Id must be presesnt and must be a URI') type: str = Field(..., alias='@type') - type_1: Optional[str] = Field(None, alias='@+!type') - type_2: Optional[str] = Field(None, alias='@-!type') - profile: Optional[str] = None + type_1: str | None = Field(None, alias='@+!type') + type_2: str | None = Field(None, alias='@-!type') + profile: str | None = None ``` --- @@ -2133,7 +2107,6 @@ The `--set-default-enum-member` flag configures the code generation behavior. from __future__ import annotations from enum import Enum - from typing import Optional from pydantic import BaseModel, Field @@ -2150,10 +2123,10 @@ The `--set-default-enum-member` flag configures the code generation behavior. class User(BaseModel): - name: Optional[str] = None - animal: Optional[Animal] = Animal.dog - pet: Optional[Animal] = Animal.cat - redistribute: Optional[list[RedistributeEnum]] = None + name: str | None = None + animal: Animal | None = Animal.dog + pet: Animal | None = Animal.cat + redistribute: list[RedistributeEnum] | None = None class Redistribute(BaseModel): @@ -2271,7 +2244,6 @@ The `--special-field-name-prefix` flag configures the code generation behavior. from __future__ import annotations from enum import Enum - from typing import Optional from pydantic import BaseModel @@ -2288,7 +2260,7 @@ The `--special-field-name-prefix` flag configures the code generation behavior. class Model(BaseModel): - __root__: Optional[ModelEnum] = None + __root__: ModelEnum | None = None ``` --- @@ -2344,8 +2316,6 @@ This provides better IDE support for hovering over attributes. Requires from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, ConfigDict @@ -2357,7 +2327,7 @@ This provides better IDE support for hovering over attributes. Requires """ The person's full name """ - age: Optional[int] = None + age: int | None = None """ The person's age in years """ @@ -2436,7 +2406,7 @@ The `--use-enum-values-in-discriminator` flag configures the code generation beh from __future__ import annotations from enum import Enum - from typing import Literal, Union + from typing import Literal from pydantic import BaseModel, Field, RootModel @@ -2459,8 +2429,8 @@ The `--use-enum-values-in-discriminator` flag configures the code generation beh version: Literal[RequestVersionEnum.v2] - class Request(RootModel[Union[RequestV1, RequestV2]]): - root: Union[RequestV1, RequestV2] = Field(..., discriminator='version') + class Request(RootModel[RequestV1 | RequestV2]): + root: RequestV1 | RequestV2 = Field(..., discriminator='version') ``` --- @@ -2680,15 +2650,13 @@ generated models, preserving documentation from the original schema. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -2698,7 +2666,7 @@ generated models, preserving documentation from the original schema. class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -2719,20 +2687,20 @@ generated models, preserving documentation from the original schema. class Api(BaseModel): - apiKey: Optional[str] = None + apiKey: str | None = None """ To be used as a dataset parameter value. Now also with multi-line docstrings. """ - apiVersionNumber: Optional[str] = None + apiVersionNumber: str | None = None """ To be used as a version parameter value """ - apiUrl: Optional[AnyUrl] = None + apiUrl: AnyUrl | None = None """ The URL describing the dataset's fields """ - apiDocumentationUrl: Optional[AnyUrl] = None + apiDocumentationUrl: AnyUrl | None = None """ A URL to the API console for each API """ @@ -2743,11 +2711,11 @@ generated models, preserving documentation from the original schema. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` === "JSON Schema" @@ -2801,7 +2769,7 @@ generated models, preserving documentation from the original schema. from __future__ import annotations - from typing import Annotated, Any, Optional, TypeAlias, Union + from typing import Annotated, Any, TypeAlias from pydantic import BaseModel, Field @@ -2811,25 +2779,23 @@ generated models, preserving documentation from the original schema. SimpleString: TypeAlias = str - UnionType: TypeAlias = Union[str, int] + UnionType: TypeAlias = str | int ArrayType: TypeAlias = list[str] - AnnotatedType: TypeAlias = Annotated[ - Union[str, bool], Field(..., title='MyAnnotatedType') - ] + AnnotatedType: TypeAlias = Annotated[str | bool, Field(..., title='MyAnnotatedType')] """ An annotated union type """ class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - union_field: Optional[UnionType] = None - array_field: Optional[ArrayType] = None - annotated_field: Optional[AnnotatedType] = None + simple_field: SimpleString | None = None + union_field: UnionType | None = None + array_field: ArrayType | None = None + annotated_field: AnnotatedType | None = None ``` --- @@ -3047,15 +3013,13 @@ documentation without using Field() wrappers. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -3065,7 +3029,7 @@ documentation without using Field() wrappers. class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -3086,7 +3050,7 @@ documentation without using Field() wrappers. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value.\nNow also with multi-line docstrings.', ) @@ -3095,17 +3059,17 @@ documentation without using Field() wrappers. Now also with multi-line docstrings. """ - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) """To be used as a version parameter value""" - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) """The URL describing the dataset's fields""" - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) """A URL to the API console for each API""" @@ -3116,11 +3080,11 @@ documentation without using Field() wrappers. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -3338,15 +3302,13 @@ useful for preserving documentation from your schema in the generated code. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -3356,7 +3318,7 @@ useful for preserving documentation from your schema in the generated code. class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -3382,17 +3344,17 @@ useful for preserving documentation from your schema in the generated code. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value.\nNow also with multi-line docstrings.', ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -3406,11 +3368,11 @@ useful for preserving documentation from your schema in the generated code. Event object """ - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -3541,7 +3503,6 @@ This is useful when schemas have descriptive titles that should be preserved. from __future__ import annotations from enum import Enum - from typing import Optional, Union from pydantic import BaseModel, Field @@ -3557,12 +3518,12 @@ This is useful when schemas have descriptive titles that should be preserved. class NestedCommentTitle(BaseModel): - comment: Optional[str] = None + comment: str | None = None class ProcessingStatusDetail(BaseModel): - id: Optional[int] = None - description: Optional[str] = None + id: int | None = None + description: str | None = None class ProcessingTasksTitle(BaseModel): @@ -3570,7 +3531,7 @@ This is useful when schemas have descriptive titles that should be preserved. class ExtendedProcessingTask(BaseModel): - __root__: Union[ProcessingTasksTitle, NestedCommentTitle] = Field( + __root__: ProcessingTasksTitle | NestedCommentTitle = Field( ..., title='Extended Processing Task Title' ) @@ -3582,12 +3543,12 @@ This is useful when schemas have descriptive titles that should be preserved. class ProcessingTaskTitle(BaseModel): - processing_status_union: Optional[ - Union[ProcessingStatusDetail, ExtendedProcessingTask, ProcessingStatusTitle] - ] = Field('COMPLETED', title='Processing Status Union Title') - processing_status: Optional[ProcessingStatusTitle] = 'COMPLETED' - name: Optional[str] = None - kind: Optional[Kind] = None + processing_status_union: ( + ProcessingStatusDetail | ExtendedProcessingTask | ProcessingStatusTitle | None + ) = Field('COMPLETED', title='Processing Status Union Title') + processing_status: ProcessingStatusTitle | None = 'COMPLETED' + name: str | None = None + kind: Kind | None = None ProcessingTasksTitle.update_forward_refs() diff --git a/docs/cli-reference/general-options.md b/docs/cli-reference/general-options.md index c0f88ef68..f125dbb54 100644 --- a/docs/cli-reference/general-options.md +++ b/docs/cli-reference/general-options.md @@ -343,9 +343,9 @@ uses the complete module path. Requires `--all-exports-scope=recursive`. # generated by datamodel-codegen: # filename: modular.yaml - from ._internal import DifferentTea, Error, Id, OptionalModel, Result, Source + from ._internal import DifferentTea, Error, Id, Optional, Result, Source - __all__ = ["DifferentTea", "Error", "Id", "OptionalModel", "Result", "Source"] + __all__ = ["DifferentTea", "Error", "Id", "Optional", "Result", "Source"] # _internal.py # generated by datamodel-codegen: @@ -353,14 +353,12 @@ uses the complete module path. Requires `--all-exports-scope=recursive`. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel from . import models - class OptionalModel(BaseModel): + class Optional(BaseModel): __root__: str @@ -374,39 +372,39 @@ uses the complete module path. Requires `--all-exports-scope=recursive`. class Result(BaseModel): - event: Optional[models.Event] = None + event: models.Event | None = None class Source(BaseModel): - country: Optional[str] = None + country: str | None = None class DifferentTea(BaseModel): - foo: Optional[Tea] = None - nested: Optional[Tea_1] = None + foo: Tea | None = None + nested: Tea_1 | None = None class Tea(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None + flavour: str | None = None + id: Id | None = None class Cocoa(BaseModel): - quality: Optional[int] = None + quality: int | None = None class Tea_1(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class TeaClone(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class List(BaseModel): @@ -434,7 +432,6 @@ uses the complete module path. Requires `--all-exports-scope=recursive`. from __future__ import annotations from enum import Enum - from typing import Optional from pydantic import AnyUrl, BaseModel, Field @@ -461,19 +458,19 @@ uses the complete module path. Requires `--all-exports-scope=recursive`. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) - stage: Optional[Stage] = None + stage: Stage | None = None class Apis(BaseModel): @@ -493,25 +490,25 @@ uses the complete module path. Requires `--all-exports-scope=recursive`. from __future__ import annotations - from typing import Any, Optional + from typing import Any from pydantic import BaseModel class Thing(BaseModel): - attributes: Optional[dict[str, Any]] = None + attributes: dict[str, Any] | None = None class Thang(BaseModel): - attributes: Optional[list[dict[str, Any]]] = None + attributes: list[dict[str, Any]] | None = None class Others(BaseModel): - name: Optional[str] = None + name: str | None = None class Clone(Thing): - others: Optional[Others] = None + others: Others | None = None # models.py # generated by datamodel-codegen: @@ -520,7 +517,7 @@ uses the complete module path. Requires `--all-exports-scope=recursive`. from __future__ import annotations from enum import Enum - from typing import Any, Optional, Union + from typing import Any from pydantic import BaseModel @@ -534,18 +531,18 @@ uses the complete module path. Requires `--all-exports-scope=recursive`. class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - species: Optional[Species] = None + tag: str | None = None + species: Species | None = None class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Event(BaseModel): - name: Optional[Union[str, float, int, bool, dict[str, Any], list[str]]] = None + name: str | float | int | bool | dict[str, Any] | list[str] | None = None # nested/__init__.py # generated by datamodel-codegen: @@ -579,8 +576,6 @@ uses the complete module path. Requires `--all-exports-scope=recursive`. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel from .. import bar @@ -588,10 +583,10 @@ uses the complete module path. Requires `--all-exports-scope=recursive`. class Chocolate(BaseModel): - flavour: Optional[str] = None - source: Optional[Source] = None - cocoa: Optional[Cocoa] = None - field: Optional[bar.FieldModel] = None + flavour: str | None = None + source: Source | None = None + cocoa: Cocoa | None = None + field: bar.FieldModel | None = None ``` --- @@ -917,9 +912,9 @@ Use 'recursive' to include all descendant exports with collision handling. # generated by datamodel-codegen: # filename: modular.yaml - from ._internal import DifferentTea, Error, Id, OptionalModel, Result, Source + from ._internal import DifferentTea, Error, Id, Optional, Result, Source - __all__ = ["DifferentTea", "Error", "Id", "OptionalModel", "Result", "Source"] + __all__ = ["DifferentTea", "Error", "Id", "Optional", "Result", "Source"] # _internal.py # generated by datamodel-codegen: @@ -927,14 +922,12 @@ Use 'recursive' to include all descendant exports with collision handling. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel from . import models - class OptionalModel(BaseModel): + class Optional(BaseModel): __root__: str @@ -948,39 +941,39 @@ Use 'recursive' to include all descendant exports with collision handling. class Result(BaseModel): - event: Optional[models.Event] = None + event: models.Event | None = None class Source(BaseModel): - country: Optional[str] = None + country: str | None = None class DifferentTea(BaseModel): - foo: Optional[Tea] = None - nested: Optional[Tea_1] = None + foo: Tea | None = None + nested: Tea_1 | None = None class Tea(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None + flavour: str | None = None + id: Id | None = None class Cocoa(BaseModel): - quality: Optional[int] = None + quality: int | None = None class Tea_1(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class TeaClone(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[list[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: list[Optional] | None = None class List(BaseModel): @@ -1008,7 +1001,6 @@ Use 'recursive' to include all descendant exports with collision handling. from __future__ import annotations from enum import Enum - from typing import Optional from pydantic import AnyUrl, BaseModel, Field @@ -1035,19 +1027,19 @@ Use 'recursive' to include all descendant exports with collision handling. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) - stage: Optional[Stage] = None + stage: Stage | None = None class Apis(BaseModel): @@ -1067,25 +1059,25 @@ Use 'recursive' to include all descendant exports with collision handling. from __future__ import annotations - from typing import Any, Optional + from typing import Any from pydantic import BaseModel class Thing(BaseModel): - attributes: Optional[dict[str, Any]] = None + attributes: dict[str, Any] | None = None class Thang(BaseModel): - attributes: Optional[list[dict[str, Any]]] = None + attributes: list[dict[str, Any]] | None = None class Others(BaseModel): - name: Optional[str] = None + name: str | None = None class Clone(Thing): - others: Optional[Others] = None + others: Others | None = None # models.py # generated by datamodel-codegen: @@ -1094,7 +1086,7 @@ Use 'recursive' to include all descendant exports with collision handling. from __future__ import annotations from enum import Enum - from typing import Any, Optional, Union + from typing import Any from pydantic import BaseModel @@ -1108,18 +1100,18 @@ Use 'recursive' to include all descendant exports with collision handling. class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - species: Optional[Species] = None + tag: str | None = None + species: Species | None = None class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Event(BaseModel): - name: Optional[Union[str, float, int, bool, dict[str, Any], list[str]]] = None + name: str | float | int | bool | dict[str, Any] | list[str] | None = None # nested/__init__.py # generated by datamodel-codegen: @@ -1153,8 +1145,6 @@ Use 'recursive' to include all descendant exports with collision handling. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel from .. import bar @@ -1162,10 +1152,10 @@ Use 'recursive' to include all descendant exports with collision handling. class Chocolate(BaseModel): - flavour: Optional[str] = None - source: Optional[Source] = None - cocoa: Optional[Cocoa] = None - field: Optional[bar.FieldModel] = None + flavour: str | None = None + source: Source | None = None + cocoa: Cocoa | None = None + field: bar.FieldModel | None = None ``` --- @@ -1343,27 +1333,25 @@ or potential issues). Useful for clean output in CI/CD pipelines. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Home(BaseModel): - address: Optional[str] = None - zip: Optional[str] = None + address: str | None = None + zip: str | None = None class Kind(BaseModel): - description: Optional[str] = None + description: str | None = None class Id(BaseModel): - id: Optional[int] = None + id: int | None = None class Pet(Home, Kind, Id): - name: Optional[str] = None - age: Optional[int] = None + name: str | None = None + age: int | None = None ``` --- @@ -1483,15 +1471,13 @@ Format: `HeaderName:HeaderValue`. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None ``` --- @@ -1544,15 +1530,13 @@ environments with self-signed certificates. Not recommended for production. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None ``` --- @@ -1606,15 +1590,13 @@ specified: `--http-query-parameters version=v2 format=json`. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None ``` --- @@ -1663,14 +1645,12 @@ testing without project configuration. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Model(BaseModel): - firstName: Optional[str] = None - lastName: Optional[str] = None + firstName: str | None = None + lastName: str | None = None ``` === "Without Option" @@ -1776,16 +1756,14 @@ create an __init__.py that re-exports all models for convenient imports. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel from .user import User class Order(BaseModel): - id: Optional[int] = None - user: Optional[User] = None + id: int | None = None + user: User | None = None # user.py # generated by datamodel-codegen: @@ -1793,14 +1771,12 @@ create an __init__.py that re-exports all models for convenient imports. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class User(BaseModel): - id: Optional[int] = None - name: Optional[str] = None + id: int | None = None + name: str | None = None ``` --- @@ -1858,15 +1834,13 @@ Note: This option only affects modular output with tree-level model reuse. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None ``` --- diff --git a/docs/cli-reference/index.md b/docs/cli-reference/index.md index 48f82fe43..d7c5becfb 100644 --- a/docs/cli-reference/index.md +++ b/docs/cli-reference/index.md @@ -113,6 +113,7 @@ This documentation is auto-generated from test cases. - [`--no-color`](utility-options.md#no-color) - [`--no-use-specialized-enum`](typing-customization.md#no-use-specialized-enum) - [`--no-use-standard-collections`](typing-customization.md#no-use-standard-collections) +- [`--no-use-union-operator`](typing-customization.md#no-use-union-operator) ### O {#o} @@ -177,7 +178,6 @@ This documentation is auto-generated from test cases. - [`--use-subclass-enum`](model-customization.md#use-subclass-enum) - [`--use-title-as-name`](field-customization.md#use-title-as-name) - [`--use-type-alias`](typing-customization.md#use-type-alias) -- [`--use-union-operator`](typing-customization.md#use-union-operator) - [`--use-unique-items-as-set`](typing-customization.md#use-unique-items-as-set) ### V {#v} diff --git a/docs/cli-reference/model-customization.md b/docs/cli-reference/model-customization.md index 85111b00c..a973e3841 100644 --- a/docs/cli-reference/model-customization.md +++ b/docs/cli-reference/model-customization.md @@ -244,8 +244,6 @@ The `--allow-extra-fields` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Extra, Field @@ -255,7 +253,7 @@ The `--allow-extra-fields` flag configures the code generation behavior. id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -271,7 +269,7 @@ The `--allow-extra-fields` flag configures the code generation behavior. id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -307,16 +305,16 @@ The `--allow-extra-fields` flag configures the code generation behavior. class Config: extra = Extra.allow - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -332,14 +330,14 @@ The `--allow-extra-fields` flag configures the code generation behavior. class Config: extra = Extra.allow - name: Optional[str] = None + name: str | None = None class Result(BaseModel): class Config: extra = Extra.allow - event: Optional[Event] = None + event: Event | None = None ``` === "Pydantic v2" @@ -351,8 +349,6 @@ The `--allow-extra-fields` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel @@ -362,7 +358,7 @@ The `--allow-extra-fields` flag configures the code generation behavior. ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(RootModel[list[Pet]]): @@ -375,7 +371,7 @@ The `--allow-extra-fields` flag configures the code generation behavior. ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(RootModel[list[User]]): @@ -402,16 +398,16 @@ The `--allow-extra-fields` flag configures the code generation behavior. model_config = ConfigDict( extra='allow', ) - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -424,14 +420,14 @@ The `--allow-extra-fields` flag configures the code generation behavior. model_config = ConfigDict( extra='allow', ) - name: Optional[str] = None + name: str | None = None class Result(BaseModel): model_config = ConfigDict( extra='allow', ) - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -647,8 +643,6 @@ The `--allow-population-by-field-name` flag configures the code generation behav from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field @@ -658,7 +652,7 @@ The `--allow-population-by-field-name` flag configures the code generation behav id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -674,7 +668,7 @@ The `--allow-population-by-field-name` flag configures the code generation behav id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -710,16 +704,16 @@ The `--allow-population-by-field-name` flag configures the code generation behav class Config: allow_population_by_field_name = True - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -735,14 +729,14 @@ The `--allow-population-by-field-name` flag configures the code generation behav class Config: allow_population_by_field_name = True - name: Optional[str] = None + name: str | None = None class Result(BaseModel): class Config: allow_population_by_field_name = True - event: Optional[Event] = None + event: Event | None = None ``` === "Pydantic v2" @@ -754,8 +748,6 @@ The `--allow-population-by-field-name` flag configures the code generation behav from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel @@ -765,7 +757,7 @@ The `--allow-population-by-field-name` flag configures the code generation behav ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(RootModel[list[Pet]]): @@ -781,7 +773,7 @@ The `--allow-population-by-field-name` flag configures the code generation behav ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(RootModel[list[User]]): @@ -817,16 +809,16 @@ The `--allow-population-by-field-name` flag configures the code generation behav model_config = ConfigDict( populate_by_name=True, ) - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -842,14 +834,14 @@ The `--allow-population-by-field-name` flag configures the code generation behav model_config = ConfigDict( populate_by_name=True, ) - name: Optional[str] = None + name: str | None = None class Result(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -1063,8 +1055,6 @@ The `--base-class` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, Field from custom_module import Base @@ -1073,7 +1063,7 @@ The `--base-class` flag configures the code generation behavior. class Pet(Base): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(Base): @@ -1083,7 +1073,7 @@ The `--base-class` flag configures the code generation behavior. class User(Base): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(Base): @@ -1104,16 +1094,16 @@ The `--base-class` flag configures the code generation behavior. class Api(Base): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -1123,11 +1113,11 @@ The `--base-class` flag configures the code generation behavior. class Event(Base): - name: Optional[str] = None + name: str | None = None class Result(Base): - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -1191,18 +1181,18 @@ naming convention than what's in the schema. from __future__ import annotations - from typing import Any, Optional + from typing import Any from pydantic import BaseModel, Field, conint class ValidModelName(BaseModel): - firstName: Optional[str] = Field(None, description="The person's first name.") - lastName: Optional[str] = Field(None, description="The person's last name.") - age: Optional[conint(ge=0)] = Field( + firstName: str | None = Field(None, description="The person's first name.") + lastName: str | None = Field(None, description="The person's last name.") + age: conint(ge=0) | None = Field( None, description='Age in years which must be equal to or greater than zero.' ) - friends: Optional[list[Any]] = None + friends: list[Any] | None = None comment: None = None ``` @@ -1584,7 +1574,7 @@ control over dataclass generation. from __future__ import annotations from dataclasses import dataclass - from typing import Literal, Optional, TypeAlias + from typing import Literal, TypeAlias Boolean: TypeAlias = bool """ @@ -1628,8 +1618,8 @@ control over dataclass generation. title: String vehicles: list[Vehicle] vehicles_ids: list[ID] - producer: Optional[String] = None - typename__: Optional[Literal['Film']] = 'Film' + producer: String | None = None + typename__: Literal['Film'] | None = 'Film' @dataclass(order=True, slots=True) @@ -1644,16 +1634,16 @@ control over dataclass generation. starships_ids: list[ID] vehicles: list[Vehicle] vehicles_ids: list[ID] - birth_year: Optional[String] = None - eye_color: Optional[String] = None - gender: Optional[String] = None - hair_color: Optional[String] = None - height: Optional[Int] = None - homeworld: Optional[Planet] = None - homeworld_id: Optional[ID] = None - mass: Optional[Int] = None - skin_color: Optional[String] = None - typename__: Optional[Literal['Person']] = 'Person' + birth_year: String | None = None + eye_color: String | None = None + gender: String | None = None + hair_color: String | None = None + height: Int | None = None + homeworld: Planet | None = None + homeworld_id: ID | None = None + mass: Int | None = None + skin_color: String | None = None + typename__: Literal['Person'] | None = 'Person' @dataclass(order=True, slots=True) @@ -1664,15 +1654,15 @@ control over dataclass generation. name: String residents: list[Person] residents_ids: list[ID] - climate: Optional[String] = None - diameter: Optional[String] = None - gravity: Optional[String] = None - orbital_period: Optional[String] = None - population: Optional[String] = None - rotation_period: Optional[String] = None - surface_water: Optional[String] = None - terrain: Optional[String] = None - typename__: Optional[Literal['Planet']] = 'Planet' + climate: String | None = None + diameter: String | None = None + gravity: String | None = None + orbital_period: String | None = None + population: String | None = None + rotation_period: String | None = None + surface_water: String | None = None + terrain: String | None = None + typename__: Literal['Planet'] | None = 'Planet' @dataclass(order=True, slots=True) @@ -1683,15 +1673,15 @@ control over dataclass generation. name: String people: list[Person] people_ids: list[ID] - average_height: Optional[String] = None - average_lifespan: Optional[String] = None - classification: Optional[String] = None - designation: Optional[String] = None - eye_colors: Optional[String] = None - hair_colors: Optional[String] = None - language: Optional[String] = None - skin_colors: Optional[String] = None - typename__: Optional[Literal['Species']] = 'Species' + average_height: String | None = None + average_lifespan: String | None = None + classification: String | None = None + designation: String | None = None + eye_colors: String | None = None + hair_colors: String | None = None + language: String | None = None + skin_colors: String | None = None + typename__: Literal['Species'] | None = 'Species' @dataclass(order=True, slots=True) @@ -1702,19 +1692,19 @@ control over dataclass generation. name: String pilots: list[Person] pilots_ids: list[ID] - MGLT: Optional[String] = None - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - hyperdrive_rating: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - starship_class: Optional[String] = None - typename__: Optional[Literal['Starship']] = 'Starship' + MGLT: String | None = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + hyperdrive_rating: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + starship_class: String | None = None + typename__: Literal['Starship'] | None = 'Starship' @dataclass(order=True, slots=True) @@ -1725,17 +1715,17 @@ control over dataclass generation. name: String pilots: list[Person] pilots_ids: list[ID] - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - vehicle_class: Optional[String] = None - typename__: Optional[Literal['Vehicle']] = 'Vehicle' + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + vehicle_class: String | None = None + typename__: Literal['Vehicle'] | None = 'Vehicle' ``` --- @@ -1951,8 +1941,6 @@ The `--enable-faux-immutability` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field @@ -1962,7 +1950,7 @@ The `--enable-faux-immutability` flag configures the code generation behavior. id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -1978,7 +1966,7 @@ The `--enable-faux-immutability` flag configures the code generation behavior. id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -2014,16 +2002,16 @@ The `--enable-faux-immutability` flag configures the code generation behavior. class Config: allow_mutation = False - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -2039,14 +2027,14 @@ The `--enable-faux-immutability` flag configures the code generation behavior. class Config: allow_mutation = False - name: Optional[str] = None + name: str | None = None class Result(BaseModel): class Config: allow_mutation = False - event: Optional[Event] = None + event: Event | None = None ``` === "Pydantic v2" @@ -2058,8 +2046,6 @@ The `--enable-faux-immutability` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel @@ -2069,7 +2055,7 @@ The `--enable-faux-immutability` flag configures the code generation behavior. ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(RootModel[list[Pet]]): @@ -2085,7 +2071,7 @@ The `--enable-faux-immutability` flag configures the code generation behavior. ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(RootModel[list[User]]): @@ -2121,16 +2107,16 @@ The `--enable-faux-immutability` flag configures the code generation behavior. model_config = ConfigDict( frozen=True, ) - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -2146,14 +2132,14 @@ The `--enable-faux-immutability` flag configures the code generation behavior. model_config = ConfigDict( frozen=True, ) - name: Optional[str] = None + name: str | None = None class Result(BaseModel): model_config = ConfigDict( frozen=True, ) - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -2367,69 +2353,67 @@ The `--force-optional` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): - id: Optional[int] = 1 - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = 1 + name: str | None = None + tag: str | None = None class Pets(BaseModel): - __root__: Optional[list[Pet]] = None + __root__: list[Pet] | None = None class User(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None class Users(BaseModel): - __root__: Optional[list[User]] = None + __root__: list[User] | None = None class Id(BaseModel): - __root__: Optional[str] = None + __root__: str | None = None class Rules(BaseModel): - __root__: Optional[list[str]] = None + __root__: list[str] | None = None class Error(BaseModel): - code: Optional[int] = None - message: Optional[str] = None + code: int | None = None + message: str | None = None class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) class Apis(BaseModel): - __root__: Optional[list[Api]] = None + __root__: list[Api] | None = None class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -2489,14 +2473,13 @@ keyword-only arguments. from __future__ import annotations from dataclasses import dataclass - from typing import Optional @dataclass(frozen=True) class User: name: str age: int - email: Optional[str] = None + email: str | None = None ``` --- @@ -2635,18 +2618,16 @@ of model definitions matters for documentation or readability. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, Field class DogBase(BaseModel): - name: Optional[str] = Field(None, title='Name') - woof: Optional[bool] = Field(True, title='Woof') + name: str | None = Field(None, title='Name') + woof: bool | None = Field(True, title='Woof') class DogRelationships(BaseModel): - people: Optional[list[Person]] = Field(None, title='People') + people: list[Person] | None = Field(None, title='People') class Dog(DogBase, DogRelationships): @@ -2654,11 +2635,11 @@ of model definitions matters for documentation or readability. class PersonBase(BaseModel): - name: Optional[str] = Field(None, title='Name') + name: str | None = Field(None, title='Name') class PersonRelationships(BaseModel): - people: Optional[list[Person]] = Field(None, title='People') + people: list[Person] | None = Field(None, title='People') class Person(PersonBase, PersonRelationships): @@ -2666,12 +2647,12 @@ of model definitions matters for documentation or readability. class PersonsBestFriend(BaseModel): - people: Optional[list[Person]] = Field(None, title='People') - dogs: Optional[list[Dog]] = Field(None, title='Dogs') - dog_base: Optional[DogBase] = None - dog_relationships: Optional[DogRelationships] = None - person_base: Optional[PersonBase] = None - person_relationships: Optional[PersonRelationships] = None + people: list[Person] | None = Field(None, title='People') + dogs: list[Dog] | None = Field(None, title='Dogs') + dog_base: DogBase | None = None + dog_relationships: DogRelationships | None = None + person_base: PersonBase | None = None + person_relationships: PersonRelationships | None = None DogRelationships.update_forward_refs() @@ -2750,15 +2731,15 @@ argument errors. from __future__ import annotations from dataclasses import dataclass - from typing import Any, Optional + from typing import Any @dataclass(frozen=True, kw_only=True) class Person: - firstName: Optional[str] = None - lastName: Optional[str] = None - age: Optional[int] = None - friends: Optional[list[Any]] = None + firstName: str | None = None + lastName: str | None = None + age: int | None = None + friends: list[Any] | None = None comment: None = None ``` @@ -2921,7 +2902,7 @@ argument errors. from __future__ import annotations from dataclasses import dataclass - from typing import Literal, Optional, TypeAlias + from typing import Literal, TypeAlias Boolean: TypeAlias = bool """ @@ -2965,8 +2946,8 @@ argument errors. title: String vehicles: list[Vehicle] vehicles_ids: list[ID] - producer: Optional[String] = None - typename__: Optional[Literal['Film']] = 'Film' + producer: String | None = None + typename__: Literal['Film'] | None = 'Film' @dataclass(frozen=True, kw_only=True) @@ -2981,16 +2962,16 @@ argument errors. starships_ids: list[ID] vehicles: list[Vehicle] vehicles_ids: list[ID] - birth_year: Optional[String] = None - eye_color: Optional[String] = None - gender: Optional[String] = None - hair_color: Optional[String] = None - height: Optional[Int] = None - homeworld: Optional[Planet] = None - homeworld_id: Optional[ID] = None - mass: Optional[Int] = None - skin_color: Optional[String] = None - typename__: Optional[Literal['Person']] = 'Person' + birth_year: String | None = None + eye_color: String | None = None + gender: String | None = None + hair_color: String | None = None + height: Int | None = None + homeworld: Planet | None = None + homeworld_id: ID | None = None + mass: Int | None = None + skin_color: String | None = None + typename__: Literal['Person'] | None = 'Person' @dataclass(frozen=True, kw_only=True) @@ -3001,15 +2982,15 @@ argument errors. name: String residents: list[Person] residents_ids: list[ID] - climate: Optional[String] = None - diameter: Optional[String] = None - gravity: Optional[String] = None - orbital_period: Optional[String] = None - population: Optional[String] = None - rotation_period: Optional[String] = None - surface_water: Optional[String] = None - terrain: Optional[String] = None - typename__: Optional[Literal['Planet']] = 'Planet' + climate: String | None = None + diameter: String | None = None + gravity: String | None = None + orbital_period: String | None = None + population: String | None = None + rotation_period: String | None = None + surface_water: String | None = None + terrain: String | None = None + typename__: Literal['Planet'] | None = 'Planet' @dataclass(frozen=True, kw_only=True) @@ -3020,15 +3001,15 @@ argument errors. name: String people: list[Person] people_ids: list[ID] - average_height: Optional[String] = None - average_lifespan: Optional[String] = None - classification: Optional[String] = None - designation: Optional[String] = None - eye_colors: Optional[String] = None - hair_colors: Optional[String] = None - language: Optional[String] = None - skin_colors: Optional[String] = None - typename__: Optional[Literal['Species']] = 'Species' + average_height: String | None = None + average_lifespan: String | None = None + classification: String | None = None + designation: String | None = None + eye_colors: String | None = None + hair_colors: String | None = None + language: String | None = None + skin_colors: String | None = None + typename__: Literal['Species'] | None = 'Species' @dataclass(frozen=True, kw_only=True) @@ -3039,19 +3020,19 @@ argument errors. name: String pilots: list[Person] pilots_ids: list[ID] - MGLT: Optional[String] = None - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - hyperdrive_rating: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - starship_class: Optional[String] = None - typename__: Optional[Literal['Starship']] = 'Starship' + MGLT: String | None = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + hyperdrive_rating: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + starship_class: String | None = None + typename__: Literal['Starship'] | None = 'Starship' @dataclass(frozen=True, kw_only=True) @@ -3062,17 +3043,17 @@ argument errors. name: String pilots: list[Person] pilots_ids: list[ID] - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - vehicle_class: Optional[String] = None - typename__: Optional[Literal['Vehicle']] = 'Vehicle' + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + vehicle_class: String | None = None + typename__: Literal['Vehicle'] | None = 'Vehicle' ``` --- @@ -3142,13 +3123,13 @@ for the generated code. Supported values include `pydantic.BaseModel`, from __future__ import annotations - from typing import Any, Optional + from typing import Any from pydantic import BaseModel class MyObjItem(BaseModel): - items: Optional[list[Any]] + items: list[Any] | None class Model(BaseModel): @@ -3164,13 +3145,13 @@ for the generated code. Supported values include `pydantic.BaseModel`, from __future__ import annotations - from typing import Any, Optional + from typing import Any from pydantic import BaseModel class MyObjItem(BaseModel): - items: Optional[list[Any]] = None + items: list[Any] | None = None class Model(BaseModel): @@ -3337,7 +3318,7 @@ for the generated code. Supported values include `pydantic.BaseModel`, from __future__ import annotations - from typing import Literal, Optional, TypeAlias + from typing import Literal, TypeAlias from pydantic import BaseModel, Field @@ -3374,7 +3355,7 @@ for the generated code. Supported values include `pydantic.BaseModel`, opening_crawl: String planets: list[Planet] planets_ids: list[ID] - producer: Optional[String] = None + producer: String | None = None release_date: String species: list[Species] species_ids: list[ID] @@ -3383,108 +3364,108 @@ for the generated code. Supported values include `pydantic.BaseModel`, title: String vehicles: list[Vehicle] vehicles_ids: list[ID] - typename__: Optional[Literal['Film']] = Field('Film', alias='__typename') + typename__: Literal['Film'] | None = Field('Film', alias='__typename') class Person(BaseModel): - birth_year: Optional[String] = None - eye_color: Optional[String] = None + birth_year: String | None = None + eye_color: String | None = None films: list[Film] films_ids: list[ID] - gender: Optional[String] = None - hair_color: Optional[String] = None - height: Optional[Int] = None - homeworld: Optional[Planet] = None - homeworld_id: Optional[ID] = None + gender: String | None = None + hair_color: String | None = None + height: Int | None = None + homeworld: Planet | None = None + homeworld_id: ID | None = None id: ID - mass: Optional[Int] = None + mass: Int | None = None name: String - skin_color: Optional[String] = None + skin_color: String | None = None species: list[Species] species_ids: list[ID] starships: list[Starship] starships_ids: list[ID] vehicles: list[Vehicle] vehicles_ids: list[ID] - typename__: Optional[Literal['Person']] = Field('Person', alias='__typename') + typename__: Literal['Person'] | None = Field('Person', alias='__typename') class Planet(BaseModel): - climate: Optional[String] = None - diameter: Optional[String] = None + climate: String | None = None + diameter: String | None = None films: list[Film] films_ids: list[ID] - gravity: Optional[String] = None + gravity: String | None = None id: ID name: String - orbital_period: Optional[String] = None - population: Optional[String] = None + orbital_period: String | None = None + population: String | None = None residents: list[Person] residents_ids: list[ID] - rotation_period: Optional[String] = None - surface_water: Optional[String] = None - terrain: Optional[String] = None - typename__: Optional[Literal['Planet']] = Field('Planet', alias='__typename') + rotation_period: String | None = None + surface_water: String | None = None + terrain: String | None = None + typename__: Literal['Planet'] | None = Field('Planet', alias='__typename') class Species(BaseModel): - average_height: Optional[String] = None - average_lifespan: Optional[String] = None - classification: Optional[String] = None - designation: Optional[String] = None - eye_colors: Optional[String] = None + average_height: String | None = None + average_lifespan: String | None = None + classification: String | None = None + designation: String | None = None + eye_colors: String | None = None films: list[Film] films_ids: list[ID] - hair_colors: Optional[String] = None + hair_colors: String | None = None id: ID - language: Optional[String] = None + language: String | None = None name: String people: list[Person] people_ids: list[ID] - skin_colors: Optional[String] = None - typename__: Optional[Literal['Species']] = Field('Species', alias='__typename') + skin_colors: String | None = None + typename__: Literal['Species'] | None = Field('Species', alias='__typename') class Starship(BaseModel): - MGLT: Optional[String] = None - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None + MGLT: String | None = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None films: list[Film] films_ids: list[ID] - hyperdrive_rating: Optional[String] = None + hyperdrive_rating: String | None = None id: ID - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None name: String - passengers: Optional[String] = None + passengers: String | None = None pilots: list[Person] pilots_ids: list[ID] - starship_class: Optional[String] = None - typename__: Optional[Literal['Starship']] = Field('Starship', alias='__typename') + starship_class: String | None = None + typename__: Literal['Starship'] | None = Field('Starship', alias='__typename') class Vehicle(BaseModel): - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None films: list[Film] films_ids: list[ID] id: ID - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None name: String - passengers: Optional[String] = None + passengers: String | None = None pilots: list[Person] pilots_ids: list[ID] - vehicle_class: Optional[String] = None - typename__: Optional[Literal['Vehicle']] = Field('Vehicle', alias='__typename') + vehicle_class: String | None = None + typename__: Literal['Vehicle'] | None = Field('Vehicle', alias='__typename') Film.update_forward_refs() @@ -3501,7 +3482,7 @@ for the generated code. Supported values include `pydantic.BaseModel`, from __future__ import annotations from dataclasses import dataclass - from typing import Literal, Optional, TypeAlias + from typing import Literal, TypeAlias Boolean: TypeAlias = bool """ @@ -3545,8 +3526,8 @@ for the generated code. Supported values include `pydantic.BaseModel`, title: String vehicles: list[Vehicle] vehicles_ids: list[ID] - producer: Optional[String] = None - typename__: Optional[Literal['Film']] = 'Film' + producer: String | None = None + typename__: Literal['Film'] | None = 'Film' @dataclass @@ -3561,16 +3542,16 @@ for the generated code. Supported values include `pydantic.BaseModel`, starships_ids: list[ID] vehicles: list[Vehicle] vehicles_ids: list[ID] - birth_year: Optional[String] = None - eye_color: Optional[String] = None - gender: Optional[String] = None - hair_color: Optional[String] = None - height: Optional[Int] = None - homeworld: Optional[Planet] = None - homeworld_id: Optional[ID] = None - mass: Optional[Int] = None - skin_color: Optional[String] = None - typename__: Optional[Literal['Person']] = 'Person' + birth_year: String | None = None + eye_color: String | None = None + gender: String | None = None + hair_color: String | None = None + height: Int | None = None + homeworld: Planet | None = None + homeworld_id: ID | None = None + mass: Int | None = None + skin_color: String | None = None + typename__: Literal['Person'] | None = 'Person' @dataclass @@ -3581,15 +3562,15 @@ for the generated code. Supported values include `pydantic.BaseModel`, name: String residents: list[Person] residents_ids: list[ID] - climate: Optional[String] = None - diameter: Optional[String] = None - gravity: Optional[String] = None - orbital_period: Optional[String] = None - population: Optional[String] = None - rotation_period: Optional[String] = None - surface_water: Optional[String] = None - terrain: Optional[String] = None - typename__: Optional[Literal['Planet']] = 'Planet' + climate: String | None = None + diameter: String | None = None + gravity: String | None = None + orbital_period: String | None = None + population: String | None = None + rotation_period: String | None = None + surface_water: String | None = None + terrain: String | None = None + typename__: Literal['Planet'] | None = 'Planet' @dataclass @@ -3600,15 +3581,15 @@ for the generated code. Supported values include `pydantic.BaseModel`, name: String people: list[Person] people_ids: list[ID] - average_height: Optional[String] = None - average_lifespan: Optional[String] = None - classification: Optional[String] = None - designation: Optional[String] = None - eye_colors: Optional[String] = None - hair_colors: Optional[String] = None - language: Optional[String] = None - skin_colors: Optional[String] = None - typename__: Optional[Literal['Species']] = 'Species' + average_height: String | None = None + average_lifespan: String | None = None + classification: String | None = None + designation: String | None = None + eye_colors: String | None = None + hair_colors: String | None = None + language: String | None = None + skin_colors: String | None = None + typename__: Literal['Species'] | None = 'Species' @dataclass @@ -3619,19 +3600,19 @@ for the generated code. Supported values include `pydantic.BaseModel`, name: String pilots: list[Person] pilots_ids: list[ID] - MGLT: Optional[String] = None - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - hyperdrive_rating: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - starship_class: Optional[String] = None - typename__: Optional[Literal['Starship']] = 'Starship' + MGLT: String | None = None + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + hyperdrive_rating: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + starship_class: String | None = None + typename__: Literal['Starship'] | None = 'Starship' @dataclass @@ -3642,17 +3623,17 @@ for the generated code. Supported values include `pydantic.BaseModel`, name: String pilots: list[Person] pilots_ids: list[ID] - cargo_capacity: Optional[String] = None - consumables: Optional[String] = None - cost_in_credits: Optional[String] = None - crew: Optional[String] = None - length: Optional[String] = None - manufacturer: Optional[String] = None - max_atmosphering_speed: Optional[String] = None - model: Optional[String] = None - passengers: Optional[String] = None - vehicle_class: Optional[String] = None - typename__: Optional[Literal['Vehicle']] = 'Vehicle' + cargo_capacity: String | None = None + consumables: String | None = None + cost_in_credits: String | None = None + crew: String | None = None + length: String | None = None + manufacturer: String | None = None + max_atmosphering_speed: String | None = None + model: String | None = None + passengers: String | None = None + vehicle_class: String | None = None + typename__: Literal['Vehicle'] | None = 'Vehicle' ``` --- @@ -3762,7 +3743,7 @@ appears in different contexts within an OpenAPI specification. from __future__ import annotations from enum import Enum - from typing import Any, Optional + from typing import Any from pydantic import BaseModel, RootModel @@ -3772,15 +3753,15 @@ appears in different contexts within an OpenAPI specification. class PetDetails(BaseModel): - race: Optional[str] = None + race: str | None = None class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None type: PetType - details: Optional[PetDetails] = None + details: PetDetails | None = None class CarType(Enum): @@ -3788,15 +3769,15 @@ appears in different contexts within an OpenAPI specification. class CarDetails(BaseModel): - brand: Optional[str] = None + brand: str | None = None class Car(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None type: CarType - details: Optional[CarDetails] = None + details: CarDetails | None = None class Cars(RootModel[Any]): @@ -3893,7 +3874,6 @@ code duplication in the output. from __future__ import annotations from enum import Enum - from typing import Optional from pydantic import BaseModel, Field @@ -3910,10 +3890,10 @@ code duplication in the output. class User(BaseModel): - name: Optional[str] = None - animal: Optional[Animal] = 'dog' - pet: Optional[Animal] = 'cat' - redistribute: Optional[list[RedistributeEnum]] = None + name: str | None = None + animal: Animal | None = 'dog' + pet: Animal | None = 'cat' + redistribute: list[RedistributeEnum] | None = None class Redistribute(BaseModel): @@ -3995,8 +3975,6 @@ The `--reuse-scope` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel from .shared import SharedModel as SharedModel_1 @@ -4007,7 +3985,7 @@ The `--reuse-scope` flag configures the code generation behavior. class Model(BaseModel): - data: Optional[SharedModel] = None + data: SharedModel | None = None # schema_b.py # generated by datamodel-codegen: @@ -4016,15 +3994,13 @@ The `--reuse-scope` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel from . import shared class Model(BaseModel): - info: Optional[shared.SharedModel] = None + info: shared.SharedModel | None = None # shared.py # generated by datamodel-codegen: @@ -4033,14 +4009,12 @@ The `--reuse-scope` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class SharedModel(BaseModel): - id: Optional[int] = None - name: Optional[str] = None + id: int | None = None + name: str | None = None ``` --- @@ -4092,14 +4066,12 @@ object is just a container for $defs and not a meaningful model itself. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Person(BaseModel): name: str - age: Optional[int] = None + age: int | None = None ``` --- @@ -4256,16 +4228,14 @@ The `--strict-nullable` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional, Union - from pydantic import AnyUrl, BaseModel, Field class Cursors(BaseModel): - prev: Optional[str] = Field(...) + prev: str | None = Field(...) next: str = 'last' index: float - tag: Optional[str] = None + tag: str | None = None class TopLevel(BaseModel): @@ -4281,29 +4251,29 @@ The `--strict-nullable` flag configures the code generation behavior. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) class Apis(BaseModel): - __root__: Optional[list[Api]] = Field(...) + __root__: list[Api] | None = Field(...) class EmailItem(BaseModel): author: str address: str = Field(..., description='email address') description: str = 'empty' - tag: Optional[str] = None + tag: str | None = None class Email(BaseModel): @@ -4315,11 +4285,11 @@ The `--strict-nullable` flag configures the code generation behavior. class Description(BaseModel): - __root__: Optional[str] = 'example' + __root__: str | None = 'example' class Name(BaseModel): - __root__: Optional[str] = None + __root__: str | None = None class Tag(BaseModel): @@ -4331,8 +4301,8 @@ The `--strict-nullable` flag configures the code generation behavior. class Options(BaseModel): - comments: list[Optional[str]] - oneOfComments: list[Union[Optional[str], Optional[float]]] + comments: list[str | None] + oneOfComments: list[str | float | None] ``` --- @@ -4548,15 +4518,13 @@ default to None. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] + tag: str | None class Pets(BaseModel): @@ -4566,7 +4534,7 @@ default to None. class User(BaseModel): id: int name: str - tag: Optional[str] + tag: str | None class Users(BaseModel): @@ -4587,16 +4555,16 @@ default to None. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -4606,11 +4574,11 @@ default to None. class Event(BaseModel): - name: Optional[str] + name: str | None class Result(BaseModel): - event: Optional[Event] + event: Event | None ``` --- @@ -4680,18 +4648,18 @@ This affects import statements and type annotation syntax in generated code. from __future__ import annotations - from typing import Any, Optional + from typing import Any from pydantic import BaseModel, Field, conint class Person(BaseModel): - firstName: Optional[str] = Field(None, description="The person's first name.") - lastName: Optional[str] = Field(None, description="The person's last name.") - age: Optional[conint(ge=0)] = Field( + firstName: str | None = Field(None, description="The person's first name.") + lastName: str | None = Field(None, description="The person's last name.") + age: conint(ge=0) | None = Field( None, description='Age in years which must be equal to or greater than zero.' ) - friends: Optional[list[Any]] = None + friends: list[Any] | None = None comment: None = None ``` @@ -4768,8 +4736,6 @@ The `--union-mode` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional, Union - from pydantic import BaseModel, ConfigDict, Field, RootModel @@ -4778,9 +4744,9 @@ The `--union-mode` flag configures the code generation behavior. extra='allow', ) AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None - State: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None + State: str | None = None ZipCode: str @@ -4789,14 +4755,14 @@ The `--union-mode` flag configures the code generation behavior. extra='allow', ) AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None - County: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None + County: str | None = None PostCode: str class US(BaseModel): - County: Optional[str] = None + County: str | None = None PostCode: str @@ -4805,12 +4771,12 @@ The `--union-mode` flag configures the code generation behavior. extra='allow', ) AddressLine1: str - AddressLine2: Optional[str] = None - City: Optional[str] = None + AddressLine2: str | None = None + City: str | None = None - class MySchema(RootModel[Union[MySchema1, MySchema2, MySchema3]]): - root: Union[MySchema1, MySchema2, MySchema3] = Field( + class MySchema(RootModel[MySchema1 | MySchema2 | MySchema3]): + root: MySchema1 | MySchema2 | MySchema3 = Field( ..., title='My schema', union_mode='left_to_right' ) ``` @@ -4909,7 +4875,7 @@ default values. from __future__ import annotations - from typing import Literal, Optional, TypeAlias + from typing import Literal, TypeAlias from pydantic import BaseModel, Field @@ -4929,11 +4895,11 @@ default values. field: String listField: list[String] listListField: list[list[String]] - listOptionalField: list[Optional[String]] - optionalField: Optional[String] = None - optionalListField: Optional[list[String]] = None - optionalListOptionalField: Optional[list[Optional[String]]] = None - typename__: Optional[Literal['A']] = Field(default='A', alias='__typename') + listOptionalField: list[String | None] + optionalField: String | None = None + optionalListField: list[String] | None = None + optionalListOptionalField: list[String | None] | None = None + typename__: Literal['A'] | None = Field(default='A', alias='__typename') ``` --- @@ -5000,7 +4966,6 @@ The `--use-frozen-field` flag generates frozen field definitions: from __future__ import annotations from datetime import datetime - from typing import Optional from pydantic import BaseModel, Field @@ -5012,7 +4977,7 @@ The `--use-frozen-field` flag generates frozen field definitions: id: int = Field(..., allow_mutation=False, description='Server-generated ID') name: str password: str = Field(..., description='User password') - created_at: Optional[datetime] = Field(None, allow_mutation=False) + created_at: datetime | None = Field(None, allow_mutation=False) ``` === "Pydantic v2" @@ -5024,8 +4989,6 @@ The `--use-frozen-field` flag generates frozen field definitions: from __future__ import annotations - from typing import Optional - from pydantic import AwareDatetime, BaseModel, Field @@ -5033,7 +4996,7 @@ The `--use-frozen-field` flag generates frozen field definitions: id: int = Field(..., description='Server-generated ID', frozen=True) name: str password: str = Field(..., description='User password') - created_at: Optional[AwareDatetime] = Field(None, frozen=True) + created_at: AwareDatetime | None = Field(None, frozen=True) ``` === "dataclass" @@ -5046,7 +5009,6 @@ The `--use-frozen-field` flag generates frozen field definitions: from __future__ import annotations from dataclasses import dataclass - from typing import Optional @dataclass @@ -5054,7 +5016,7 @@ The `--use-frozen-field` flag generates frozen field definitions: id: int name: str password: str - created_at: Optional[str] = None + created_at: str | None = None ``` --- @@ -5244,7 +5206,7 @@ The `--use-one-literal-as-default` flag configures the code generation behavior. from __future__ import annotations from enum import Enum - from typing import Literal, Optional, Union + from typing import Literal from pydantic import BaseModel, Field @@ -5257,9 +5219,9 @@ The `--use-one-literal-as-default` flag configures the code generation behavior. class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - kind: Optional[Kind] = None - type: Optional[Literal['animal']] = None + tag: str | None = None + kind: Kind | None = None + type: Literal['animal'] | None = None number: Literal[1] = 1 boolean: Literal[True] = True @@ -5274,7 +5236,7 @@ The `--use-one-literal-as-default` flag configures the code generation behavior. class Animal(BaseModel): - kind: Optional[Kind1] = None + kind: Kind1 | None = None class Error(BaseModel): @@ -5288,7 +5250,7 @@ The `--use-one-literal-as-default` flag configures the code generation behavior. class EnumObject(BaseModel): - type: Optional[Type] = None + type: Type | None = None class EnumRoot(Enum): @@ -5320,7 +5282,7 @@ The `--use-one-literal-as-default` flag configures the code generation behavior. class ArrayEnum(BaseModel): - __root__: list[Union[Literal['cat'], Literal['dog']]] + __root__: list[Literal['cat'] | Literal['dog']] class NestedVersionEnum(Enum): @@ -5333,13 +5295,13 @@ The `--use-one-literal-as-default` flag configures the code generation behavior. class NestedVersion(BaseModel): - __root__: Optional[NestedVersionEnum] = Field( + __root__: NestedVersionEnum | None = Field( 'RC1', description='nullable enum', example='RC2' ) class NestedNullableEnum(BaseModel): - nested_version: Optional[NestedVersion] = Field( + nested_version: NestedVersion | None = Field( default_factory=lambda: NestedVersion.parse_obj('RC1'), description='nullable enum', example='RC2', @@ -5356,7 +5318,7 @@ The `--use-one-literal-as-default` flag configures the code generation behavior. class Version(BaseModel): - __root__: Optional[VersionEnum] = Field( + __root__: VersionEnum | None = Field( 'RC1', description='nullable enum', example='RC2' ) ``` diff --git a/docs/cli-reference/openapi-only-options.md b/docs/cli-reference/openapi-only-options.md index ca003c9b6..066cc8cc7 100644 --- a/docs/cli-reference/openapi-only-options.md +++ b/docs/cli-reference/openapi-only-options.md @@ -91,21 +91,19 @@ models that include both path and query parameters. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Post(BaseModel): - id: Optional[str] = None - title: Optional[str] = None - content: Optional[str] = None + id: str | None = None + title: str | None = None + content: str | None = None class UsersUserIdPostsPostIdGetParameters(BaseModel): userId: int postId: str - includeComments: Optional[bool] = None + includeComments: bool | None = None ``` --- @@ -507,7 +505,6 @@ The `--openapi-scopes` flag configures the code generation behavior. from __future__ import annotations from datetime import datetime - from typing import Optional from pydantic import BaseModel @@ -515,7 +512,7 @@ The `--openapi-scopes` flag configures the code generation behavior. class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Error(BaseModel): @@ -524,8 +521,8 @@ The `--openapi-scopes` flag configures the code generation behavior. class PetForm(BaseModel): - name: Optional[str] = None - age: Optional[int] = None + name: str | None = None + age: int | None = None class PetsGetResponse(BaseModel): @@ -539,19 +536,19 @@ The `--openapi-scopes` flag configures the code generation behavior. class UserGetResponse(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UserPostRequest(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UsersGetResponseItem(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UsersGetResponse(BaseModel): @@ -561,7 +558,7 @@ The `--openapi-scopes` flag configures the code generation behavior. class UsersPostRequestItem(BaseModel): timestamp: datetime name: str - age: Optional[str] = None + age: str | None = None class UsersPostRequest(BaseModel): @@ -634,21 +631,19 @@ validation for API requests and responses without a shared base model. from __future__ import annotations - from typing import Optional - from pydantic import AwareDatetime, BaseModel class UserRequest(BaseModel): name: str password: str - secret_token: Optional[str] = None + secret_token: str | None = None class UserResponse(BaseModel): id: int name: str - created_at: Optional[AwareDatetime] = None + created_at: AwareDatetime | None = None ``` --- @@ -864,15 +859,13 @@ The `--use-operation-id-as-name` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -882,7 +875,7 @@ The `--use-operation-id-as-name` flag configures the code generation behavior. class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -903,16 +896,16 @@ The `--use-operation-id-as-name` flag configures the code generation behavior. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -922,15 +915,15 @@ The `--use-operation-id-as-name` flag configures the code generation behavior. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None class ListPetsParametersQuery(BaseModel): - limit: Optional[int] = None + limit: int | None = None ``` --- @@ -1008,23 +1001,21 @@ clear names like ResourceGetResponse200, ResourceGetResponse400, ResourceGetResp from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class ResourceGetResponse200(BaseModel): - id: Optional[int] = None - name: Optional[str] = None + id: int | None = None + name: str | None = None class ResourceGetResponse400(BaseModel): - error: Optional[str] = None - code: Optional[int] = None + error: str | None = None + code: int | None = None class ResourceGetResponseDefault(BaseModel): - message: Optional[str] = None + message: str | None = None ``` --- @@ -1242,15 +1233,13 @@ The `--validation` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -1260,7 +1249,7 @@ The `--validation` flag configures the code generation behavior. class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -1281,16 +1270,16 @@ The `--validation` flag configures the code generation behavior. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -1300,11 +1289,11 @@ The `--validation` flag configures the code generation behavior. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` --- diff --git a/docs/cli-reference/quick-reference.md b/docs/cli-reference/quick-reference.md index 22c9368f0..93a77063e 100644 --- a/docs/cli-reference/quick-reference.md +++ b/docs/cli-reference/quick-reference.md @@ -32,6 +32,7 @@ datamodel-codegen [OPTIONS] | [`--ignore-enum-constraints`](typing-customization.md#ignore-enum-constraints) | Ignore enum constraints and use base string type instead of Enum classes. | | [`--no-use-specialized-enum`](typing-customization.md#no-use-specialized-enum) | Disable specialized Enum classes for Python 3.11+ code generation. | | [`--no-use-standard-collections`](typing-customization.md#no-use-standard-collections) | Use built-in dict/list instead of typing.Dict/List. | +| [`--no-use-union-operator`](typing-customization.md#no-use-union-operator) | Test GraphQL annotated types with standard collections and union operator. | | [`--output-datetime-class`](typing-customization.md#output-datetime-class) | Specify datetime class type for date-time schema fields. | | [`--strict-types`](typing-customization.md#strict-types) | Enable strict type validation for specified Python types. | | [`--type-mappings`](typing-customization.md#type-mappings) | Override default type mappings for schema formats. | @@ -41,7 +42,6 @@ datamodel-codegen [OPTIONS] | [`--use-non-positive-negative-number-constrained-types`](typing-customization.md#use-non-positive-negative-number-constrained-types) | Use NonPositive/NonNegative types for number constraints. | | [`--use-pendulum`](typing-customization.md#use-pendulum) | Use pendulum types for date/time fields instead of datetime module. | | [`--use-type-alias`](typing-customization.md#use-type-alias) | Use TypeAlias instead of root models for type definitions (experimental). | -| [`--use-union-operator`](typing-customization.md#use-union-operator) | Test GraphQL annotated types with standard collections and union operator. | | [`--use-unique-items-as-set`](typing-customization.md#use-unique-items-as-set) | Generate set types for arrays with uniqueItems constraint. | ### 🏷️ Field Customization @@ -223,6 +223,7 @@ All options sorted alphabetically: - [`--no-color`](utility-options.md#no-color) - Disable colorized output - [`--no-use-specialized-enum`](typing-customization.md#no-use-specialized-enum) - Disable specialized Enum classes for Python 3.11+ code gener... - [`--no-use-standard-collections`](typing-customization.md#no-use-standard-collections) - Use built-in dict/list instead of typing.Dict/List. +- [`--no-use-union-operator`](typing-customization.md#no-use-union-operator) - Test GraphQL annotated types with standard collections and u... - [`--openapi-scopes`](openapi-only-options.md#openapi-scopes) - Specify OpenAPI scopes to generate (schemas, paths, paramete... - [`--original-field-name-delimiter`](field-customization.md#original-field-name-delimiter) - Specify delimiter for original field names when using snake-... - [`--output`](base-options.md#output) - Specify the destination path for generated Python code. @@ -269,7 +270,6 @@ All options sorted alphabetically: - [`--use-subclass-enum`](model-customization.md#use-subclass-enum) - Generate typed Enum subclasses for enums with specific field... - [`--use-title-as-name`](field-customization.md#use-title-as-name) - Use schema title as the generated class name. - [`--use-type-alias`](typing-customization.md#use-type-alias) - Use TypeAlias instead of root models for type definitions (e... -- [`--use-union-operator`](typing-customization.md#use-union-operator) - Test GraphQL annotated types with standard collections and u... - [`--use-unique-items-as-set`](typing-customization.md#use-unique-items-as-set) - Generate set types for arrays with uniqueItems constraint. - [`--validation`](openapi-only-options.md#validation) - Enable validation constraints (deprecated, use --field-const... - [`--version`](utility-options.md#version) - Show program version and exit diff --git a/docs/cli-reference/template-customization.md b/docs/cli-reference/template-customization.md index 24a3d59e4..5bbaf6986 100644 --- a/docs/cli-reference/template-customization.md +++ b/docs/cli-reference/template-customization.md @@ -69,7 +69,7 @@ is useful when using custom types defined in external modules (e.g., from __future__ import annotations from datetime import date, datetime - from typing import Literal, Optional, TypeAlias + from typing import Literal, TypeAlias from mymodule.myclass import MyCustomPythonClass from pydantic import BaseModel, Field @@ -102,7 +102,7 @@ is useful when using custom types defined in external modules (e.g., a: Date b: DateTime c: MyCustomClass - typename__: Optional[Literal['A']] = Field('A', alias='__typename') + typename__: Literal['A'] | None = Field('A', alias='__typename') ``` --- @@ -156,15 +156,13 @@ headers, or other metadata to generated files. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, Field class Person(BaseModel): first_name: str = Field(..., alias='first-name') last_name: str = Field(..., alias='last-name') - email_address: Optional[str] = None + email_address: str | None = None ``` === "Without Option" @@ -400,15 +398,13 @@ to be inserted at the top of generated Python files. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -418,7 +414,7 @@ to be inserted at the top of generated Python files. class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -439,16 +435,16 @@ to be inserted at the top of generated Python files. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -458,11 +454,11 @@ to be inserted at the top of generated Python files. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -510,7 +506,7 @@ formatting rules beyond what black/isort provide. # a comment from __future__ import annotations - from typing import Literal, Optional, TypeAlias + from typing import Literal, TypeAlias from pydantic import BaseModel, Field @@ -538,7 +534,7 @@ formatting rules beyond what black/isort provide. class A(BaseModel): duration: Long id: ID - typename__: Optional[Literal['A']] = Field('A', alias='__typename') + typename__: Literal['A'] | None = Field('A', alias='__typename') ``` --- @@ -596,15 +592,13 @@ configuration to user-defined formatter modules. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None ``` --- @@ -823,15 +817,13 @@ to the templates. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): # 1 2, 1 2, this is just a pet id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -841,7 +833,7 @@ to the templates. class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -862,10 +854,10 @@ to the templates. class Api(BaseModel): - apiKey: Optional[str] = None - apiVersionNumber: Optional[str] = None - apiUrl: Optional[AnyUrl] = None - apiDocumentationUrl: Optional[AnyUrl] = None + apiKey: str | None = None + apiVersionNumber: str | None = None + apiUrl: AnyUrl | None = None + apiDocumentationUrl: AnyUrl | None = None class Apis(BaseModel): @@ -873,11 +865,11 @@ to the templates. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -1141,15 +1133,13 @@ The `--disable-appending-item-suffix` flag configures the code generation behavi from __future__ import annotations - from typing import Optional, Union - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int = Field(..., ge=0, le=9223372036854775807) name: str = Field(..., max_length=256) - tag: Optional[str] = Field(None, max_length=64) + tag: str | None = Field(None, max_length=64) class Pets(BaseModel): @@ -1171,14 +1161,14 @@ The `--disable-appending-item-suffix` flag configures the code generation behavi class User(BaseModel): id: int = Field(..., ge=0) name: str = Field(..., max_length=256) - tag: Optional[str] = Field(None, max_length=64) + tag: str | None = Field(None, max_length=64) uid: UID - phones: Optional[list[Phone]] = Field(None, max_items=10) - fax: Optional[list[Fax]] = None - height: Optional[Union[int, float]] = Field(None, ge=1.0, le=300.0) - weight: Optional[Union[float, int]] = Field(None, ge=1.0, le=1000.0) - age: Optional[int] = Field(None, gt=0, le=200) - rating: Optional[float] = Field(None, gt=0.0, le=5.0) + phones: list[Phone] | None = Field(None, max_items=10) + fax: list[Fax] | None = None + height: int | float | None = Field(None, ge=1.0, le=300.0) + weight: float | int | None = Field(None, ge=1.0, le=1000.0) + age: int | None = Field(None, gt=0, le=200) + rating: float | None = Field(None, gt=0.0, le=5.0) class Users(BaseModel): @@ -1199,16 +1189,16 @@ The `--disable-appending-item-suffix` flag configures the code generation behavi class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -1218,11 +1208,11 @@ The `--disable-appending-item-suffix` flag configures the code generation behavi class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -1281,22 +1271,21 @@ The `--disable-timestamp` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, constr class Info(BaseModel): - hostName: Optional[ + hostName: ( constr( regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' ) - ] = None - arn: Optional[ - constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') - ] = None - tel: Optional[constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$')] = None - comment: Optional[constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$')] = None + | None + ) = None + arn: ( + constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') | None + ) = None + tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None + comment: constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None ``` --- @@ -1512,15 +1501,13 @@ the file to the header, making it easy to reproduce the generation. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -1530,7 +1517,7 @@ the file to the header, making it easy to reproduce the generation. class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -1551,16 +1538,16 @@ the file to the header, making it easy to reproduce the generation. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -1570,11 +1557,11 @@ the file to the header, making it easy to reproduce the generation. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -1789,15 +1776,13 @@ The `--enable-version-header` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -1807,7 +1792,7 @@ The `--enable-version-header` flag configures the code generation behavior. class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -1828,16 +1813,16 @@ The `--enable-version-header` flag configures the code generation behavior. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -1847,11 +1832,11 @@ The `--enable-version-header` flag configures the code generation behavior. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -2071,8 +2056,6 @@ model settings like Config classes, enabling customization beyond standard optio from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, Field @@ -2082,7 +2065,7 @@ model settings like Config classes, enabling customization beyond standard optio id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -2092,7 +2075,7 @@ model settings like Config classes, enabling customization beyond standard optio class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -2113,16 +2096,16 @@ model settings like Config classes, enabling customization beyond standard optio class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -2132,11 +2115,11 @@ model settings like Config classes, enabling customization beyond standard optio class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` === "Pydantic v2" @@ -2148,8 +2131,6 @@ model settings like Config classes, enabling customization beyond standard optio from __future__ import annotations - from typing import Optional - from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel @@ -2160,7 +2141,7 @@ model settings like Config classes, enabling customization beyond standard optio ) id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(RootModel[list[Pet]]): @@ -2170,7 +2151,7 @@ model settings like Config classes, enabling customization beyond standard optio class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(RootModel[list[User]]): @@ -2191,16 +2172,16 @@ model settings like Config classes, enabling customization beyond standard optio class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -2210,11 +2191,11 @@ model settings like Config classes, enabling customization beyond standard optio class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` --- @@ -2270,15 +2251,13 @@ Use this to customize formatting or disable formatters entirely. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None ``` --- @@ -2341,14 +2320,12 @@ The `--treat-dot-as-module` flag configures the code generation behavior. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class User(BaseModel): name: str - age: Optional[int] = None + age: int | None = None ``` --- @@ -2442,8 +2419,6 @@ helps maintain consistency with codebases that prefer double-quote formatting. from __future__ import annotations - from typing import Optional, Union - from pydantic import BaseModel, Field, confloat @@ -2454,10 +2429,10 @@ helps maintain consistency with codebases that prefer double-quote formatting. class MapState2(BaseModel): latitude: Latitude longitude: Longitude - zoom: Optional[Zoom] = Field(default_factory=lambda: Zoom.parse_obj(0)) - bearing: Optional[Bearing] = None + zoom: Zoom | None = Field(default_factory=lambda: Zoom.parse_obj(0)) + bearing: Bearing | None = None pitch: Pitch - drag_rotate: Optional[DragRotate] = Field(None, alias="dragRotate") + drag_rotate: DragRotate | None = Field(None, alias="dragRotate") map_split_mode: str = Field("SWIPE_COMPARE", alias="mapSplitMode", const=True) is_split: bool = Field(True, alias="isSplit", const=True) @@ -2483,7 +2458,7 @@ helps maintain consistency with codebases that prefer double-quote formatting. class MapState(BaseModel): - __root__: Union[MapState4, MapState5, MapState6, MapState7] = Field( + __root__: MapState4 | MapState5 | MapState6 | MapState7 = Field( ..., title="MapState" ) @@ -2566,15 +2541,13 @@ modules are generated. For single-file output, the difference is minimal. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel class Pet(BaseModel): - id: Optional[int] = None - name: Optional[str] = None - tag: Optional[str] = None + id: int | None = None + name: str | None = None + tag: str | None = None ``` --- @@ -2630,21 +2603,19 @@ single-line strings in the generated code. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, Field class LongDescription(BaseModel): - summary: Optional[str] = Field(None, description='summary for object') - description: Optional[str] = Field( + summary: str | None = Field(None, description='summary for object') + description: str | None = Field( None, description=( 'datamodel-code-generator. This code generator creates pydantic model from' ' an openapi file and others.' ), ) - multi_line: Optional[str] = Field( + multi_line: str | None = Field( None, description=( 'datamodel-code-generator\nThis code generator creates pydantic model from' diff --git a/docs/cli-reference/typing-customization.md b/docs/cli-reference/typing-customization.md index 1dc272668..0b62baa8f 100644 --- a/docs/cli-reference/typing-customization.md +++ b/docs/cli-reference/typing-customization.md @@ -10,6 +10,7 @@ | [`--ignore-enum-constraints`](#ignore-enum-constraints) | Ignore enum constraints and use base string type instead of ... | | [`--no-use-specialized-enum`](#no-use-specialized-enum) | Disable specialized Enum classes for Python 3.11+ code gener... | | [`--no-use-standard-collections`](#no-use-standard-collections) | Use built-in dict/list instead of typing.Dict/List. | +| [`--no-use-union-operator`](#no-use-union-operator) | Test GraphQL annotated types with standard collections and u... | | [`--output-datetime-class`](#output-datetime-class) | Specify datetime class type for date-time schema fields. | | [`--strict-types`](#strict-types) | Enable strict type validation for specified Python types. | | [`--type-mappings`](#type-mappings) | Override default type mappings for schema formats. | @@ -19,7 +20,6 @@ | [`--use-non-positive-negative-number-constrained-types`](#use-non-positive-negative-number-constrained-types) | Use NonPositive/NonNegative types for number constraints. | | [`--use-pendulum`](#use-pendulum) | Use pendulum types for date/time fields instead of datetime ... | | [`--use-type-alias`](#use-type-alias) | Use TypeAlias instead of root models for type definitions (e... | -| [`--use-union-operator`](#use-union-operator) | Test GraphQL annotated types with standard collections and u... | | [`--use-unique-items-as-set`](#use-unique-items-as-set) | Generate set types for arrays with uniqueItems constraint. | --- @@ -85,19 +85,17 @@ other properties separate. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, conint, constr class Parent(BaseModel): - name: Optional[constr(min_length=1)] = 'parent_default' - count: Optional[conint(ge=0)] = 10 + name: constr(min_length=1) | None = 'parent_default' + count: conint(ge=0) | None = 10 class Child(Parent): - name: Optional[constr(min_length=1, max_length=100)] = 'parent_default' - count: Optional[conint(ge=0, le=1000)] = 10 + name: constr(min_length=1, max_length=100) | None = 'parent_default' + count: conint(ge=0, le=1000) | None = 10 ``` === "JSON Schema" @@ -328,7 +326,7 @@ other properties separate. from __future__ import annotations - from typing import Any, Optional + from typing import Any from pydantic import BaseModel, EmailStr, Field, conint, constr @@ -368,11 +366,11 @@ other properties separate. class ObjectBase(BaseModel): - id: Optional[int] = None + id: int | None = None class ObjectWithAllOf(ObjectBase): - name: Optional[str] = None + name: str | None = None class MultiRefAllOf(BaseModel): @@ -388,7 +386,7 @@ other properties separate. class ConstraintWithProperties(BaseModel): - extra: Optional[str] = None + extra: str | None = None class ConstraintWithItems(BaseModel): @@ -464,26 +462,26 @@ other properties separate. class Model(BaseModel): - name: Optional[ConstrainedStringDatatype] = None - count: Optional[NonNegativeIntegerDatatype] = None - percentage: Optional[BoundedIntegerDatatype] = None - email: Optional[EmailDatatype] = None - obj: Optional[ObjectWithAllOf] = None - multi: Optional[MultiRefAllOf] = None - noconstraint: Optional[NoConstraintAllOf] = None - incompatible: Optional[IncompatibleTypeAllOf] = None - withprops: Optional[ConstraintWithProperties] = None - withitems: Optional[ConstraintWithItems] = None - numint: Optional[NumberIntegerCompatible] = None - refwithkw: Optional[RefWithSchemaKeywords] = None - refarr: Optional[RefToArrayAllOf] = None - refobjnoprops: Optional[RefToObjectNoPropsAllOf] = None - refpatternprops: Optional[RefToPatternPropsAllOf] = None - refnestedallof: Optional[RefToNestedAllOfAllOf] = None - refconstraintsonly: Optional[RefToConstraintsOnlyAllOf] = None - nodescription: Optional[NoDescriptionAllOf] = None - emptyconstraint: Optional[EmptyConstraintItemAllOf] = None - conflictingformat: Optional[ConflictingFormatAllOf] = None + name: ConstrainedStringDatatype | None = None + count: NonNegativeIntegerDatatype | None = None + percentage: BoundedIntegerDatatype | None = None + email: EmailDatatype | None = None + obj: ObjectWithAllOf | None = None + multi: MultiRefAllOf | None = None + noconstraint: NoConstraintAllOf | None = None + incompatible: IncompatibleTypeAllOf | None = None + withprops: ConstraintWithProperties | None = None + withitems: ConstraintWithItems | None = None + numint: NumberIntegerCompatible | None = None + refwithkw: RefWithSchemaKeywords | None = None + refarr: RefToArrayAllOf | None = None + refobjnoprops: RefToObjectNoPropsAllOf | None = None + refpatternprops: RefToPatternPropsAllOf | None = None + refnestedallof: RefToNestedAllOfAllOf | None = None + refconstraintsonly: RefToConstraintsOnlyAllOf | None = None + nodescription: NoDescriptionAllOf | None = None + emptyconstraint: EmptyConstraintItemAllOf | None = None + conflictingformat: ConflictingFormatAllOf | None = None ``` === "Without Option" @@ -495,7 +493,7 @@ other properties separate. from __future__ import annotations - from typing import Any, Optional + from typing import Any from pydantic import BaseModel, EmailStr, Field, conint, constr @@ -535,11 +533,11 @@ other properties separate. class ObjectBase(BaseModel): - id: Optional[int] = None + id: int | None = None class ObjectWithAllOf(ObjectBase): - name: Optional[str] = None + name: str | None = None class MultiRefAllOf(BaseModel): @@ -555,7 +553,7 @@ other properties separate. class ConstraintWithProperties(BaseModel): - extra: Optional[str] = None + extra: str | None = None class ConstraintWithItems(BaseModel): @@ -631,26 +629,26 @@ other properties separate. class Model(BaseModel): - name: Optional[ConstrainedStringDatatype] = None - count: Optional[NonNegativeIntegerDatatype] = None - percentage: Optional[BoundedIntegerDatatype] = None - email: Optional[EmailDatatype] = None - obj: Optional[ObjectWithAllOf] = None - multi: Optional[MultiRefAllOf] = None - noconstraint: Optional[NoConstraintAllOf] = None - incompatible: Optional[IncompatibleTypeAllOf] = None - withprops: Optional[ConstraintWithProperties] = None - withitems: Optional[ConstraintWithItems] = None - numint: Optional[NumberIntegerCompatible] = None - refwithkw: Optional[RefWithSchemaKeywords] = None - refarr: Optional[RefToArrayAllOf] = None - refobjnoprops: Optional[RefToObjectNoPropsAllOf] = None - refpatternprops: Optional[RefToPatternPropsAllOf] = None - refnestedallof: Optional[RefToNestedAllOfAllOf] = None - refconstraintsonly: Optional[RefToConstraintsOnlyAllOf] = None - nodescription: Optional[NoDescriptionAllOf] = None - emptyconstraint: Optional[EmptyConstraintItemAllOf] = None - conflictingformat: Optional[ConflictingFormatAllOf] = None + name: ConstrainedStringDatatype | None = None + count: NonNegativeIntegerDatatype | None = None + percentage: BoundedIntegerDatatype | None = None + email: EmailDatatype | None = None + obj: ObjectWithAllOf | None = None + multi: MultiRefAllOf | None = None + noconstraint: NoConstraintAllOf | None = None + incompatible: IncompatibleTypeAllOf | None = None + withprops: ConstraintWithProperties | None = None + withitems: ConstraintWithItems | None = None + numint: NumberIntegerCompatible | None = None + refwithkw: RefWithSchemaKeywords | None = None + refarr: RefToArrayAllOf | None = None + refobjnoprops: RefToObjectNoPropsAllOf | None = None + refpatternprops: RefToPatternPropsAllOf | None = None + refnestedallof: RefToNestedAllOfAllOf | None = None + refconstraintsonly: RefToConstraintsOnlyAllOf | None = None + nodescription: NoDescriptionAllOf | None = None + emptyconstraint: EmptyConstraintItemAllOf | None = None + conflictingformat: ConflictingFormatAllOf | None = None ``` --- @@ -712,17 +710,15 @@ postponed evaluation of annotations (PEP 563). # filename: keep_model_order_field_references.json # timestamp: 2019-07-26T00:00:00+00:00 - from typing import Optional - from pydantic import BaseModel class Metadata(BaseModel): - title: Optional[str] = None + title: str | None = None class DescriptionType(BaseModel): - metadata: Optional[list[Metadata]] = None + metadata: list[Metadata] | None = None ``` --- @@ -916,7 +912,7 @@ of Enum classes for all enumerations. from __future__ import annotations from enum import Enum - from typing import Literal, Optional, Union + from typing import Literal from pydantic import BaseModel, Field @@ -929,9 +925,9 @@ of Enum classes for all enumerations. class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - kind: Optional[Kind] = None - type: Optional[Literal['animal']] = None + tag: str | None = None + kind: Kind | None = None + type: Literal['animal'] | None = None number: Literal[1] boolean: Literal[True] @@ -946,7 +942,7 @@ of Enum classes for all enumerations. class Animal(BaseModel): - kind: Optional[Kind1] = None + kind: Kind1 | None = None class Error(BaseModel): @@ -960,7 +956,7 @@ of Enum classes for all enumerations. class EnumObject(BaseModel): - type: Optional[Type] = None + type: Type | None = None class EnumRoot(Enum): @@ -992,7 +988,7 @@ of Enum classes for all enumerations. class ArrayEnum(BaseModel): - __root__: list[Union[Literal['cat'], Literal['dog']]] + __root__: list[Literal['cat'] | Literal['dog']] class NestedVersionEnum(Enum): @@ -1005,13 +1001,13 @@ of Enum classes for all enumerations. class NestedVersion(BaseModel): - __root__: Optional[NestedVersionEnum] = Field( + __root__: NestedVersionEnum | None = Field( 'RC1', description='nullable enum', example='RC2' ) class NestedNullableEnum(BaseModel): - nested_version: Optional[NestedVersion] = Field( + nested_version: NestedVersion | None = Field( default_factory=lambda: NestedVersion.parse_obj('RC1'), description='nullable enum', example='RC2', @@ -1028,7 +1024,7 @@ of Enum classes for all enumerations. class Version(BaseModel): - __root__: Optional[VersionEnum] = Field( + __root__: VersionEnum | None = Field( 'RC1', description='nullable enum', example='RC2' ) ``` @@ -1068,14 +1064,14 @@ of Enum classes for all enumerations. from __future__ import annotations - from typing import Literal, Optional + from typing import Literal from pydantic import BaseModel, Field class Config(BaseModel): - mode: Optional[Literal['fast', 'slow']] = Field(None, title='Mode') - modes: Optional[list[Literal['a', 'b']]] = None + mode: Literal['fast', 'slow'] | None = Field(None, title='Mode') + modes: list[Literal['a', 'b']] | None = None ``` === "GraphQL" @@ -1393,7 +1389,6 @@ Python 3.11+, falling back to standard Enum classes instead. from __future__ import annotations from enum import Enum - from typing import Optional from pydantic import BaseModel, Field @@ -1405,7 +1400,7 @@ Python 3.11+, falling back to standard Enum classes instead. class ProcessingTask(BaseModel): - processing_status: Optional[ProcessingStatus] = Field( + processing_status: ProcessingStatus | None = Field( 'COMPLETED', title='Status of the task' ) ``` @@ -1478,7 +1473,6 @@ Python 3.11+, falling back to standard Enum classes instead. from __future__ import annotations from enum import Enum, IntEnum, StrEnum - from typing import Optional from pydantic import BaseModel @@ -1518,12 +1512,12 @@ Python 3.11+, falling back to standard Enum classes instead. class Model(BaseModel): - IntEnum: Optional[IntEnumModel] = None - FloatEnum: Optional[FloatEnum] = None - StrEnum: Optional[StrEnumModel] = None - NonTypedEnum: Optional[NonTypedEnum] = None - BooleanEnum: Optional[BooleanEnum] = None - UnknownEnum: Optional[UnknownEnum] = None + IntEnum: IntEnumModel | None = None + FloatEnum: FloatEnum | None = None + StrEnum: StrEnumModel | None = None + NonTypedEnum: NonTypedEnum | None = None + BooleanEnum: BooleanEnum | None = None + UnknownEnum: UnknownEnum | None = None ``` === "GraphQL" @@ -1759,7 +1753,6 @@ code for Python 3.10+ where built-in types support subscripting. from __future__ import annotations from enum import Enum - from typing import Optional, Union from pydantic import BaseModel, Field @@ -1774,19 +1767,19 @@ code for Python 3.10+ where built-in types support subscripting. class OneOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class AnyOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class User(BaseModel): - name: Optional[str] = None + name: str | None = None class AllOfResult(User): - description: Optional[str] = None + description: str | None = None class Model(BaseModel): @@ -1795,12 +1788,83 @@ code for Python 3.10+ where built-in types support subscripting. result: dict[str, int] nested_object_result: dict[str, NestedObjectResult] nested_enum_result: dict[str, NestedEnumResult] - all_of_result: Optional[dict[str, AllOfResult]] = None - one_of_result: Optional[dict[str, Union[User, OneOfResult]]] = None - any_of_result: Optional[dict[str, Union[User, AnyOfResult]]] = None - all_of_with_unknown_object: Optional[dict[str, User]] = None - objectRef: Optional[dict[str, User]] = None - deepNestedObjectRef: Optional[dict[str, dict[str, dict[str, User]]]] = None + all_of_result: dict[str, AllOfResult] | None = None + one_of_result: dict[str, User | OneOfResult] | None = None + any_of_result: dict[str, User | AnyOfResult] | None = None + all_of_with_unknown_object: dict[str, User] | None = None + objectRef: dict[str, User] | None = None + deepNestedObjectRef: dict[str, dict[str, dict[str, User]]] | None = None + ``` + +--- + +## `--no-use-union-operator` {#no-use-union-operator} + +Test GraphQL annotated types with standard collections and union operator. + +**Related:** [`--no-use-standard-collections`](typing-customization.md#no-use-standard-collections) + +**See also:** [Python Version Compatibility](../python-version-compatibility.md) + +!!! tip "Usage" + + ```bash + datamodel-codegen --input schema.json --output-model-type pydantic_v2.BaseModel --use-annotated --use-standard-collections --use-union-operator # (1)! + ``` + + 1. :material-arrow-left: `--no-use-union-operator` - the option documented here + +??? example "Examples" + + **Input Schema:** + + ```graphql + type A { + field: String! + optionalField: String + listField: [String!]! + listOptionalField: [String]! + optionalListField: [String!] + optionalListOptionalField: [String] + listListField:[[String!]!]! + } + ``` + + **Output:** + + ```python + # generated by datamodel-codegen: + # filename: annotated.graphql + # timestamp: 2019-07-26T00:00:00+00:00 + + from __future__ import annotations + + from typing import Annotated, Literal + + from pydantic import BaseModel, Field + from typing_extensions import TypeAliasType + + Boolean = TypeAliasType("Boolean", bool) + """ + The `Boolean` scalar type represents `true` or `false`. + """ + + + String = TypeAliasType("String", str) + """ + The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. + """ + + + class A(BaseModel): + field: String + listField: list[String] + listListField: list[list[String]] + listOptionalField: list[String | None] + optionalField: String | None = None + optionalListField: list[String] | None = None + optionalListOptionalField: list[String | None] | None = None + typename__: Annotated[Literal['A'] | None, Field(alias='__typename')] = 'A' ``` --- @@ -2317,7 +2381,7 @@ Test GraphQL annotated types with standard collections and union operator. from __future__ import annotations - from typing import Annotated, Optional, Union + from typing import Annotated from pydantic import AnyUrl, BaseModel, Field @@ -2325,7 +2389,7 @@ Test GraphQL annotated types with standard collections and union operator. class Pet(BaseModel): id: Annotated[int, Field(ge=0, le=9223372036854775807)] name: Annotated[str, Field(max_length=256)] - tag: Annotated[Optional[str], Field(max_length=64)] = None + tag: Annotated[str | None, Field(max_length=64)] = None class Pets(BaseModel): @@ -2347,14 +2411,14 @@ Test GraphQL annotated types with standard collections and union operator. class User(BaseModel): id: Annotated[int, Field(ge=0)] name: Annotated[str, Field(max_length=256)] - tag: Annotated[Optional[str], Field(max_length=64)] = None + tag: Annotated[str | None, Field(max_length=64)] = None uid: UID - phones: Annotated[Optional[list[Phone]], Field(max_items=10)] = None - fax: Optional[list[FaxItem]] = None - height: Annotated[Optional[Union[int, float]], Field(ge=1.0, le=300.0)] = None - weight: Annotated[Optional[Union[float, int]], Field(ge=1.0, le=1000.0)] = None - age: Annotated[Optional[int], Field(gt=0, le=200)] = None - rating: Annotated[Optional[float], Field(gt=0.0, le=5.0)] = None + phones: Annotated[list[Phone] | None, Field(max_items=10)] = None + fax: list[FaxItem] | None = None + height: Annotated[int | float | None, Field(ge=1.0, le=300.0)] = None + weight: Annotated[float | int | None, Field(ge=1.0, le=1000.0)] = None + age: Annotated[int | None, Field(gt=0, le=200)] = None + rating: Annotated[float | None, Field(gt=0.0, le=5.0)] = None class Users(BaseModel): @@ -2376,16 +2440,16 @@ Test GraphQL annotated types with standard collections and union operator. class Api(BaseModel): apiKey: Annotated[ - Optional[str], Field(description='To be used as a dataset parameter value') + str | None, Field(description='To be used as a dataset parameter value') ] = None apiVersionNumber: Annotated[ - Optional[str], Field(description='To be used as a version parameter value') + str | None, Field(description='To be used as a version parameter value') ] = None apiUrl: Annotated[ - Optional[AnyUrl], Field(description="The URL describing the dataset's fields") + AnyUrl | None, Field(description="The URL describing the dataset's fields") ] = None apiDocumentationUrl: Annotated[ - Optional[AnyUrl], Field(description='A URL to the API console for each API') + AnyUrl | None, Field(description='A URL to the API console for each API') ] = None @@ -2394,11 +2458,11 @@ Test GraphQL annotated types with standard collections and union operator. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` === "GraphQL" @@ -2516,16 +2580,14 @@ precise decimal arithmetic when validating values against the constraint. from __future__ import annotations - from typing import Optional - from pydantic import BaseModel, condecimal, confloat class Model(BaseModel): - price: Optional[condecimal(ge=0, le=99999.99, multiple_of=0.01)] = None - quantity: Optional[condecimal(multiple_of=0.1)] = None - rate: Optional[condecimal(multiple_of=0.001, lt=1.0, gt=0.0)] = None - simple_float: Optional[confloat(ge=0.0, le=100.0)] = None + price: condecimal(ge=0, le=99999.99, multiple_of=0.01) | None = None + quantity: condecimal(multiple_of=0.1) | None = None + rate: condecimal(multiple_of=0.001, lt=1.0, gt=0.0) | None = None + simple_float: confloat(ge=0.0, le=100.0) | None = None ``` --- @@ -2695,7 +2757,6 @@ Python 3.8 compatibility or when explicit typing imports are preferred. from collections.abc import Mapping from enum import Enum - from typing import Optional, Union from pydantic import BaseModel, Field @@ -2710,19 +2771,19 @@ Python 3.8 compatibility or when explicit typing imports are preferred. class OneOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class AnyOfResult(BaseModel): - description: Optional[str] = None + description: str | None = None class User(BaseModel): - name: Optional[str] = None + name: str | None = None class AllOfResult(User): - description: Optional[str] = None + description: str | None = None class Model(BaseModel): @@ -2731,12 +2792,12 @@ Python 3.8 compatibility or when explicit typing imports are preferred. result: Mapping[str, int] nested_object_result: Mapping[str, NestedObjectResult] nested_enum_result: Mapping[str, NestedEnumResult] - all_of_result: Optional[Mapping[str, AllOfResult]] = None - one_of_result: Optional[Mapping[str, Union[User, OneOfResult]]] = None - any_of_result: Optional[Mapping[str, Union[User, AnyOfResult]]] = None - all_of_with_unknown_object: Optional[Mapping[str, User]] = None - objectRef: Optional[Mapping[str, User]] = None - deepNestedObjectRef: Optional[Mapping[str, Mapping[str, Mapping[str, User]]]] = None + all_of_result: Mapping[str, AllOfResult] | None = None + one_of_result: Mapping[str, User | OneOfResult] | None = None + any_of_result: Mapping[str, User | AnyOfResult] | None = None + all_of_with_unknown_object: Mapping[str, User] | None = None + objectRef: Mapping[str, User] | None = None + deepNestedObjectRef: Mapping[str, Mapping[str, Mapping[str, User]]] | None = None ``` --- @@ -2801,8 +2862,6 @@ conint/confloat with ge/le parameters. from __future__ import annotations - from typing import Optional - from pydantic import ( BaseModel, Field, @@ -2814,16 +2873,16 @@ conint/confloat with ge/le parameters. class NumberConstraints(BaseModel): - non_negative_count: Optional[NonNegativeInt] = Field( + non_negative_count: NonNegativeInt | None = Field( None, description='A count that cannot be negative' ) - non_positive_balance: Optional[NonPositiveInt] = Field( + non_positive_balance: NonPositiveInt | None = Field( None, description='A balance that cannot be positive' ) - non_negative_amount: Optional[NonNegativeFloat] = Field( + non_negative_amount: NonNegativeFloat | None = Field( None, description='An amount that cannot be negative' ) - non_positive_score: Optional[NonPositiveFloat] = Field( + non_positive_score: NonPositiveFloat | None = Field( None, description='A score that cannot be positive' ) ``` @@ -2887,8 +2946,6 @@ working with the pendulum library for enhanced timezone and date handling. from __future__ import annotations - from typing import Optional - from pendulum import Date, DateTime, Duration from pydantic import BaseModel @@ -2896,8 +2953,8 @@ working with the pendulum library for enhanced timezone and date handling. class Event(BaseModel): name: str created_at: DateTime - event_date: Optional[Date] = None - duration: Optional[Duration] = None + event_date: Date | None = None + duration: Duration | None = None ``` --- @@ -2974,7 +3031,7 @@ syntax. This feature is experimental. from __future__ import annotations - from typing import Annotated, Any, Optional, TypeAlias, Union + from typing import Annotated, Any, TypeAlias from pydantic import BaseModel, Field @@ -2984,23 +3041,23 @@ syntax. This feature is experimental. SimpleString: TypeAlias = str - UnionType: TypeAlias = Union[str, int] + UnionType: TypeAlias = str | int ArrayType: TypeAlias = list[str] AnnotatedType: TypeAlias = Annotated[ - Union[str, bool], + str | bool, Field(..., description='An annotated union type', title='MyAnnotatedType'), ] class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - union_field: Optional[UnionType] = None - array_field: Optional[ArrayType] = None - annotated_field: Optional[AnnotatedType] = None + simple_field: SimpleString | None = None + union_field: UnionType | None = None + array_field: ArrayType | None = None + annotated_field: AnnotatedType | None = None ``` === "GraphQL" @@ -3038,7 +3095,7 @@ syntax. This feature is experimental. from __future__ import annotations - from typing import Literal, Optional, TypeAlias, Union + from typing import Literal, TypeAlias, Union from pydantic import BaseModel, Field @@ -3066,13 +3123,13 @@ syntax. This feature is experimental. class Person(BaseModel): age: Int name: String - typename__: Optional[Literal['Person']] = Field('Person', alias='__typename') + typename__: Literal['Person'] | None = Field('Person', alias='__typename') class Pet(BaseModel): name: String type: String - typename__: Optional[Literal['Pet']] = Field('Pet', alias='__typename') + typename__: Literal['Pet'] | None = Field('Pet', alias='__typename') UnionType: TypeAlias = Union[ @@ -3082,87 +3139,16 @@ syntax. This feature is experimental. class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - string_field: Optional[String] = None - union_field: Optional[UnionType] = None - typename__: Optional[Literal['ModelWithTypeAliasField']] = Field( + simple_field: SimpleString | None = None + string_field: String | None = None + union_field: UnionType | None = None + typename__: Literal['ModelWithTypeAliasField'] | None = Field( 'ModelWithTypeAliasField', alias='__typename' ) ``` --- -## `--use-union-operator` {#use-union-operator} - -Test GraphQL annotated types with standard collections and union operator. - -**Related:** [`--no-use-standard-collections`](typing-customization.md#no-use-standard-collections) - -**See also:** [Python Version Compatibility](../python-version-compatibility.md) - -!!! tip "Usage" - - ```bash - datamodel-codegen --input schema.json --output-model-type pydantic_v2.BaseModel --use-annotated --use-standard-collections --use-union-operator # (1)! - ``` - - 1. :material-arrow-left: `--use-union-operator` - the option documented here - -??? example "Examples" - - **Input Schema:** - - ```graphql - type A { - field: String! - optionalField: String - listField: [String!]! - listOptionalField: [String]! - optionalListField: [String!] - optionalListOptionalField: [String] - listListField:[[String!]!]! - } - ``` - - **Output:** - - ```python - # generated by datamodel-codegen: - # filename: annotated.graphql - # timestamp: 2019-07-26T00:00:00+00:00 - - from __future__ import annotations - - from typing import Annotated, Literal - - from pydantic import BaseModel, Field - from typing_extensions import TypeAliasType - - Boolean = TypeAliasType("Boolean", bool) - """ - The `Boolean` scalar type represents `true` or `false`. - """ - - - String = TypeAliasType("String", str) - """ - The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. - """ - - - class A(BaseModel): - field: String - listField: list[String] - listListField: list[list[String]] - listOptionalField: list[String | None] - optionalField: String | None = None - optionalListField: list[String] | None = None - optionalListOptionalField: list[String | None] | None = None - typename__: Annotated[Literal['A'] | None, Field(alias='__typename')] = 'A' - ``` - ---- - ## `--use-unique-items-as-set` {#use-unique-items-as-set} Generate set types for arrays with uniqueItems constraint. @@ -3424,15 +3410,13 @@ to true, enforcing uniqueness at the type level. from __future__ import annotations - from typing import Optional, Union - from pydantic import AnyUrl, BaseModel, Field class Pet(BaseModel): id: int = Field(..., ge=0, le=9223372036854775807) name: str = Field(..., max_length=256) - tag: Optional[str] = Field(None, max_length=64) + tag: str | None = Field(None, max_length=64) class Pets(BaseModel): @@ -3454,14 +3438,14 @@ to true, enforcing uniqueness at the type level. class User(BaseModel): id: int = Field(..., ge=0) name: str = Field(..., max_length=256) - tag: Optional[str] = Field(None, max_length=64) + tag: str | None = Field(None, max_length=64) uid: UID - phones: Optional[list[Phone]] = Field(None, max_items=10) - fax: Optional[list[FaxItem]] = None - height: Optional[Union[int, float]] = Field(None, ge=1.0, le=300.0) - weight: Optional[Union[float, int]] = Field(None, ge=1.0, le=1000.0) - age: Optional[int] = Field(None, gt=0, le=200) - rating: Optional[float] = Field(None, gt=0.0, le=5.0) + phones: list[Phone] | None = Field(None, max_items=10) + fax: list[FaxItem] | None = None + height: int | float | None = Field(None, ge=1.0, le=300.0) + weight: float | int | None = Field(None, ge=1.0, le=1000.0) + age: int | None = Field(None, gt=0, le=200) + rating: float | None = Field(None, gt=0.0, le=5.0) class Users(BaseModel): @@ -3482,16 +3466,16 @@ to true, enforcing uniqueness at the type level. class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) @@ -3501,11 +3485,11 @@ to true, enforcing uniqueness at the type level. class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[Event] = None + event: Event | None = None ``` --- From e01c7769b3e911e54ab3a99cbc123225afba4599 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 18:05:18 +0000 Subject: [PATCH 03/17] feat: Update type hints to use Optional and Union for better compatibility --- src/datamodel_code_generator/__main__.py | 19 ++++++++++++++++ .../data/expected/main/graphql/type_alias.py | 14 ++++++------ .../expected/main/jsonschema/type_alias.py | 14 ++++++------ .../type_alias_cycle_keep_model_order.py | 4 ++-- ...type_alias_forward_ref_keep_model_order.py | 4 ++-- .../type_alias_with_field_description.py | 16 ++++++++------ .../main/openapi/msgspec_mutual_type_alias.py | 6 ++--- .../data/expected/main/openapi/type_alias.py | 16 ++++++++------ .../type_alias_forward_ref_multiple.py | 6 ++--- .../openapi/type_alias_mutual_recursive.py | 6 ++--- .../main/openapi/type_alias_recursive.py | 22 +++++++++---------- .../openapi/type_alias_recursive_py311.py | 22 +++++++++---------- 12 files changed, 86 insertions(+), 63 deletions(-) diff --git a/src/datamodel_code_generator/__main__.py b/src/datamodel_code_generator/__main__.py index 02d6fc74d..1216ec1e0 100644 --- a/src/datamodel_code_generator/__main__.py +++ b/src/datamodel_code_generator/__main__.py @@ -823,6 +823,25 @@ def main(args: Sequence[str] | None = None) -> Exit: # noqa: PLR0911, PLR0912, print(e.message, file=sys.stderr) # noqa: T201 return Exit.ERROR + # Disable use_union_operator when using TypeAlias with Python < 3.12 + # because | operator doesn't work with forward references in TypeAlias + if ( + config.use_type_alias + and config.use_union_operator + and not config.target_python_version.has_type_statement + ): + if namespace.use_union_operator is True: + # User explicitly requested --use-union-operator + print( # noqa: T201 + "Warning: --use-union-operator is incompatible with --use-type-alias " + f"on Python {config.target_python_version.value}.\n" + "The | operator doesn't work with forward references in TypeAlias.\n" + "Disabling --use-union-operator. Use --target-python-version 3.12 or later, " + "or remove --use-type-alias.", + file=sys.stderr, + ) + config.use_union_operator = False + if not config.input and not config.url and sys.stdin.isatty(): print( # noqa: T201 "Not Found Input: require `stdin` or arguments `--input` or `--url`", diff --git a/tests/data/expected/main/graphql/type_alias.py b/tests/data/expected/main/graphql/type_alias.py index bf84246d7..c811d6764 100644 --- a/tests/data/expected/main/graphql/type_alias.py +++ b/tests/data/expected/main/graphql/type_alias.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, TypeAlias, Union +from typing import Literal, Optional, TypeAlias, Union from pydantic import BaseModel, Field @@ -32,13 +32,13 @@ class Person(BaseModel): age: Int name: String - typename__: Literal['Person'] | None = Field('Person', alias='__typename') + typename__: Optional[Literal['Person']] = Field('Person', alias='__typename') class Pet(BaseModel): name: String type: String - typename__: Literal['Pet'] | None = Field('Pet', alias='__typename') + typename__: Optional[Literal['Pet']] = Field('Pet', alias='__typename') UnionType: TypeAlias = Union[ @@ -48,9 +48,9 @@ class Pet(BaseModel): class ModelWithTypeAliasField(BaseModel): - simple_field: SimpleString | None = None - string_field: String | None = None - union_field: UnionType | None = None - typename__: Literal['ModelWithTypeAliasField'] | None = Field( + simple_field: Optional[SimpleString] = None + string_field: Optional[String] = None + union_field: Optional[UnionType] = None + typename__: Optional[Literal['ModelWithTypeAliasField']] = Field( 'ModelWithTypeAliasField', alias='__typename' ) diff --git a/tests/data/expected/main/jsonschema/type_alias.py b/tests/data/expected/main/jsonschema/type_alias.py index 55d128316..dbc19ee54 100644 --- a/tests/data/expected/main/jsonschema/type_alias.py +++ b/tests/data/expected/main/jsonschema/type_alias.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Any, TypeAlias +from typing import Annotated, Any, Optional, TypeAlias, Union from pydantic import BaseModel, Field @@ -14,20 +14,20 @@ SimpleString: TypeAlias = str -UnionType: TypeAlias = str | int +UnionType: TypeAlias = Union[str, int] ArrayType: TypeAlias = list[str] AnnotatedType: TypeAlias = Annotated[ - str | bool, + Union[str, bool], Field(..., description='An annotated union type', title='MyAnnotatedType'), ] class ModelWithTypeAliasField(BaseModel): - simple_field: SimpleString | None = None - union_field: UnionType | None = None - array_field: ArrayType | None = None - annotated_field: AnnotatedType | None = None + simple_field: Optional[SimpleString] = None + union_field: Optional[UnionType] = None + array_field: Optional[ArrayType] = None + annotated_field: Optional[AnnotatedType] = None diff --git a/tests/data/expected/main/jsonschema/type_alias_cycle_keep_model_order.py b/tests/data/expected/main/jsonschema/type_alias_cycle_keep_model_order.py index 3b3ed1768..fc3181b52 100644 --- a/tests/data/expected/main/jsonschema/type_alias_cycle_keep_model_order.py +++ b/tests/data/expected/main/jsonschema/type_alias_cycle_keep_model_order.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TypeAlias +from typing import TypeAlias, Union A: TypeAlias = list["B"] @@ -12,4 +12,4 @@ B: TypeAlias = list[A] -Model: TypeAlias = A | B +Model: TypeAlias = Union[A, B] diff --git a/tests/data/expected/main/jsonschema/type_alias_forward_ref_keep_model_order.py b/tests/data/expected/main/jsonschema/type_alias_forward_ref_keep_model_order.py index ab5c494ef..47087c736 100644 --- a/tests/data/expected/main/jsonschema/type_alias_forward_ref_keep_model_order.py +++ b/tests/data/expected/main/jsonschema/type_alias_forward_ref_keep_model_order.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, TypeAlias, TypedDict +from typing import Literal, TypeAlias, TypedDict, Union class BlobPart(TypedDict): @@ -20,4 +20,4 @@ class TextPart(TypedDict): content: str -SystemInstructions: TypeAlias = list[TextPart | BlobPart] +SystemInstructions: TypeAlias = list[Union[TextPart, BlobPart]] diff --git a/tests/data/expected/main/jsonschema/type_alias_with_field_description.py b/tests/data/expected/main/jsonschema/type_alias_with_field_description.py index 3c6c1ce05..82129cb06 100644 --- a/tests/data/expected/main/jsonschema/type_alias_with_field_description.py +++ b/tests/data/expected/main/jsonschema/type_alias_with_field_description.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Any, TypeAlias +from typing import Annotated, Any, Optional, TypeAlias, Union from pydantic import BaseModel, Field @@ -14,20 +14,22 @@ SimpleString: TypeAlias = str -UnionType: TypeAlias = str | int +UnionType: TypeAlias = Union[str, int] ArrayType: TypeAlias = list[str] -AnnotatedType: TypeAlias = Annotated[str | bool, Field(..., title='MyAnnotatedType')] +AnnotatedType: TypeAlias = Annotated[ + Union[str, bool], Field(..., title='MyAnnotatedType') +] """ An annotated union type """ class ModelWithTypeAliasField(BaseModel): - simple_field: SimpleString | None = None - union_field: UnionType | None = None - array_field: ArrayType | None = None - annotated_field: AnnotatedType | None = None + simple_field: Optional[SimpleString] = None + union_field: Optional[UnionType] = None + array_field: Optional[ArrayType] = None + annotated_field: Optional[AnnotatedType] = None diff --git a/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py b/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py index 2dcd73e82..12631f6e5 100644 --- a/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py +++ b/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py @@ -4,9 +4,9 @@ from __future__ import annotations -from typing import TypeAlias +from typing import TypeAlias, Union -NodeA: TypeAlias = int | "NodeB" +NodeA: TypeAlias = Union[int, "NodeB"] -NodeB: TypeAlias = str | NodeA +NodeB: TypeAlias = Union[str, NodeA] diff --git a/tests/data/expected/main/openapi/type_alias.py b/tests/data/expected/main/openapi/type_alias.py index 993741a1d..37885b1ae 100644 --- a/tests/data/expected/main/openapi/type_alias.py +++ b/tests/data/expected/main/openapi/type_alias.py @@ -4,24 +4,26 @@ from __future__ import annotations -from typing import Annotated, TypeAlias +from typing import Annotated, Optional, TypeAlias, Union from pydantic import BaseModel, Field SimpleString: TypeAlias = str -UnionType: TypeAlias = str | int +UnionType: TypeAlias = Union[str, int] ArrayType: TypeAlias = list[str] -AnnotatedType: TypeAlias = Annotated[str | bool, Field(..., title='MyAnnotatedType')] +AnnotatedType: TypeAlias = Annotated[ + Union[str, bool], Field(..., title='MyAnnotatedType') +] class ModelWithTypeAliasField(BaseModel): - simple_field: SimpleString | None = None - union_field: UnionType | None = None - array_field: ArrayType | None = None - annotated_field: AnnotatedType | None = None + simple_field: Optional[SimpleString] = None + union_field: Optional[UnionType] = None + array_field: Optional[ArrayType] = None + annotated_field: Optional[AnnotatedType] = None diff --git a/tests/data/expected/main/openapi/type_alias_forward_ref_multiple.py b/tests/data/expected/main/openapi/type_alias_forward_ref_multiple.py index ea1675613..0f705056d 100644 --- a/tests/data/expected/main/openapi/type_alias_forward_ref_multiple.py +++ b/tests/data/expected/main/openapi/type_alias_forward_ref_multiple.py @@ -4,19 +4,19 @@ from __future__ import annotations -from typing import TypeAlias +from typing import Optional, TypeAlias, Union from pydantic import BaseModel class RegularModel(BaseModel): - name: str | None = None + name: Optional[str] = None Third: TypeAlias = str -Second: TypeAlias = "First" | Third | RegularModel +Second: TypeAlias = Union["First", Third, RegularModel] First: TypeAlias = Second diff --git a/tests/data/expected/main/openapi/type_alias_mutual_recursive.py b/tests/data/expected/main/openapi/type_alias_mutual_recursive.py index 2dcd73e82..12631f6e5 100644 --- a/tests/data/expected/main/openapi/type_alias_mutual_recursive.py +++ b/tests/data/expected/main/openapi/type_alias_mutual_recursive.py @@ -4,9 +4,9 @@ from __future__ import annotations -from typing import TypeAlias +from typing import TypeAlias, Union -NodeA: TypeAlias = int | "NodeB" +NodeA: TypeAlias = Union[int, "NodeB"] -NodeB: TypeAlias = str | NodeA +NodeB: TypeAlias = Union[str, NodeA] diff --git a/tests/data/expected/main/openapi/type_alias_recursive.py b/tests/data/expected/main/openapi/type_alias_recursive.py index 4f779666a..f9c81f161 100644 --- a/tests/data/expected/main/openapi/type_alias_recursive.py +++ b/tests/data/expected/main/openapi/type_alias_recursive.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TypeAlias +from typing import Optional, TypeAlias, Union from pydantic import BaseModel @@ -14,27 +14,27 @@ class File(BaseModel): class Folder(BaseModel): - address: str | None = None + address: Optional[str] = None files: list[File] - subfolders: list[Folder] | None = None + subfolders: Optional[list[Folder]] = None -ElementaryType: TypeAlias = bool | str | int | float | None +ElementaryType: TypeAlias = Optional[Union[bool, str, int, float]] -JsonType: TypeAlias = ElementaryType | list["JsonType"] | dict[str, "JsonType"] +JsonType: TypeAlias = Union[ElementaryType, list["JsonType"], dict[str, "JsonType"]] class Space(BaseModel): - label: str | None = None - data: JsonType | None = None - dual: DualSpace | None = None + label: Optional[str] = None + data: Optional[JsonType] = None + dual: Optional[DualSpace] = None class DualSpace(BaseModel): - label: str | None = None - data: JsonType | None = None - predual: Space | None = None + label: Optional[str] = None + data: Optional[JsonType] = None + predual: Optional[Space] = None Folder.update_forward_refs() diff --git a/tests/data/expected/main/openapi/type_alias_recursive_py311.py b/tests/data/expected/main/openapi/type_alias_recursive_py311.py index 4f779666a..f9c81f161 100644 --- a/tests/data/expected/main/openapi/type_alias_recursive_py311.py +++ b/tests/data/expected/main/openapi/type_alias_recursive_py311.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TypeAlias +from typing import Optional, TypeAlias, Union from pydantic import BaseModel @@ -14,27 +14,27 @@ class File(BaseModel): class Folder(BaseModel): - address: str | None = None + address: Optional[str] = None files: list[File] - subfolders: list[Folder] | None = None + subfolders: Optional[list[Folder]] = None -ElementaryType: TypeAlias = bool | str | int | float | None +ElementaryType: TypeAlias = Optional[Union[bool, str, int, float]] -JsonType: TypeAlias = ElementaryType | list["JsonType"] | dict[str, "JsonType"] +JsonType: TypeAlias = Union[ElementaryType, list["JsonType"], dict[str, "JsonType"]] class Space(BaseModel): - label: str | None = None - data: JsonType | None = None - dual: DualSpace | None = None + label: Optional[str] = None + data: Optional[JsonType] = None + dual: Optional[DualSpace] = None class DualSpace(BaseModel): - label: str | None = None - data: JsonType | None = None - predual: Space | None = None + label: Optional[str] = None + data: Optional[JsonType] = None + predual: Optional[Space] = None Folder.update_forward_refs() From 7ef3ae5d2d9cbffb0451ffc442663d90464e753a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 19 Dec 2025 18:06:30 +0000 Subject: [PATCH 04/17] docs: update CLI reference documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated by GitHub Actions --- docs/cli-reference/field-customization.md | 16 +++++++------ docs/cli-reference/typing-customization.md | 28 +++++++++++----------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/docs/cli-reference/field-customization.md b/docs/cli-reference/field-customization.md index dfc0515f5..8b42f04bf 100644 --- a/docs/cli-reference/field-customization.md +++ b/docs/cli-reference/field-customization.md @@ -2769,7 +2769,7 @@ generated models, preserving documentation from the original schema. from __future__ import annotations - from typing import Annotated, Any, TypeAlias + from typing import Annotated, Any, Optional, TypeAlias, Union from pydantic import BaseModel, Field @@ -2779,23 +2779,25 @@ generated models, preserving documentation from the original schema. SimpleString: TypeAlias = str - UnionType: TypeAlias = str | int + UnionType: TypeAlias = Union[str, int] ArrayType: TypeAlias = list[str] - AnnotatedType: TypeAlias = Annotated[str | bool, Field(..., title='MyAnnotatedType')] + AnnotatedType: TypeAlias = Annotated[ + Union[str, bool], Field(..., title='MyAnnotatedType') + ] """ An annotated union type """ class ModelWithTypeAliasField(BaseModel): - simple_field: SimpleString | None = None - union_field: UnionType | None = None - array_field: ArrayType | None = None - annotated_field: AnnotatedType | None = None + simple_field: Optional[SimpleString] = None + union_field: Optional[UnionType] = None + array_field: Optional[ArrayType] = None + annotated_field: Optional[AnnotatedType] = None ``` --- diff --git a/docs/cli-reference/typing-customization.md b/docs/cli-reference/typing-customization.md index 0b62baa8f..e4e021584 100644 --- a/docs/cli-reference/typing-customization.md +++ b/docs/cli-reference/typing-customization.md @@ -3031,7 +3031,7 @@ syntax. This feature is experimental. from __future__ import annotations - from typing import Annotated, Any, TypeAlias + from typing import Annotated, Any, Optional, TypeAlias, Union from pydantic import BaseModel, Field @@ -3041,23 +3041,23 @@ syntax. This feature is experimental. SimpleString: TypeAlias = str - UnionType: TypeAlias = str | int + UnionType: TypeAlias = Union[str, int] ArrayType: TypeAlias = list[str] AnnotatedType: TypeAlias = Annotated[ - str | bool, + Union[str, bool], Field(..., description='An annotated union type', title='MyAnnotatedType'), ] class ModelWithTypeAliasField(BaseModel): - simple_field: SimpleString | None = None - union_field: UnionType | None = None - array_field: ArrayType | None = None - annotated_field: AnnotatedType | None = None + simple_field: Optional[SimpleString] = None + union_field: Optional[UnionType] = None + array_field: Optional[ArrayType] = None + annotated_field: Optional[AnnotatedType] = None ``` === "GraphQL" @@ -3095,7 +3095,7 @@ syntax. This feature is experimental. from __future__ import annotations - from typing import Literal, TypeAlias, Union + from typing import Literal, Optional, TypeAlias, Union from pydantic import BaseModel, Field @@ -3123,13 +3123,13 @@ syntax. This feature is experimental. class Person(BaseModel): age: Int name: String - typename__: Literal['Person'] | None = Field('Person', alias='__typename') + typename__: Optional[Literal['Person']] = Field('Person', alias='__typename') class Pet(BaseModel): name: String type: String - typename__: Literal['Pet'] | None = Field('Pet', alias='__typename') + typename__: Optional[Literal['Pet']] = Field('Pet', alias='__typename') UnionType: TypeAlias = Union[ @@ -3139,10 +3139,10 @@ syntax. This feature is experimental. class ModelWithTypeAliasField(BaseModel): - simple_field: SimpleString | None = None - string_field: String | None = None - union_field: UnionType | None = None - typename__: Literal['ModelWithTypeAliasField'] | None = Field( + simple_field: Optional[SimpleString] = None + string_field: Optional[String] = None + union_field: Optional[UnionType] = None + typename__: Optional[Literal['ModelWithTypeAliasField']] = Field( 'ModelWithTypeAliasField', alias='__typename' ) ``` From 06becfae6bb0b15d73084de269e9365c2b094a77 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 18:51:42 +0000 Subject: [PATCH 05/17] feat: Enhance type hinting by replacing Optional with Union and adding support for native union types --- src/datamodel_code_generator/__main__.py | 19 ------------------ src/datamodel_code_generator/model/base.py | 2 ++ src/datamodel_code_generator/parser/base.py | 8 +++++++- .../data/expected/main/graphql/type_alias.py | 14 ++++++------- .../expected/main/jsonschema/type_alias.py | 14 ++++++------- .../type_alias_cycle_keep_model_order.py | 4 ++-- ...type_alias_forward_ref_keep_model_order.py | 4 ++-- ...lias_with_circular_ref_to_class_msgspec.py | 4 ++-- .../type_alias_with_field_description.py | 16 +++++++-------- .../main/openapi/msgspec_mutual_type_alias.py | 2 +- .../data/expected/main/openapi/type_alias.py | 16 +++++++-------- .../type_alias_forward_ref_multiple.py | 4 ++-- .../openapi/type_alias_mutual_recursive.py | 2 +- .../main/openapi/type_alias_recursive.py | 20 +++++++++---------- .../openapi/type_alias_recursive_py311.py | 20 +++++++++---------- tox.ini | 2 ++ 16 files changed, 69 insertions(+), 82 deletions(-) diff --git a/src/datamodel_code_generator/__main__.py b/src/datamodel_code_generator/__main__.py index 1216ec1e0..02d6fc74d 100644 --- a/src/datamodel_code_generator/__main__.py +++ b/src/datamodel_code_generator/__main__.py @@ -823,25 +823,6 @@ def main(args: Sequence[str] | None = None) -> Exit: # noqa: PLR0911, PLR0912, print(e.message, file=sys.stderr) # noqa: T201 return Exit.ERROR - # Disable use_union_operator when using TypeAlias with Python < 3.12 - # because | operator doesn't work with forward references in TypeAlias - if ( - config.use_type_alias - and config.use_union_operator - and not config.target_python_version.has_type_statement - ): - if namespace.use_union_operator is True: - # User explicitly requested --use-union-operator - print( # noqa: T201 - "Warning: --use-union-operator is incompatible with --use-type-alias " - f"on Python {config.target_python_version.value}.\n" - "The | operator doesn't work with forward references in TypeAlias.\n" - "Disabling --use-union-operator. Use --target-python-version 3.12 or later, " - "or remove --use-type-alias.", - file=sys.stderr, - ) - config.use_union_operator = False - if not config.input and not config.url and sys.stdin.isatty(): print( # noqa: T201 "Not Found Input: require `stdin` or arguments `--input` or `--url`", diff --git a/src/datamodel_code_generator/model/base.py b/src/datamodel_code_generator/model/base.py index 36654166f..10fef1d60 100644 --- a/src/datamodel_code_generator/model/base.py +++ b/src/datamodel_code_generator/model/base.py @@ -248,6 +248,8 @@ def imports(self) -> tuple[Import, ...]: ) ] + if has_union: + imports.append((IMPORT_UNION,)) if has_optional: imports.append((IMPORT_OPTIONAL,)) if self.use_annotated and self.needs_annotated_import: diff --git a/src/datamodel_code_generator/parser/base.py b/src/datamodel_code_generator/parser/base.py index b1c54cf38..a94e7ae08 100644 --- a/src/datamodel_code_generator/parser/base.py +++ b/src/datamodel_code_generator/parser/base.py @@ -1897,6 +1897,7 @@ def __update_type_aliases(cls, models: list[DataModel]) -> None: if isinstance(model, TypeStatement): continue + has_forward_ref = False for field in model.fields: for data_type in field.data_type.all_data_types: if not data_type.reference: @@ -1912,6 +1913,11 @@ def __update_type_aliases(cls, models: list[DataModel]) -> None: source_index = model_index.get(name) if source_index is not None and source_index >= i: data_type.alias = f'"{name}"' + has_forward_ref = True + + if has_forward_ref: + for field in model.fields: + field.data_type.use_union_operator = False @classmethod def __postprocess_result_modules(cls, results: dict[tuple[str, ...], Result]) -> dict[tuple[str, ...], Result]: @@ -2573,6 +2579,7 @@ class Processed(NamedTuple): self.__apply_discriminator_type(models, imports) self.__set_one_literal_on_default(models) self.__fix_dataclass_field_ordering(models) + self.__update_type_aliases(models) processed_models.append(Processed(module, module_, models, init, imports, scoped_model_resolver)) @@ -2639,7 +2646,6 @@ class Processed(NamedTuple): export_imports.add_export(m.reference.short_name) result += [export_imports.dump_all(multiline=True) + "\n"] - self.__update_type_aliases(models) code = dump_templates(models) result += [code] diff --git a/tests/data/expected/main/graphql/type_alias.py b/tests/data/expected/main/graphql/type_alias.py index c811d6764..bf84246d7 100644 --- a/tests/data/expected/main/graphql/type_alias.py +++ b/tests/data/expected/main/graphql/type_alias.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, TypeAlias, Union +from typing import Literal, TypeAlias, Union from pydantic import BaseModel, Field @@ -32,13 +32,13 @@ class Person(BaseModel): age: Int name: String - typename__: Optional[Literal['Person']] = Field('Person', alias='__typename') + typename__: Literal['Person'] | None = Field('Person', alias='__typename') class Pet(BaseModel): name: String type: String - typename__: Optional[Literal['Pet']] = Field('Pet', alias='__typename') + typename__: Literal['Pet'] | None = Field('Pet', alias='__typename') UnionType: TypeAlias = Union[ @@ -48,9 +48,9 @@ class Pet(BaseModel): class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - string_field: Optional[String] = None - union_field: Optional[UnionType] = None - typename__: Optional[Literal['ModelWithTypeAliasField']] = Field( + simple_field: SimpleString | None = None + string_field: String | None = None + union_field: UnionType | None = None + typename__: Literal['ModelWithTypeAliasField'] | None = Field( 'ModelWithTypeAliasField', alias='__typename' ) diff --git a/tests/data/expected/main/jsonschema/type_alias.py b/tests/data/expected/main/jsonschema/type_alias.py index dbc19ee54..55d128316 100644 --- a/tests/data/expected/main/jsonschema/type_alias.py +++ b/tests/data/expected/main/jsonschema/type_alias.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Any, Optional, TypeAlias, Union +from typing import Annotated, Any, TypeAlias from pydantic import BaseModel, Field @@ -14,20 +14,20 @@ SimpleString: TypeAlias = str -UnionType: TypeAlias = Union[str, int] +UnionType: TypeAlias = str | int ArrayType: TypeAlias = list[str] AnnotatedType: TypeAlias = Annotated[ - Union[str, bool], + str | bool, Field(..., description='An annotated union type', title='MyAnnotatedType'), ] class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - union_field: Optional[UnionType] = None - array_field: Optional[ArrayType] = None - annotated_field: Optional[AnnotatedType] = None + simple_field: SimpleString | None = None + union_field: UnionType | None = None + array_field: ArrayType | None = None + annotated_field: AnnotatedType | None = None diff --git a/tests/data/expected/main/jsonschema/type_alias_cycle_keep_model_order.py b/tests/data/expected/main/jsonschema/type_alias_cycle_keep_model_order.py index fc3181b52..3b3ed1768 100644 --- a/tests/data/expected/main/jsonschema/type_alias_cycle_keep_model_order.py +++ b/tests/data/expected/main/jsonschema/type_alias_cycle_keep_model_order.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TypeAlias, Union +from typing import TypeAlias A: TypeAlias = list["B"] @@ -12,4 +12,4 @@ B: TypeAlias = list[A] -Model: TypeAlias = Union[A, B] +Model: TypeAlias = A | B diff --git a/tests/data/expected/main/jsonschema/type_alias_forward_ref_keep_model_order.py b/tests/data/expected/main/jsonschema/type_alias_forward_ref_keep_model_order.py index 47087c736..ab5c494ef 100644 --- a/tests/data/expected/main/jsonschema/type_alias_forward_ref_keep_model_order.py +++ b/tests/data/expected/main/jsonschema/type_alias_forward_ref_keep_model_order.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, TypeAlias, TypedDict, Union +from typing import Literal, TypeAlias, TypedDict class BlobPart(TypedDict): @@ -20,4 +20,4 @@ class TextPart(TypedDict): content: str -SystemInstructions: TypeAlias = list[Union[TextPart, BlobPart]] +SystemInstructions: TypeAlias = list[TextPart | BlobPart] diff --git a/tests/data/expected/main/jsonschema/type_alias_with_circular_ref_to_class_msgspec.py b/tests/data/expected/main/jsonschema/type_alias_with_circular_ref_to_class_msgspec.py index 76669d1b1..2fbd2ebad 100644 --- a/tests/data/expected/main/jsonschema/type_alias_with_circular_ref_to_class_msgspec.py +++ b/tests/data/expected/main/jsonschema/type_alias_with_circular_ref_to_class_msgspec.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TypeAlias +from typing import TypeAlias, Union from msgspec import Struct @@ -17,7 +17,7 @@ class SpanB(Struct): recur: list[Span] -Either: TypeAlias = SpanB | "Span" +Either: TypeAlias = Union[SpanB, "Span"] class Span(Struct): diff --git a/tests/data/expected/main/jsonschema/type_alias_with_field_description.py b/tests/data/expected/main/jsonschema/type_alias_with_field_description.py index 82129cb06..3c6c1ce05 100644 --- a/tests/data/expected/main/jsonschema/type_alias_with_field_description.py +++ b/tests/data/expected/main/jsonschema/type_alias_with_field_description.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Annotated, Any, Optional, TypeAlias, Union +from typing import Annotated, Any, TypeAlias from pydantic import BaseModel, Field @@ -14,22 +14,20 @@ SimpleString: TypeAlias = str -UnionType: TypeAlias = Union[str, int] +UnionType: TypeAlias = str | int ArrayType: TypeAlias = list[str] -AnnotatedType: TypeAlias = Annotated[ - Union[str, bool], Field(..., title='MyAnnotatedType') -] +AnnotatedType: TypeAlias = Annotated[str | bool, Field(..., title='MyAnnotatedType')] """ An annotated union type """ class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - union_field: Optional[UnionType] = None - array_field: Optional[ArrayType] = None - annotated_field: Optional[AnnotatedType] = None + simple_field: SimpleString | None = None + union_field: UnionType | None = None + array_field: ArrayType | None = None + annotated_field: AnnotatedType | None = None diff --git a/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py b/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py index 12631f6e5..858a242c8 100644 --- a/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py +++ b/tests/data/expected/main/openapi/msgspec_mutual_type_alias.py @@ -9,4 +9,4 @@ NodeA: TypeAlias = Union[int, "NodeB"] -NodeB: TypeAlias = Union[str, NodeA] +NodeB: TypeAlias = str | NodeA diff --git a/tests/data/expected/main/openapi/type_alias.py b/tests/data/expected/main/openapi/type_alias.py index 37885b1ae..993741a1d 100644 --- a/tests/data/expected/main/openapi/type_alias.py +++ b/tests/data/expected/main/openapi/type_alias.py @@ -4,26 +4,24 @@ from __future__ import annotations -from typing import Annotated, Optional, TypeAlias, Union +from typing import Annotated, TypeAlias from pydantic import BaseModel, Field SimpleString: TypeAlias = str -UnionType: TypeAlias = Union[str, int] +UnionType: TypeAlias = str | int ArrayType: TypeAlias = list[str] -AnnotatedType: TypeAlias = Annotated[ - Union[str, bool], Field(..., title='MyAnnotatedType') -] +AnnotatedType: TypeAlias = Annotated[str | bool, Field(..., title='MyAnnotatedType')] class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - union_field: Optional[UnionType] = None - array_field: Optional[ArrayType] = None - annotated_field: Optional[AnnotatedType] = None + simple_field: SimpleString | None = None + union_field: UnionType | None = None + array_field: ArrayType | None = None + annotated_field: AnnotatedType | None = None diff --git a/tests/data/expected/main/openapi/type_alias_forward_ref_multiple.py b/tests/data/expected/main/openapi/type_alias_forward_ref_multiple.py index 0f705056d..a1afaa04a 100644 --- a/tests/data/expected/main/openapi/type_alias_forward_ref_multiple.py +++ b/tests/data/expected/main/openapi/type_alias_forward_ref_multiple.py @@ -4,13 +4,13 @@ from __future__ import annotations -from typing import Optional, TypeAlias, Union +from typing import TypeAlias, Union from pydantic import BaseModel class RegularModel(BaseModel): - name: Optional[str] = None + name: str | None = None Third: TypeAlias = str diff --git a/tests/data/expected/main/openapi/type_alias_mutual_recursive.py b/tests/data/expected/main/openapi/type_alias_mutual_recursive.py index 12631f6e5..858a242c8 100644 --- a/tests/data/expected/main/openapi/type_alias_mutual_recursive.py +++ b/tests/data/expected/main/openapi/type_alias_mutual_recursive.py @@ -9,4 +9,4 @@ NodeA: TypeAlias = Union[int, "NodeB"] -NodeB: TypeAlias = Union[str, NodeA] +NodeB: TypeAlias = str | NodeA diff --git a/tests/data/expected/main/openapi/type_alias_recursive.py b/tests/data/expected/main/openapi/type_alias_recursive.py index f9c81f161..32215eee1 100644 --- a/tests/data/expected/main/openapi/type_alias_recursive.py +++ b/tests/data/expected/main/openapi/type_alias_recursive.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Optional, TypeAlias, Union +from typing import TypeAlias, Union from pydantic import BaseModel @@ -14,27 +14,27 @@ class File(BaseModel): class Folder(BaseModel): - address: Optional[str] = None + address: str | None = None files: list[File] - subfolders: Optional[list[Folder]] = None + subfolders: list[Folder] | None = None -ElementaryType: TypeAlias = Optional[Union[bool, str, int, float]] +ElementaryType: TypeAlias = bool | str | int | float | None JsonType: TypeAlias = Union[ElementaryType, list["JsonType"], dict[str, "JsonType"]] class Space(BaseModel): - label: Optional[str] = None - data: Optional[JsonType] = None - dual: Optional[DualSpace] = None + label: str | None = None + data: JsonType | None = None + dual: DualSpace | None = None class DualSpace(BaseModel): - label: Optional[str] = None - data: Optional[JsonType] = None - predual: Optional[Space] = None + label: str | None = None + data: JsonType | None = None + predual: Space | None = None Folder.update_forward_refs() diff --git a/tests/data/expected/main/openapi/type_alias_recursive_py311.py b/tests/data/expected/main/openapi/type_alias_recursive_py311.py index f9c81f161..32215eee1 100644 --- a/tests/data/expected/main/openapi/type_alias_recursive_py311.py +++ b/tests/data/expected/main/openapi/type_alias_recursive_py311.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Optional, TypeAlias, Union +from typing import TypeAlias, Union from pydantic import BaseModel @@ -14,27 +14,27 @@ class File(BaseModel): class Folder(BaseModel): - address: Optional[str] = None + address: str | None = None files: list[File] - subfolders: Optional[list[Folder]] = None + subfolders: list[Folder] | None = None -ElementaryType: TypeAlias = Optional[Union[bool, str, int, float]] +ElementaryType: TypeAlias = bool | str | int | float | None JsonType: TypeAlias = Union[ElementaryType, list["JsonType"], dict[str, "JsonType"]] class Space(BaseModel): - label: Optional[str] = None - data: Optional[JsonType] = None - dual: Optional[DualSpace] = None + label: str | None = None + data: JsonType | None = None + dual: DualSpace | None = None class DualSpace(BaseModel): - label: Optional[str] = None - data: Optional[JsonType] = None - predual: Optional[Space] = None + label: str | None = None + data: JsonType | None = None + predual: Space | None = None Folder.update_forward_refs() diff --git a/tox.ini b/tox.ini index 92f1e8591..590d2dffb 100644 --- a/tox.ini +++ b/tox.ini @@ -128,6 +128,8 @@ dependency_groups = docs [testenv:dev] description = generate a DEV environment package = editable +extras = + all commands = uv pip tree python -c 'import sys; print(sys.executable)' From 9471247051910df259ae14ede9df2f944a6613b9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 19 Dec 2025 18:52:15 +0000 Subject: [PATCH 06/17] docs: update CLI reference documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated by GitHub Actions --- docs/cli-reference/field-customization.md | 16 ++++++------- docs/cli-reference/typing-customization.md | 28 +++++++++++----------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/docs/cli-reference/field-customization.md b/docs/cli-reference/field-customization.md index 8b42f04bf..dfc0515f5 100644 --- a/docs/cli-reference/field-customization.md +++ b/docs/cli-reference/field-customization.md @@ -2769,7 +2769,7 @@ generated models, preserving documentation from the original schema. from __future__ import annotations - from typing import Annotated, Any, Optional, TypeAlias, Union + from typing import Annotated, Any, TypeAlias from pydantic import BaseModel, Field @@ -2779,25 +2779,23 @@ generated models, preserving documentation from the original schema. SimpleString: TypeAlias = str - UnionType: TypeAlias = Union[str, int] + UnionType: TypeAlias = str | int ArrayType: TypeAlias = list[str] - AnnotatedType: TypeAlias = Annotated[ - Union[str, bool], Field(..., title='MyAnnotatedType') - ] + AnnotatedType: TypeAlias = Annotated[str | bool, Field(..., title='MyAnnotatedType')] """ An annotated union type """ class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - union_field: Optional[UnionType] = None - array_field: Optional[ArrayType] = None - annotated_field: Optional[AnnotatedType] = None + simple_field: SimpleString | None = None + union_field: UnionType | None = None + array_field: ArrayType | None = None + annotated_field: AnnotatedType | None = None ``` --- diff --git a/docs/cli-reference/typing-customization.md b/docs/cli-reference/typing-customization.md index e4e021584..0b62baa8f 100644 --- a/docs/cli-reference/typing-customization.md +++ b/docs/cli-reference/typing-customization.md @@ -3031,7 +3031,7 @@ syntax. This feature is experimental. from __future__ import annotations - from typing import Annotated, Any, Optional, TypeAlias, Union + from typing import Annotated, Any, TypeAlias from pydantic import BaseModel, Field @@ -3041,23 +3041,23 @@ syntax. This feature is experimental. SimpleString: TypeAlias = str - UnionType: TypeAlias = Union[str, int] + UnionType: TypeAlias = str | int ArrayType: TypeAlias = list[str] AnnotatedType: TypeAlias = Annotated[ - Union[str, bool], + str | bool, Field(..., description='An annotated union type', title='MyAnnotatedType'), ] class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - union_field: Optional[UnionType] = None - array_field: Optional[ArrayType] = None - annotated_field: Optional[AnnotatedType] = None + simple_field: SimpleString | None = None + union_field: UnionType | None = None + array_field: ArrayType | None = None + annotated_field: AnnotatedType | None = None ``` === "GraphQL" @@ -3095,7 +3095,7 @@ syntax. This feature is experimental. from __future__ import annotations - from typing import Literal, Optional, TypeAlias, Union + from typing import Literal, TypeAlias, Union from pydantic import BaseModel, Field @@ -3123,13 +3123,13 @@ syntax. This feature is experimental. class Person(BaseModel): age: Int name: String - typename__: Optional[Literal['Person']] = Field('Person', alias='__typename') + typename__: Literal['Person'] | None = Field('Person', alias='__typename') class Pet(BaseModel): name: String type: String - typename__: Optional[Literal['Pet']] = Field('Pet', alias='__typename') + typename__: Literal['Pet'] | None = Field('Pet', alias='__typename') UnionType: TypeAlias = Union[ @@ -3139,10 +3139,10 @@ syntax. This feature is experimental. class ModelWithTypeAliasField(BaseModel): - simple_field: Optional[SimpleString] = None - string_field: Optional[String] = None - union_field: Optional[UnionType] = None - typename__: Optional[Literal['ModelWithTypeAliasField']] = Field( + simple_field: SimpleString | None = None + string_field: String | None = None + union_field: UnionType | None = None + typename__: Literal['ModelWithTypeAliasField'] | None = Field( 'ModelWithTypeAliasField', alias='__typename' ) ``` From b4c2e1a06dedb3ae3582157e842cb344352d8606 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 19:03:59 +0000 Subject: [PATCH 07/17] feat: Enhance type hinting by replacing Optional with Union and adding support for native union types --- src/datamodel_code_generator/model/base.py | 30 ++++++++++++++----- .../model/type_alias.py | 1 + src/datamodel_code_generator/parser/base.py | 3 +- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/datamodel_code_generator/model/base.py b/src/datamodel_code_generator/model/base.py index 10fef1d60..0a2d72b2b 100644 --- a/src/datamodel_code_generator/model/base.py +++ b/src/datamodel_code_generator/model/base.py @@ -213,6 +213,20 @@ def self_reference(self) -> bool: return False return self.parent.reference.path in {d.reference.path for d in self.data_type.all_data_types if d.reference} + @property + def _use_union_operator(self) -> bool: + """Get effective use_union_operator considering parent model's forward reference.""" + if self.parent and getattr(self.parent, "has_forward_reference", False): + return False + return self.data_type.use_union_operator + + def _convert_to_union_if_needed(self, type_hint: str) -> str: + """Convert union operator syntax to Union[] if parent has forward references.""" + if self._use_union_operator != self.data_type.use_union_operator and " | " in type_hint: + parts = [p.strip() for p in type_hint.split(" | ")] + return f"Union[{', '.join(parts)}]" + return type_hint + @property def type_hint(self) -> str: # noqa: PLR0911 """Get the type hint string for this field, including nullability.""" @@ -221,24 +235,24 @@ def type_hint(self) -> str: # noqa: PLR0911 if not type_hint: return NONE if self.has_default_factory or (self.data_type.is_optional and self.data_type.type != ANY): - return type_hint + return self._convert_to_union_if_needed(type_hint) if self.nullable is not None: if self.nullable: - return get_optional_type(type_hint, self.data_type.use_union_operator) - return type_hint + return get_optional_type(type_hint, self._use_union_operator) + return self._convert_to_union_if_needed(type_hint) if self.required: if self.type_has_null: - return get_optional_type(type_hint, self.data_type.use_union_operator) - return type_hint + return get_optional_type(type_hint, self._use_union_operator) + return self._convert_to_union_if_needed(type_hint) if self.fall_back_to_nullable: - return get_optional_type(type_hint, self.data_type.use_union_operator) - return type_hint + return get_optional_type(type_hint, self._use_union_operator) + return self._convert_to_union_if_needed(type_hint) @property def imports(self) -> tuple[Import, ...]: """Get all imports required for this field's type hint.""" type_hint = self.type_hint - has_union = not self.data_type.use_union_operator and UNION_PREFIX in type_hint + has_union = not self._use_union_operator and UNION_PREFIX in type_hint has_optional = OPTIONAL_PREFIX in type_hint imports: list[tuple[Import] | Iterator[Import]] = [ iter( diff --git a/src/datamodel_code_generator/model/type_alias.py b/src/datamodel_code_generator/model/type_alias.py index 8e6d84588..cc26019fd 100644 --- a/src/datamodel_code_generator/model/type_alias.py +++ b/src/datamodel_code_generator/model/type_alias.py @@ -22,6 +22,7 @@ class TypeAliasBase(DataModel): """Base class for all type alias implementations.""" IS_ALIAS: bool = True + has_forward_reference: bool = False @property def imports(self) -> tuple[Import, ...]: diff --git a/src/datamodel_code_generator/parser/base.py b/src/datamodel_code_generator/parser/base.py index a94e7ae08..48d4f2a6f 100644 --- a/src/datamodel_code_generator/parser/base.py +++ b/src/datamodel_code_generator/parser/base.py @@ -1916,8 +1916,7 @@ def __update_type_aliases(cls, models: list[DataModel]) -> None: has_forward_ref = True if has_forward_ref: - for field in model.fields: - field.data_type.use_union_operator = False + model.has_forward_reference = True @classmethod def __postprocess_result_modules(cls, results: dict[tuple[str, ...], Result]) -> dict[tuple[str, ...], Result]: From cd7e89af43c23507f71f94a02340b3483ca97140 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 19:09:24 +0000 Subject: [PATCH 08/17] feat: Refactor type hint handling to improve union type hint generation --- src/datamodel_code_generator/model/base.py | 25 +++++++++++-------- .../model/type_alias.py | 1 - 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/datamodel_code_generator/model/base.py b/src/datamodel_code_generator/model/base.py index 0a2d72b2b..3dd246239 100644 --- a/src/datamodel_code_generator/model/base.py +++ b/src/datamodel_code_generator/model/base.py @@ -216,37 +216,39 @@ def self_reference(self) -> bool: @property def _use_union_operator(self) -> bool: """Get effective use_union_operator considering parent model's forward reference.""" - if self.parent and getattr(self.parent, "has_forward_reference", False): + if self.parent and self.parent.has_forward_reference: return False return self.data_type.use_union_operator - def _convert_to_union_if_needed(self, type_hint: str) -> str: - """Convert union operator syntax to Union[] if parent has forward references.""" - if self._use_union_operator != self.data_type.use_union_operator and " | " in type_hint: - parts = [p.strip() for p in type_hint.split(" | ")] + def _build_union_type_hint(self) -> str | None: + """Build Union[] type hint from data_type.data_types if forward reference requires it.""" + if not (self._use_union_operator != self.data_type.use_union_operator and self.data_type.is_union): + return None + parts = [dt.type_hint for dt in self.data_type.data_types if dt.type_hint] + if len(parts) > 1: return f"Union[{', '.join(parts)}]" - return type_hint + return None @property def type_hint(self) -> str: # noqa: PLR0911 """Get the type hint string for this field, including nullability.""" - type_hint = self.data_type.type_hint + type_hint = self._build_union_type_hint() or self.data_type.type_hint if not type_hint: return NONE if self.has_default_factory or (self.data_type.is_optional and self.data_type.type != ANY): - return self._convert_to_union_if_needed(type_hint) + return type_hint if self.nullable is not None: if self.nullable: return get_optional_type(type_hint, self._use_union_operator) - return self._convert_to_union_if_needed(type_hint) + return type_hint if self.required: if self.type_has_null: return get_optional_type(type_hint, self._use_union_operator) - return self._convert_to_union_if_needed(type_hint) + return type_hint if self.fall_back_to_nullable: return get_optional_type(type_hint, self._use_union_operator) - return self._convert_to_union_if_needed(type_hint) + return type_hint @property def imports(self) -> tuple[Import, ...]: @@ -443,6 +445,7 @@ class DataModel(TemplateBase, Nullable, ABC): # noqa: PLR0904 BASE_CLASS: ClassVar[str] = "" DEFAULT_IMPORTS: ClassVar[tuple[Import, ...]] = () IS_ALIAS: bool = False + has_forward_reference: bool = False def __init__( # noqa: PLR0913 self, diff --git a/src/datamodel_code_generator/model/type_alias.py b/src/datamodel_code_generator/model/type_alias.py index cc26019fd..8e6d84588 100644 --- a/src/datamodel_code_generator/model/type_alias.py +++ b/src/datamodel_code_generator/model/type_alias.py @@ -22,7 +22,6 @@ class TypeAliasBase(DataModel): """Base class for all type alias implementations.""" IS_ALIAS: bool = True - has_forward_reference: bool = False @property def imports(self) -> tuple[Import, ...]: From 6a933fe85a4eb62e06145642ceb6f897c317b396 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 19:10:04 +0000 Subject: [PATCH 09/17] feat: Update type hints to use native union types and improve readability --- .../main/graphql/different_types_of_fields.py | 6 +-- .../main/jsonschema/combined_array.py | 53 ++++++++----------- ...minator_with_external_reference_msgspec.py | 6 +-- .../inner_folder/type_2.py | 6 +-- .../data/expected/main/jsonschema/pattern.py | 15 +++--- .../pattern_properties_by_reference.py | 6 +-- .../main/jsonschema/strict_types_all.py | 26 ++++----- tests/data/expected/main/jsonschema/titles.py | 6 +-- .../jsonschema/titles_use_title_as_name.py | 6 +-- .../without_titles_use_title_as_name.py | 6 +-- .../main/openapi/collapse_root_models.py | 6 +-- .../expected/main/openapi/enum_models/all.py | 22 ++++---- .../main/openapi/enum_models/as_literal.py | 22 ++++---- .../expected/main/openapi/msgspec_nullable.py | 28 +++++----- .../expected/main/openapi/msgspec_struct.py | 28 +++++----- .../main/openapi/msgspec_struct_snake_case.py | 28 +++++----- ...ec_use_annotated_with_field_constraints.py | 31 +++++------ .../openapi/msgspec_use_union_operator.py | 28 +++++----- .../expected/main/openapi/pattern/general.py | 15 +++--- .../main/openapi/pattern/msgspec_pattern.py | 22 ++++---- .../main/openapi/pattern/pydantic_v2.py | 16 +++--- tests/data/expected/main/openapi/pyproject.py | 26 +++------ .../use_generic_container_types/__init__.py | 4 +- .../use_generic_container_types/_internal.py | 33 ++++++------ .../collections.py | 11 ++-- .../use_generic_container_types/foo/bar.py | 10 ++-- .../use_generic_container_types/models.py | 12 ++--- .../use_generic_container_types/woo/boo.py | 10 ++-- .../__init__.py | 4 +- .../_internal.py | 33 ++++++------ .../collections.py | 11 ++-- .../foo/bar.py | 10 ++-- .../models.py | 12 ++--- .../woo/boo.py | 10 ++-- .../main/openapi/with_aliases_msgspec.py | 28 +++++----- .../data/expected/main_kr/pyproject/output.py | 28 +++------- 36 files changed, 269 insertions(+), 355 deletions(-) diff --git a/tests/data/expected/main/graphql/different_types_of_fields.py b/tests/data/expected/main/graphql/different_types_of_fields.py index c3843dad2..daadea3e3 100644 --- a/tests/data/expected/main/graphql/different_types_of_fields.py +++ b/tests/data/expected/main/graphql/different_types_of_fields.py @@ -33,7 +33,7 @@ class A(BaseModel): optionalListListOptionalField: list[list[String | None]] | None = None optionalListOptionalField: list[String | None] | None = None optionalListOptionalListField: list[list[String] | None] | None = None - optionalListOptionalListOptionalField: list[list[String | None] | None] | None = ( - None - ) + optionalListOptionalListOptionalField: list[ + list[String | None] | None + ] | None = None typename__: Literal['A'] | None = Field('A', alias='__typename') diff --git a/tests/data/expected/main/jsonschema/combined_array.py b/tests/data/expected/main/jsonschema/combined_array.py index 21965c895..0c4079dd4 100644 --- a/tests/data/expected/main/jsonschema/combined_array.py +++ b/tests/data/expected/main/jsonschema/combined_array.py @@ -5,18 +5,17 @@ from __future__ import annotations from enum import Enum -from typing import Optional, Union from pydantic import BaseModel, Field class Pet1(BaseModel): - name: Optional[str] = None - age: Optional[int] = None + name: str | None = None + age: int | None = None class Pet(BaseModel): - __root__: Union[list[Pet1], Pet1] = Field(..., title='Pet') + __root__: list[Pet1] | Pet1 = Field(..., title='Pet') class CombinedEnum1(Enum): @@ -30,19 +29,19 @@ class CombinedEnumField(Enum): class CombinedObjectField1(BaseModel): - color: Optional[str] = None + color: str | None = None class CombinedSelf1(BaseModel): - color: Optional[str] = None + color: str | None = None class CombinedSelf(BaseModel): - __root__: Union[list[CombinedSelf1], CombinedSelf1] + __root__: list[CombinedSelf1] | CombinedSelf1 class CombinedSelfEnum1(BaseModel): - color: Optional[str] = None + color: str | None = None class CombinedSelfEnum2(Enum): @@ -51,11 +50,9 @@ class CombinedSelfEnum2(Enum): class CombinedSelfEnum(BaseModel): - __root__: Union[ - list[Union[CombinedSelfEnum1, CombinedSelfEnum2]], - CombinedSelfEnum1, - CombinedSelfEnum2, - ] + __root__: list[ + CombinedSelfEnum1 | CombinedSelfEnum2 + ] | CombinedSelfEnum1 | CombinedSelfEnum2 class CombinedSelfAllOf2(Enum): @@ -64,11 +61,11 @@ class CombinedSelfAllOf2(Enum): class Kind(BaseModel): - description: Optional[str] = None + description: str | None = None class Id(BaseModel): - id: Optional[int] = None + id: int | None = None class CustomRootModel(BaseModel): @@ -76,7 +73,7 @@ class CustomRootModel(BaseModel): class CombinedEnum(BaseModel): - __root__: Union[list[Kind], CombinedEnum1] + __root__: list[Kind] | CombinedEnum1 class CombinedAllOf1(Kind, Id): @@ -84,7 +81,7 @@ class CombinedAllOf1(Kind, Id): class CombinedAllOf(BaseModel): - __root__: Union[list[Kind], CombinedAllOf1] + __root__: list[Kind] | CombinedAllOf1 class CombinedAllOfField(Kind, Id): @@ -92,25 +89,21 @@ class CombinedAllOfField(Kind, Id): class CombinedAllOfObjectField(Kind, Id): - color: Optional[str] = None + color: str | None = None class CombinedObjectField(BaseModel): - CombinedEnumField: Optional[Union[list[Kind], CombinedEnumField]] = None - CombinedAllOfField: Optional[Union[list[Kind], CombinedAllOfField]] = None - CombinedObjectField: Optional[Union[list[Kind], CombinedObjectField1]] = None - CombinedAllOfObjectField: Optional[ - Union[list[Kind], CombinedAllOfObjectField] - ] = None + CombinedEnumField: list[Kind] | CombinedEnumField | None = None + CombinedAllOfField: list[Kind] | CombinedAllOfField | None = None + CombinedObjectField: list[Kind] | CombinedObjectField1 | None = None + CombinedAllOfObjectField: list[Kind] | CombinedAllOfObjectField | None = None class CombinedSelfAllOf1(Kind, Id): - color: Optional[str] = None + color: str | None = None class CombinedSelfAllOf(BaseModel): - __root__: Union[ - list[Union[CombinedSelfAllOf1, CombinedSelfAllOf2]], - CombinedSelfAllOf1, - CombinedSelfAllOf2, - ] + __root__: list[ + CombinedSelfAllOf1 | CombinedSelfAllOf2 + ] | CombinedSelfAllOf1 | CombinedSelfAllOf2 diff --git a/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py b/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py index 38d04cf4b..a1cd36be9 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py @@ -14,9 +14,9 @@ class Type1(Struct, tag_field='type_', tag='a'): class Type2(Struct, tag_field='type_', tag='b'): - ref_type: Annotated[Type1, Meta(description='A referenced type.')] | UnsetType = ( - UNSET - ) + ref_type: Annotated[ + Type1, Meta(description='A referenced type.') + ] | UnsetType = UNSET class Type4(Struct, tag_field='type_', tag='d'): diff --git a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py index d149545c8..5136c8964 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py @@ -12,6 +12,6 @@ class Type2(Struct, tag_field='type_', tag='b'): - ref_type: ( - Annotated[type_1.Type1, Meta(description='A referenced type.')] | UnsetType - ) = UNSET + ref_type: Annotated[ + type_1.Type1, Meta(description='A referenced type.') + ] | UnsetType = UNSET diff --git a/tests/data/expected/main/jsonschema/pattern.py b/tests/data/expected/main/jsonschema/pattern.py index 17488b76c..d969fb3b7 100644 --- a/tests/data/expected/main/jsonschema/pattern.py +++ b/tests/data/expected/main/jsonschema/pattern.py @@ -7,14 +7,11 @@ class Info(BaseModel): - hostName: ( - constr( - regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' - ) - | None - ) = None - arn: ( - constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') | None - ) = None + hostName: constr( + regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' + ) | None = None + arn: constr( + regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$' + ) | None = None tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None comment: constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None diff --git a/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py b/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py index 6fe79bbd0..07589cbb1 100644 --- a/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py +++ b/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py @@ -27,8 +27,8 @@ class SomeschemaSchema(BaseModel): class Config: extra = Extra.forbid - KeyWithExplicitPatternProperties: ( - dict[constr(regex=r'^[a-z]{1}[0-9]{1}$'), Any] | None - ) = None + KeyWithExplicitPatternProperties: dict[ + constr(regex=r'^[a-z]{1}[0-9]{1}$'), Any + ] | None = None KeyWithPatternPropertiesByReference: TextResponse | None = None SomeOtherBoringReference: Stt | None = None diff --git a/tests/data/expected/main/jsonschema/strict_types_all.py b/tests/data/expected/main/jsonschema/strict_types_all.py index 65cca825e..d627cf4fb 100644 --- a/tests/data/expected/main/jsonschema/strict_types_all.py +++ b/tests/data/expected/main/jsonschema/strict_types_all.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import ( BaseModel, Field, @@ -20,16 +18,14 @@ class User(BaseModel): - name: Optional[StrictStr] = Field(None, example='ken') - age: Optional[StrictInt] = None - salary: Optional[conint(ge=0, strict=True)] = None - debt: Optional[conint(le=0, strict=True)] = None - loan: Optional[confloat(le=0.0, strict=True)] = None - tel: Optional[ - constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$', strict=True) - ] = None - height: Optional[confloat(ge=0.0, strict=True)] = None - weight: Optional[confloat(ge=0.0, strict=True)] = None - score: Optional[confloat(ge=1e-08, strict=True)] = None - active: Optional[StrictBool] = None - photo: Optional[StrictBytes] = None + name: StrictStr | None = Field(None, example='ken') + age: StrictInt | None = None + salary: conint(ge=0, strict=True) | None = None + debt: conint(le=0, strict=True) | None = None + loan: confloat(le=0.0, strict=True) | None = None + tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$', strict=True) | None = None + height: confloat(ge=0.0, strict=True) | None = None + weight: confloat(ge=0.0, strict=True) | None = None + score: confloat(ge=1e-08, strict=True) | None = None + active: StrictBool | None = None + photo: StrictBytes | None = None diff --git a/tests/data/expected/main/jsonschema/titles.py b/tests/data/expected/main/jsonschema/titles.py index c8fd51eaf..4099074be 100644 --- a/tests/data/expected/main/jsonschema/titles.py +++ b/tests/data/expected/main/jsonschema/titles.py @@ -45,9 +45,9 @@ class ExtendedProcessingTasks(BaseModel): class ProcessingTask(BaseModel): - processing_status_union: ( - ProcessingStatusUnion | ExtendedProcessingTask | ProcessingStatus | None - ) = Field('COMPLETED', title='Processing Status Union Title') + processing_status_union: ProcessingStatusUnion | ExtendedProcessingTask | ProcessingStatus | None = Field( + 'COMPLETED', title='Processing Status Union Title' + ) processing_status: ProcessingStatus | None = 'COMPLETED' name: str | None = None kind: Kind | None = None diff --git a/tests/data/expected/main/jsonschema/titles_use_title_as_name.py b/tests/data/expected/main/jsonschema/titles_use_title_as_name.py index eb9c9b2bd..a243ce107 100644 --- a/tests/data/expected/main/jsonschema/titles_use_title_as_name.py +++ b/tests/data/expected/main/jsonschema/titles_use_title_as_name.py @@ -45,9 +45,9 @@ class ExtendedProcessingTasksTitle(BaseModel): class ProcessingTaskTitle(BaseModel): - processing_status_union: ( - ProcessingStatusDetail | ExtendedProcessingTask | ProcessingStatusTitle | None - ) = Field('COMPLETED', title='Processing Status Union Title') + processing_status_union: ProcessingStatusDetail | ExtendedProcessingTask | ProcessingStatusTitle | None = Field( + 'COMPLETED', title='Processing Status Union Title' + ) processing_status: ProcessingStatusTitle | None = 'COMPLETED' name: str | None = None kind: Kind | None = None diff --git a/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py b/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py index 426939080..8428cb1e0 100644 --- a/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py +++ b/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py @@ -41,9 +41,9 @@ class ExtendedProcessingTasks(BaseModel): class ProcessingTask(BaseModel): - processing_status_union: ( - ProcessingStatusUnion | ExtendedProcessingTask | ProcessingStatus | None - ) = 'COMPLETED' + processing_status_union: ProcessingStatusUnion | ExtendedProcessingTask | ProcessingStatus | None = ( + 'COMPLETED' + ) processing_status: ProcessingStatus | None = 'COMPLETED' name: str | None = None kind: Kind | None = None diff --git a/tests/data/expected/main/openapi/collapse_root_models.py b/tests/data/expected/main/openapi/collapse_root_models.py index 3b32843d4..61c22ed17 100644 --- a/tests/data/expected/main/openapi/collapse_root_models.py +++ b/tests/data/expected/main/openapi/collapse_root_models.py @@ -22,9 +22,9 @@ class FileRequest(BaseModel): class ImageRequest(BaseModel): - image_hash: ( - constr(regex=r'^[a-fA-F\d]{32}$', min_length=64, max_length=64) | None - ) = Field(None, description='For image') + image_hash: constr( + regex=r'^[a-fA-F\d]{32}$', min_length=64, max_length=64 + ) | None = Field(None, description='For image') class FileHashes(BaseModel): diff --git a/tests/data/expected/main/openapi/enum_models/all.py b/tests/data/expected/main/openapi/enum_models/all.py index c05faec72..505317256 100644 --- a/tests/data/expected/main/openapi/enum_models/all.py +++ b/tests/data/expected/main/openapi/enum_models/all.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -12,9 +12,9 @@ class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - kind: Optional[Literal['dog', 'cat']] = None - type: Optional[Literal['animal']] = None + tag: str | None = None + kind: Literal['dog', 'cat'] | None = None + type: Literal['animal'] | None = None number: Literal[1] boolean: Literal[True] @@ -24,7 +24,7 @@ class Pets(BaseModel): class Animal(BaseModel): - kind: Optional[Literal['snake', 'rabbit']] = None + kind: Literal['snake', 'rabbit'] | None = None class Error(BaseModel): @@ -33,7 +33,7 @@ class Error(BaseModel): class EnumObject(BaseModel): - type: Optional[Literal['a', 'b']] = None + type: Literal['a', 'b'] | None = None class EnumRoot(BaseModel): @@ -57,16 +57,16 @@ class SingleEnum(BaseModel): class ArrayEnum(BaseModel): - __root__: list[Union[Literal['cat'], Literal['dog']]] + __root__: list[Literal['cat'] | Literal['dog']] class NestedNullableEnum(BaseModel): - nested_version: Optional[ - Literal['RC1', 'RC1N', 'RC2', 'RC2N', 'RC3', 'RC4'] - ] = Field('RC1', description='nullable enum', example='RC2') + nested_version: Literal['RC1', 'RC1N', 'RC2', 'RC2N', 'RC3', 'RC4'] | None = Field( + 'RC1', description='nullable enum', example='RC2' + ) class Version(BaseModel): - __root__: Optional[Literal['RC1', 'RC1N', 'RC2', 'RC2N', 'RC3', 'RC4']] = Field( + __root__: Literal['RC1', 'RC1N', 'RC2', 'RC2N', 'RC3', 'RC4'] | None = Field( 'RC1', description='nullable enum', example='RC2' ) diff --git a/tests/data/expected/main/openapi/enum_models/as_literal.py b/tests/data/expected/main/openapi/enum_models/as_literal.py index c05faec72..505317256 100644 --- a/tests/data/expected/main/openapi/enum_models/as_literal.py +++ b/tests/data/expected/main/openapi/enum_models/as_literal.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Literal, Optional, Union +from typing import Literal from pydantic import BaseModel, Field @@ -12,9 +12,9 @@ class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - kind: Optional[Literal['dog', 'cat']] = None - type: Optional[Literal['animal']] = None + tag: str | None = None + kind: Literal['dog', 'cat'] | None = None + type: Literal['animal'] | None = None number: Literal[1] boolean: Literal[True] @@ -24,7 +24,7 @@ class Pets(BaseModel): class Animal(BaseModel): - kind: Optional[Literal['snake', 'rabbit']] = None + kind: Literal['snake', 'rabbit'] | None = None class Error(BaseModel): @@ -33,7 +33,7 @@ class Error(BaseModel): class EnumObject(BaseModel): - type: Optional[Literal['a', 'b']] = None + type: Literal['a', 'b'] | None = None class EnumRoot(BaseModel): @@ -57,16 +57,16 @@ class SingleEnum(BaseModel): class ArrayEnum(BaseModel): - __root__: list[Union[Literal['cat'], Literal['dog']]] + __root__: list[Literal['cat'] | Literal['dog']] class NestedNullableEnum(BaseModel): - nested_version: Optional[ - Literal['RC1', 'RC1N', 'RC2', 'RC2N', 'RC3', 'RC4'] - ] = Field('RC1', description='nullable enum', example='RC2') + nested_version: Literal['RC1', 'RC1N', 'RC2', 'RC2N', 'RC3', 'RC4'] | None = Field( + 'RC1', description='nullable enum', example='RC2' + ) class Version(BaseModel): - __root__: Optional[Literal['RC1', 'RC1N', 'RC2', 'RC2N', 'RC3', 'RC4']] = Field( + __root__: Literal['RC1', 'RC1N', 'RC2', 'RC2N', 'RC3', 'RC4'] | None = Field( 'RC1', description='nullable enum', example='RC2' ) diff --git a/tests/data/expected/main/openapi/msgspec_nullable.py b/tests/data/expected/main/openapi/msgspec_nullable.py index 66c469a8a..0fc7fa9f0 100644 --- a/tests/data/expected/main/openapi/msgspec_nullable.py +++ b/tests/data/expected/main/openapi/msgspec_nullable.py @@ -29,22 +29,18 @@ class User(Struct): class Api(Struct): - apiKey: ( - Annotated[str, Meta(description='To be used as a dataset parameter value')] - | UnsetType - ) = UNSET - apiVersionNumber: ( - Annotated[str, Meta(description='To be used as a version parameter value')] - | UnsetType - ) = UNSET - apiUrl: ( - Annotated[str, Meta(description="The URL describing the dataset's fields")] - | UnsetType - ) = UNSET - apiDocumentationUrl: ( - Annotated[str, Meta(description='A URL to the API console for each API')] - | UnsetType - ) = UNSET + apiKey: Annotated[ + str, Meta(description='To be used as a dataset parameter value') + ] | UnsetType = UNSET + apiVersionNumber: Annotated[ + str, Meta(description='To be used as a version parameter value') + ] | UnsetType = UNSET + apiUrl: Annotated[ + str, Meta(description="The URL describing the dataset's fields") + ] | UnsetType = UNSET + apiDocumentationUrl: Annotated[ + str, Meta(description='A URL to the API console for each API') + ] | UnsetType = UNSET Apis: TypeAlias = list[Api] | None diff --git a/tests/data/expected/main/openapi/msgspec_struct.py b/tests/data/expected/main/openapi/msgspec_struct.py index 881e9517b..7f7847316 100644 --- a/tests/data/expected/main/openapi/msgspec_struct.py +++ b/tests/data/expected/main/openapi/msgspec_struct.py @@ -39,22 +39,18 @@ class Error(Struct): class Api(Struct): - apiKey: ( - Annotated[str, Meta(description='To be used as a dataset parameter value')] - | UnsetType - ) = UNSET - apiVersionNumber: ( - Annotated[str, Meta(description='To be used as a version parameter value')] - | UnsetType - ) = UNSET - apiUrl: ( - Annotated[str, Meta(description="The URL describing the dataset's fields")] - | UnsetType - ) = UNSET - apiDocumentationUrl: ( - Annotated[str, Meta(description='A URL to the API console for each API')] - | UnsetType - ) = UNSET + apiKey: Annotated[ + str, Meta(description='To be used as a dataset parameter value') + ] | UnsetType = UNSET + apiVersionNumber: Annotated[ + str, Meta(description='To be used as a version parameter value') + ] | UnsetType = UNSET + apiUrl: Annotated[ + str, Meta(description="The URL describing the dataset's fields") + ] | UnsetType = UNSET + apiDocumentationUrl: Annotated[ + str, Meta(description='A URL to the API console for each API') + ] | UnsetType = UNSET Apis: TypeAlias = list[Api] diff --git a/tests/data/expected/main/openapi/msgspec_struct_snake_case.py b/tests/data/expected/main/openapi/msgspec_struct_snake_case.py index efca091ba..77fb5fc34 100644 --- a/tests/data/expected/main/openapi/msgspec_struct_snake_case.py +++ b/tests/data/expected/main/openapi/msgspec_struct_snake_case.py @@ -40,22 +40,18 @@ class Error(Struct): class Api(Struct): - api_key: ( - Annotated[str, Meta(description='To be used as a dataset parameter value')] - | UnsetType - ) = field(name='apiKey', default=UNSET) - api_version_number: ( - Annotated[str, Meta(description='To be used as a version parameter value')] - | UnsetType - ) = field(name='apiVersionNumber', default=UNSET) - api_url: ( - Annotated[str, Meta(description="The URL describing the dataset's fields")] - | UnsetType - ) = field(name='apiUrl', default=UNSET) - api_documentation_url: ( - Annotated[str, Meta(description='A URL to the API console for each API')] - | UnsetType - ) = field(name='apiDocumentationUrl', default=UNSET) + api_key: Annotated[ + str, Meta(description='To be used as a dataset parameter value') + ] | UnsetType = field(name='apiKey', default=UNSET) + api_version_number: Annotated[ + str, Meta(description='To be used as a version parameter value') + ] | UnsetType = field(name='apiVersionNumber', default=UNSET) + api_url: Annotated[ + str, Meta(description="The URL describing the dataset's fields") + ] | UnsetType = field(name='apiUrl', default=UNSET) + api_documentation_url: Annotated[ + str, Meta(description='A URL to the API console for each API') + ] | UnsetType = field(name='apiDocumentationUrl', default=UNSET) Apis: TypeAlias = list[Api] diff --git a/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py b/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py index 18d486e5e..f05d2f05c 100644 --- a/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py +++ b/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py @@ -55,25 +55,18 @@ class Error(Struct): class Api(Struct): - apiKey: ( - Annotated[str, Meta(description='To be used as a dataset parameter value')] - | UnsetType - ) = UNSET - apiVersionNumber: ( - Annotated[str, Meta(description='To be used as a version parameter value')] - | UnsetType - ) = UNSET - apiUrl: ( - Annotated[ - str, - Meta(description="The URL describing the dataset's fields", min_length=1), - ] - | UnsetType - ) = UNSET - apiDocumentationUrl: ( - Annotated[str, Meta(description='A URL to the API console for each API')] - | UnsetType - ) = UNSET + apiKey: Annotated[ + str, Meta(description='To be used as a dataset parameter value') + ] | UnsetType = UNSET + apiVersionNumber: Annotated[ + str, Meta(description='To be used as a version parameter value') + ] | UnsetType = UNSET + apiUrl: Annotated[ + str, Meta(description="The URL describing the dataset's fields", min_length=1) + ] | UnsetType = UNSET + apiDocumentationUrl: Annotated[ + str, Meta(description='A URL to the API console for each API') + ] | UnsetType = UNSET Apis: TypeAlias = list[Api] diff --git a/tests/data/expected/main/openapi/msgspec_use_union_operator.py b/tests/data/expected/main/openapi/msgspec_use_union_operator.py index 66c469a8a..0fc7fa9f0 100644 --- a/tests/data/expected/main/openapi/msgspec_use_union_operator.py +++ b/tests/data/expected/main/openapi/msgspec_use_union_operator.py @@ -29,22 +29,18 @@ class User(Struct): class Api(Struct): - apiKey: ( - Annotated[str, Meta(description='To be used as a dataset parameter value')] - | UnsetType - ) = UNSET - apiVersionNumber: ( - Annotated[str, Meta(description='To be used as a version parameter value')] - | UnsetType - ) = UNSET - apiUrl: ( - Annotated[str, Meta(description="The URL describing the dataset's fields")] - | UnsetType - ) = UNSET - apiDocumentationUrl: ( - Annotated[str, Meta(description='A URL to the API console for each API')] - | UnsetType - ) = UNSET + apiKey: Annotated[ + str, Meta(description='To be used as a dataset parameter value') + ] | UnsetType = UNSET + apiVersionNumber: Annotated[ + str, Meta(description='To be used as a version parameter value') + ] | UnsetType = UNSET + apiUrl: Annotated[ + str, Meta(description="The URL describing the dataset's fields") + ] | UnsetType = UNSET + apiDocumentationUrl: Annotated[ + str, Meta(description='A URL to the API console for each API') + ] | UnsetType = UNSET Apis: TypeAlias = list[Api] | None diff --git a/tests/data/expected/main/openapi/pattern/general.py b/tests/data/expected/main/openapi/pattern/general.py index 0158cb1d6..efdb37465 100644 --- a/tests/data/expected/main/openapi/pattern/general.py +++ b/tests/data/expected/main/openapi/pattern/general.py @@ -8,14 +8,11 @@ class Info(BaseModel): - hostName: ( - constr( - regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' - ) - | None - ) = None - arn: ( - constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') | None - ) = None + hostName: constr( + regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' + ) | None = None + arn: constr( + regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$' + ) | None = None tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None comment: constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None diff --git a/tests/data/expected/main/openapi/pattern/msgspec_pattern.py b/tests/data/expected/main/openapi/pattern/msgspec_pattern.py index fb80408ef..a1d7448e9 100644 --- a/tests/data/expected/main/openapi/pattern/msgspec_pattern.py +++ b/tests/data/expected/main/openapi/pattern/msgspec_pattern.py @@ -11,16 +11,12 @@ class Info(Struct): hostName: str | UnsetType = UNSET - arn: ( - Annotated[ - str, - Meta(pattern='(^arn:([^:]*):([^:]*):([^:]*):(|\\*|[\\d]{12}):(.+)$)|^\\*$'), - ] - | UnsetType - ) = UNSET - tel: ( - Annotated[str, Meta(pattern='^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$')] | UnsetType - ) = UNSET - comment: ( - Annotated[str, Meta(pattern='[^\\b\\f\\n\\r\\t\\\\a+.?\'"|()]+$')] | UnsetType - ) = UNSET + arn: Annotated[ + str, Meta(pattern='(^arn:([^:]*):([^:]*):([^:]*):(|\\*|[\\d]{12}):(.+)$)|^\\*$') + ] | UnsetType = UNSET + tel: Annotated[ + str, Meta(pattern='^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$') + ] | UnsetType = UNSET + comment: Annotated[ + str, Meta(pattern='[^\\b\\f\\n\\r\\t\\\\a+.?\'"|()]+$') + ] | UnsetType = UNSET diff --git a/tests/data/expected/main/openapi/pattern/pydantic_v2.py b/tests/data/expected/main/openapi/pattern/pydantic_v2.py index 7d3ef3535..60d07994e 100644 --- a/tests/data/expected/main/openapi/pattern/pydantic_v2.py +++ b/tests/data/expected/main/openapi/pattern/pydantic_v2.py @@ -8,15 +8,11 @@ class Info(BaseModel): - hostName: ( - constr( - pattern=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])$' - ) - | None - ) = None - arn: ( - constr(pattern=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') - | None - ) = None + hostName: constr( + pattern=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])$' + ) | None = None + arn: constr( + pattern=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$' + ) | None = None tel: constr(pattern=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None comment: constr(pattern=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None diff --git a/tests/data/expected/main/openapi/pyproject.py b/tests/data/expected/main/openapi/pyproject.py index 348e2f25d..d3169518d 100644 --- a/tests/data/expected/main/openapi/pyproject.py +++ b/tests/data/expected/main/openapi/pyproject.py @@ -6,8 +6,6 @@ annotations, ) -from typing import Optional - from pydantic import ( AnyUrl, BaseModel, @@ -18,7 +16,7 @@ class Pet(BaseModel): id: int name: str - tag: Optional[str] + tag: str | None class Pets(BaseModel): @@ -28,7 +26,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] + tag: str | None class Users(BaseModel): @@ -49,30 +47,22 @@ class Error(BaseModel): class Api(BaseModel): - api_key: Optional[ - str - ] = Field( + api_key: str | None = Field( None, alias="apiKey", description="To be used as a dataset parameter value", ) - api_version_number: Optional[ - str - ] = Field( + api_version_number: str | None = Field( None, alias="apiVersionNumber", description="To be used as a version parameter value", ) - api_url: Optional[ - AnyUrl - ] = Field( + api_url: AnyUrl | None = Field( None, alias="apiUrl", description="The URL describing the dataset's fields", ) - api_documentation_url: Optional[ - AnyUrl - ] = Field( + api_documentation_url: AnyUrl | None = Field( None, alias="apiDocumentationUrl", description="A URL to the API console for each API", @@ -84,8 +74,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] + name: str | None class Result(BaseModel): - event: Optional[Event] + event: Event | None diff --git a/tests/data/expected/main/openapi/use_generic_container_types/__init__.py b/tests/data/expected/main/openapi/use_generic_container_types/__init__.py index 1a2ee19c2..76ac6d5e5 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types/__init__.py +++ b/tests/data/expected/main/openapi/use_generic_container_types/__init__.py @@ -2,6 +2,6 @@ # filename: modular.yaml # timestamp: 1985-10-26T08:21:00+00:00 -from ._internal import DifferentTea, Error, Id, OptionalModel, Result, Source +from ._internal import DifferentTea, Error, Id, Optional, Result, Source -__all__ = ["DifferentTea", "Error", "Id", "OptionalModel", "Result", "Source"] +__all__ = ["DifferentTea", "Error", "Id", "Optional", "Result", "Source"] diff --git a/tests/data/expected/main/openapi/use_generic_container_types/_internal.py b/tests/data/expected/main/openapi/use_generic_container_types/_internal.py index 0e6512987..fe851c967 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types/_internal.py +++ b/tests/data/expected/main/openapi/use_generic_container_types/_internal.py @@ -5,14 +5,13 @@ from __future__ import annotations from collections.abc import Sequence -from typing import Optional from pydantic import BaseModel from . import models -class OptionalModel(BaseModel): +class Optional(BaseModel): __root__: str @@ -26,39 +25,39 @@ class Error(BaseModel): class Result(BaseModel): - event: Optional[models.Event] = None + event: models.Event | None = None class Source(BaseModel): - country: Optional[str] = None + country: str | None = None class DifferentTea(BaseModel): - foo: Optional[Tea] = None - nested: Optional[Tea_1] = None + foo: Tea | None = None + nested: Tea_1 | None = None class Tea(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None + flavour: str | None = None + id: Id | None = None class Cocoa(BaseModel): - quality: Optional[int] = None + quality: int | None = None class Tea_1(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[Sequence[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: Sequence[Optional] | None = None class TeaClone(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[Sequence[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: Sequence[Optional] | None = None class List(BaseModel): diff --git a/tests/data/expected/main/openapi/use_generic_container_types/collections.py b/tests/data/expected/main/openapi/use_generic_container_types/collections.py index b75ba6c93..3f12a0c8b 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types/collections.py +++ b/tests/data/expected/main/openapi/use_generic_container_types/collections.py @@ -6,7 +6,6 @@ from collections.abc import Sequence from enum import Enum -from typing import Optional from pydantic import AnyUrl, BaseModel, Field @@ -33,19 +32,19 @@ class Stage(Enum): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) - stage: Optional[Stage] = None + stage: Stage | None = None class Apis(BaseModel): diff --git a/tests/data/expected/main/openapi/use_generic_container_types/foo/bar.py b/tests/data/expected/main/openapi/use_generic_container_types/foo/bar.py index b02ab60a7..9ef493d51 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types/foo/bar.py +++ b/tests/data/expected/main/openapi/use_generic_container_types/foo/bar.py @@ -5,22 +5,22 @@ from __future__ import annotations from collections.abc import Mapping, Sequence -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Thing(BaseModel): - attributes: Optional[Mapping[str, Any]] = None + attributes: Mapping[str, Any] | None = None class Thang(BaseModel): - attributes: Optional[Sequence[Mapping[str, Any]]] = None + attributes: Sequence[Mapping[str, Any]] | None = None class Others(BaseModel): - name: Optional[str] = None + name: str | None = None class Clone(Thing): - others: Optional[Others] = None + others: Others | None = None diff --git a/tests/data/expected/main/openapi/use_generic_container_types/models.py b/tests/data/expected/main/openapi/use_generic_container_types/models.py index 9e93649df..8c4bba327 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types/models.py +++ b/tests/data/expected/main/openapi/use_generic_container_types/models.py @@ -6,7 +6,7 @@ from collections.abc import Mapping, Sequence from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel @@ -20,17 +20,15 @@ class Species(Enum): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - species: Optional[Species] = None + tag: str | None = None + species: Species | None = None class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Event(BaseModel): - name: Optional[ - Union[str, float, int, bool, Mapping[str, Any], Sequence[str]] - ] = None + name: str | float | int | bool | Mapping[str, Any] | Sequence[str] | None = None diff --git a/tests/data/expected/main/openapi/use_generic_container_types/woo/boo.py b/tests/data/expected/main/openapi/use_generic_container_types/woo/boo.py index ff24b8606..6564c88fa 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types/woo/boo.py +++ b/tests/data/expected/main/openapi/use_generic_container_types/woo/boo.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .. import bar @@ -13,7 +11,7 @@ class Chocolate(BaseModel): - flavour: Optional[str] = None - source: Optional[Source] = None - cocoa: Optional[Cocoa] = None - field: Optional[bar.FieldModel] = None + flavour: str | None = None + source: Source | None = None + cocoa: Cocoa | None = None + field: bar.FieldModel | None = None diff --git a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/__init__.py b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/__init__.py index 1a2ee19c2..76ac6d5e5 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/__init__.py +++ b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/__init__.py @@ -2,6 +2,6 @@ # filename: modular.yaml # timestamp: 1985-10-26T08:21:00+00:00 -from ._internal import DifferentTea, Error, Id, OptionalModel, Result, Source +from ._internal import DifferentTea, Error, Id, Optional, Result, Source -__all__ = ["DifferentTea", "Error", "Id", "OptionalModel", "Result", "Source"] +__all__ = ["DifferentTea", "Error", "Id", "Optional", "Result", "Source"] diff --git a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/_internal.py b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/_internal.py index 0e6512987..fe851c967 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/_internal.py +++ b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/_internal.py @@ -5,14 +5,13 @@ from __future__ import annotations from collections.abc import Sequence -from typing import Optional from pydantic import BaseModel from . import models -class OptionalModel(BaseModel): +class Optional(BaseModel): __root__: str @@ -26,39 +25,39 @@ class Error(BaseModel): class Result(BaseModel): - event: Optional[models.Event] = None + event: models.Event | None = None class Source(BaseModel): - country: Optional[str] = None + country: str | None = None class DifferentTea(BaseModel): - foo: Optional[Tea] = None - nested: Optional[Tea_1] = None + foo: Tea | None = None + nested: Tea_1 | None = None class Tea(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None + flavour: str | None = None + id: Id | None = None class Cocoa(BaseModel): - quality: Optional[int] = None + quality: int | None = None class Tea_1(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[Sequence[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: Sequence[Optional] | None = None class TeaClone(BaseModel): - flavour: Optional[str] = None - id: Optional[Id] = None - self: Optional[Tea_1] = None - optional: Optional[Sequence[OptionalModel]] = None + flavour: str | None = None + id: Id | None = None + self: Tea_1 | None = None + optional: Sequence[Optional] | None = None class List(BaseModel): diff --git a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/collections.py b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/collections.py index b75ba6c93..3f12a0c8b 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/collections.py +++ b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/collections.py @@ -6,7 +6,6 @@ from collections.abc import Sequence from enum import Enum -from typing import Optional from pydantic import AnyUrl, BaseModel, Field @@ -33,19 +32,19 @@ class Stage(Enum): class Api(BaseModel): - apiKey: Optional[str] = Field( + apiKey: str | None = Field( None, description='To be used as a dataset parameter value' ) - apiVersionNumber: Optional[str] = Field( + apiVersionNumber: str | None = Field( None, description='To be used as a version parameter value' ) - apiUrl: Optional[AnyUrl] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields" ) - apiDocumentationUrl: Optional[AnyUrl] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description='A URL to the API console for each API' ) - stage: Optional[Stage] = None + stage: Stage | None = None class Apis(BaseModel): diff --git a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/foo/bar.py b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/foo/bar.py index b02ab60a7..9ef493d51 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/foo/bar.py +++ b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/foo/bar.py @@ -5,22 +5,22 @@ from __future__ import annotations from collections.abc import Mapping, Sequence -from typing import Any, Optional +from typing import Any from pydantic import BaseModel class Thing(BaseModel): - attributes: Optional[Mapping[str, Any]] = None + attributes: Mapping[str, Any] | None = None class Thang(BaseModel): - attributes: Optional[Sequence[Mapping[str, Any]]] = None + attributes: Sequence[Mapping[str, Any]] | None = None class Others(BaseModel): - name: Optional[str] = None + name: str | None = None class Clone(Thing): - others: Optional[Others] = None + others: Others | None = None diff --git a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/models.py b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/models.py index 9e93649df..8c4bba327 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/models.py +++ b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/models.py @@ -6,7 +6,7 @@ from collections.abc import Mapping, Sequence from enum import Enum -from typing import Any, Optional, Union +from typing import Any from pydantic import BaseModel @@ -20,17 +20,15 @@ class Species(Enum): class Pet(BaseModel): id: int name: str - tag: Optional[str] = None - species: Optional[Species] = None + tag: str | None = None + species: Species | None = None class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Event(BaseModel): - name: Optional[ - Union[str, float, int, bool, Mapping[str, Any], Sequence[str]] - ] = None + name: str | float | int | bool | Mapping[str, Any] | Sequence[str] | None = None diff --git a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/woo/boo.py b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/woo/boo.py index ff24b8606..6564c88fa 100644 --- a/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/woo/boo.py +++ b/tests/data/expected/main/openapi/use_generic_container_types_standard_collections/woo/boo.py @@ -4,8 +4,6 @@ from __future__ import annotations -from typing import Optional - from pydantic import BaseModel from .. import bar @@ -13,7 +11,7 @@ class Chocolate(BaseModel): - flavour: Optional[str] = None - source: Optional[Source] = None - cocoa: Optional[Cocoa] = None - field: Optional[bar.FieldModel] = None + flavour: str | None = None + source: Source | None = None + cocoa: Cocoa | None = None + field: bar.FieldModel | None = None diff --git a/tests/data/expected/main/openapi/with_aliases_msgspec.py b/tests/data/expected/main/openapi/with_aliases_msgspec.py index b6b8f2fea..21f0bbf2a 100644 --- a/tests/data/expected/main/openapi/with_aliases_msgspec.py +++ b/tests/data/expected/main/openapi/with_aliases_msgspec.py @@ -39,22 +39,18 @@ class Error(Struct): class Api(Struct): - apiKey: ( - Annotated[str, Meta(description='To be used as a dataset parameter value')] - | UnsetType - ) = UNSET - apiVersionNumber: ( - Annotated[str, Meta(description='To be used as a version parameter value')] - | UnsetType - ) = UNSET - apiUrl: ( - Annotated[str, Meta(description="The URL describing the dataset's fields")] - | UnsetType - ) = UNSET - apiDocumentationUrl: ( - Annotated[str, Meta(description='A URL to the API console for each API')] - | UnsetType - ) = UNSET + apiKey: Annotated[ + str, Meta(description='To be used as a dataset parameter value') + ] | UnsetType = UNSET + apiVersionNumber: Annotated[ + str, Meta(description='To be used as a version parameter value') + ] | UnsetType = UNSET + apiUrl: Annotated[ + str, Meta(description="The URL describing the dataset's fields") + ] | UnsetType = UNSET + apiDocumentationUrl: Annotated[ + str, Meta(description='A URL to the API console for each API') + ] | UnsetType = UNSET Apis: TypeAlias = list[Api] diff --git a/tests/data/expected/main_kr/pyproject/output.py b/tests/data/expected/main_kr/pyproject/output.py index 2ac1a46ce..a1090e658 100644 --- a/tests/data/expected/main_kr/pyproject/output.py +++ b/tests/data/expected/main_kr/pyproject/output.py @@ -6,8 +6,6 @@ annotations, ) -from typing import Optional - from pydantic import ( AnyUrl, BaseModel, @@ -18,7 +16,7 @@ class Pet(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Pets(BaseModel): @@ -28,7 +26,7 @@ class Pets(BaseModel): class User(BaseModel): id: int name: str - tag: Optional[str] = None + tag: str | None = None class Users(BaseModel): @@ -49,27 +47,19 @@ class Error(BaseModel): class Api(BaseModel): - apiKey: Optional[ - str - ] = Field( + apiKey: str | None = Field( None, description="To be used as a dataset parameter value", ) - apiVersionNumber: Optional[ - str - ] = Field( + apiVersionNumber: str | None = Field( None, description="To be used as a version parameter value", ) - apiUrl: Optional[ - AnyUrl - ] = Field( + apiUrl: AnyUrl | None = Field( None, description="The URL describing the dataset's fields", ) - apiDocumentationUrl: Optional[ - AnyUrl - ] = Field( + apiDocumentationUrl: AnyUrl | None = Field( None, description="A URL to the API console for each API", ) @@ -80,10 +70,8 @@ class Apis(BaseModel): class Event(BaseModel): - name: Optional[str] = None + name: str | None = None class Result(BaseModel): - event: Optional[ - Event - ] = None + event: Event | None = None From e585fb3e3777948881d272903710d630a2d12672 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 19 Dec 2025 19:10:28 +0000 Subject: [PATCH 10/17] docs: update CLI reference documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated by GitHub Actions --- docs/cli-reference/field-customization.md | 34 +++++++++----------- docs/cli-reference/template-customization.md | 15 ++++----- docs/cli-reference/typing-customization.md | 26 +++++++-------- 3 files changed, 32 insertions(+), 43 deletions(-) diff --git a/docs/cli-reference/field-customization.md b/docs/cli-reference/field-customization.md index dfc0515f5..f9a669973 100644 --- a/docs/cli-reference/field-customization.md +++ b/docs/cli-reference/field-customization.md @@ -350,22 +350,18 @@ providing fine-grained control over generated names independent of schema defini class Api(Struct): - apiKey: ( - Annotated[str, Meta(description='To be used as a dataset parameter value')] - | UnsetType - ) = UNSET - apiVersionNumber: ( - Annotated[str, Meta(description='To be used as a version parameter value')] - | UnsetType - ) = UNSET - apiUrl: ( - Annotated[str, Meta(description="The URL describing the dataset's fields")] - | UnsetType - ) = UNSET - apiDocumentationUrl: ( - Annotated[str, Meta(description='A URL to the API console for each API')] - | UnsetType - ) = UNSET + apiKey: Annotated[ + str, Meta(description='To be used as a dataset parameter value') + ] | UnsetType = UNSET + apiVersionNumber: Annotated[ + str, Meta(description='To be used as a version parameter value') + ] | UnsetType = UNSET + apiUrl: Annotated[ + str, Meta(description="The URL describing the dataset's fields") + ] | UnsetType = UNSET + apiDocumentationUrl: Annotated[ + str, Meta(description='A URL to the API console for each API') + ] | UnsetType = UNSET Apis: TypeAlias = list[Api] @@ -3543,9 +3539,9 @@ This is useful when schemas have descriptive titles that should be preserved. class ProcessingTaskTitle(BaseModel): - processing_status_union: ( - ProcessingStatusDetail | ExtendedProcessingTask | ProcessingStatusTitle | None - ) = Field('COMPLETED', title='Processing Status Union Title') + processing_status_union: ProcessingStatusDetail | ExtendedProcessingTask | ProcessingStatusTitle | None = Field( + 'COMPLETED', title='Processing Status Union Title' + ) processing_status: ProcessingStatusTitle | None = 'COMPLETED' name: str | None = None kind: Kind | None = None diff --git a/docs/cli-reference/template-customization.md b/docs/cli-reference/template-customization.md index 5bbaf6986..ec09679c5 100644 --- a/docs/cli-reference/template-customization.md +++ b/docs/cli-reference/template-customization.md @@ -1275,15 +1275,12 @@ The `--disable-timestamp` flag configures the code generation behavior. class Info(BaseModel): - hostName: ( - constr( - regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' - ) - | None - ) = None - arn: ( - constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') | None - ) = None + hostName: constr( + regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' + ) | None = None + arn: constr( + regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$' + ) | None = None tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None comment: constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None ``` diff --git a/docs/cli-reference/typing-customization.md b/docs/cli-reference/typing-customization.md index 0b62baa8f..932613abd 100644 --- a/docs/cli-reference/typing-customization.md +++ b/docs/cli-reference/typing-customization.md @@ -2018,8 +2018,6 @@ in Pydantic models, ensuring values match exactly without automatic conversion. from __future__ import annotations - from typing import Optional - from pydantic import ( BaseModel, Field, @@ -2034,19 +2032,17 @@ in Pydantic models, ensuring values match exactly without automatic conversion. class User(BaseModel): - name: Optional[StrictStr] = Field(None, example='ken') - age: Optional[StrictInt] = None - salary: Optional[conint(ge=0, strict=True)] = None - debt: Optional[conint(le=0, strict=True)] = None - loan: Optional[confloat(le=0.0, strict=True)] = None - tel: Optional[ - constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$', strict=True) - ] = None - height: Optional[confloat(ge=0.0, strict=True)] = None - weight: Optional[confloat(ge=0.0, strict=True)] = None - score: Optional[confloat(ge=1e-08, strict=True)] = None - active: Optional[StrictBool] = None - photo: Optional[StrictBytes] = None + name: StrictStr | None = Field(None, example='ken') + age: StrictInt | None = None + salary: conint(ge=0, strict=True) | None = None + debt: conint(le=0, strict=True) | None = None + loan: confloat(le=0.0, strict=True) | None = None + tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$', strict=True) | None = None + height: confloat(ge=0.0, strict=True) | None = None + weight: confloat(ge=0.0, strict=True) | None = None + score: confloat(ge=1e-08, strict=True) | None = None + active: StrictBool | None = None + photo: StrictBytes | None = None ``` --- From bd3d7de6c0828cbc1dbc08a0aeebe30f871765b9 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 20:08:19 +0000 Subject: [PATCH 11/17] feat: Update type hints to use native union types across multiple files --- .../main/graphql/different_types_of_fields.py | 6 ++-- .../copy_deep_pattern_properties.py | 16 +++++----- ...minator_with_external_reference_msgspec.py | 6 ++-- .../inner_folder/type_2.py | 6 ++-- .../data/expected/main/jsonschema/pattern.py | 15 +++++---- .../pattern_properties_by_reference.py | 6 ++-- .../schema_a.py | 3 +- .../schema_b.py | 3 +- .../shared.py | 5 ++- tests/data/expected/main/jsonschema/titles.py | 6 ++-- .../jsonschema/titles_use_title_as_name.py | 6 ++-- .../without_titles_use_title_as_name.py | 6 ++-- .../main/openapi/collapse_root_models.py | 6 ++-- .../expected/main/openapi/msgspec_nullable.py | 28 ++++++++++------- .../expected/main/openapi/msgspec_struct.py | 28 ++++++++++------- .../main/openapi/msgspec_struct_snake_case.py | 28 ++++++++++------- ...ec_use_annotated_with_field_constraints.py | 31 ++++++++++++------- .../openapi/msgspec_use_union_operator.py | 28 ++++++++++------- .../expected/main/openapi/pattern/general.py | 15 +++++---- .../main/openapi/pattern/msgspec_pattern.py | 22 +++++++------ .../main/openapi/pattern/pydantic_v2.py | 16 ++++++---- .../main/openapi/with_aliases_msgspec.py | 28 ++++++++++------- 22 files changed, 175 insertions(+), 139 deletions(-) diff --git a/tests/data/expected/main/graphql/different_types_of_fields.py b/tests/data/expected/main/graphql/different_types_of_fields.py index daadea3e3..c3843dad2 100644 --- a/tests/data/expected/main/graphql/different_types_of_fields.py +++ b/tests/data/expected/main/graphql/different_types_of_fields.py @@ -33,7 +33,7 @@ class A(BaseModel): optionalListListOptionalField: list[list[String | None]] | None = None optionalListOptionalField: list[String | None] | None = None optionalListOptionalListField: list[list[String] | None] | None = None - optionalListOptionalListOptionalField: list[ - list[String | None] | None - ] | None = None + optionalListOptionalListOptionalField: list[list[String | None] | None] | None = ( + None + ) typename__: Literal['A'] | None = Field('A', alias='__typename') diff --git a/tests/data/expected/main/jsonschema/copy_deep_pattern_properties.py b/tests/data/expected/main/jsonschema/copy_deep_pattern_properties.py index 27e1b691f..0b765327b 100644 --- a/tests/data/expected/main/jsonschema/copy_deep_pattern_properties.py +++ b/tests/data/expected/main/jsonschema/copy_deep_pattern_properties.py @@ -4,35 +4,33 @@ from __future__ import annotations -from typing import Optional - from pydantic import AwareDatetime, BaseModel, Field, constr class MetadataRequest(BaseModel): - tags: Optional[dict[constr(pattern=r'^[a-z][a-z0-9_]*$'), str]] = Field( + tags: dict[constr(pattern=r'^[a-z][a-z0-9_]*$'), str] | None = Field( None, description='Dynamic key-value metadata' ) class Metadata(BaseModel): - tags: Optional[dict[constr(pattern=r'^[a-z][a-z0-9_]*$'), str]] = Field( + tags: dict[constr(pattern=r'^[a-z][a-z0-9_]*$'), str] | None = Field( None, description='Dynamic key-value metadata' ) - created_at: Optional[AwareDatetime] = None + created_at: AwareDatetime | None = None class ExtendedMetadataRequest(BaseModel): - tags: Optional[dict[constr(pattern=r'^[a-z][a-z0-9_]*$'), str]] = Field( + tags: dict[constr(pattern=r'^[a-z][a-z0-9_]*$'), str] | None = Field( None, description='Dynamic key-value metadata' ) - owner: Optional[str] = None + owner: str | None = None class ExtendedMetadata(Metadata): id: int - owner: Optional[str] = None + owner: str | None = None class Model(BaseModel): - metadata: Optional[ExtendedMetadata] = None + metadata: ExtendedMetadata | None = None diff --git a/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py b/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py index a1cd36be9..38d04cf4b 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_external_reference_msgspec.py @@ -14,9 +14,9 @@ class Type1(Struct, tag_field='type_', tag='a'): class Type2(Struct, tag_field='type_', tag='b'): - ref_type: Annotated[ - Type1, Meta(description='A referenced type.') - ] | UnsetType = UNSET + ref_type: Annotated[Type1, Meta(description='A referenced type.')] | UnsetType = ( + UNSET + ) class Type4(Struct, tag_field='type_', tag='d'): diff --git a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py index 5136c8964..d149545c8 100644 --- a/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py +++ b/tests/data/expected/main/jsonschema/discriminator_with_external_references_folder_msgspec/inner_folder/type_2.py @@ -12,6 +12,6 @@ class Type2(Struct, tag_field='type_', tag='b'): - ref_type: Annotated[ - type_1.Type1, Meta(description='A referenced type.') - ] | UnsetType = UNSET + ref_type: ( + Annotated[type_1.Type1, Meta(description='A referenced type.')] | UnsetType + ) = UNSET diff --git a/tests/data/expected/main/jsonschema/pattern.py b/tests/data/expected/main/jsonschema/pattern.py index d969fb3b7..17488b76c 100644 --- a/tests/data/expected/main/jsonschema/pattern.py +++ b/tests/data/expected/main/jsonschema/pattern.py @@ -7,11 +7,14 @@ class Info(BaseModel): - hostName: constr( - regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' - ) | None = None - arn: constr( - regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$' - ) | None = None + hostName: ( + constr( + regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' + ) + | None + ) = None + arn: ( + constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') | None + ) = None tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None comment: constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None diff --git a/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py b/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py index 07589cbb1..6fe79bbd0 100644 --- a/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py +++ b/tests/data/expected/main/jsonschema/pattern_properties_by_reference.py @@ -27,8 +27,8 @@ class SomeschemaSchema(BaseModel): class Config: extra = Extra.forbid - KeyWithExplicitPatternProperties: dict[ - constr(regex=r'^[a-z]{1}[0-9]{1}$'), Any - ] | None = None + KeyWithExplicitPatternProperties: ( + dict[constr(regex=r'^[a-z]{1}[0-9]{1}$'), Any] | None + ) = None KeyWithPatternPropertiesByReference: TextResponse | None = None SomeOtherBoringReference: Stt | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/schema_a.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/schema_a.py index 6fbcce447..a249077dc 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/schema_a.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/schema_a.py @@ -5,7 +5,6 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional from .shared import SharedModel as SharedModel_1 @@ -17,4 +16,4 @@ class SharedModel(SharedModel_1): @dataclass(frozen=True) class Model: - data: Optional[SharedModel] = None + data: SharedModel | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/schema_b.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/schema_b.py index 5f133587c..9b881b6ab 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/schema_b.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/schema_b.py @@ -5,11 +5,10 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional from . import shared @dataclass(frozen=True) class Model: - info: Optional[shared.SharedModel] = None + info: shared.SharedModel | None = None diff --git a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/shared.py b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/shared.py index ffbd85ac9..ad9c3f6fa 100644 --- a/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/shared.py +++ b/tests/data/expected/main/jsonschema/reuse_scope_tree_dataclass_frozen/shared.py @@ -5,10 +5,9 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional @dataclass(frozen=True) class SharedModel: - id: Optional[int] = None - name: Optional[str] = None + id: int | None = None + name: str | None = None diff --git a/tests/data/expected/main/jsonschema/titles.py b/tests/data/expected/main/jsonschema/titles.py index 4099074be..c8fd51eaf 100644 --- a/tests/data/expected/main/jsonschema/titles.py +++ b/tests/data/expected/main/jsonschema/titles.py @@ -45,9 +45,9 @@ class ExtendedProcessingTasks(BaseModel): class ProcessingTask(BaseModel): - processing_status_union: ProcessingStatusUnion | ExtendedProcessingTask | ProcessingStatus | None = Field( - 'COMPLETED', title='Processing Status Union Title' - ) + processing_status_union: ( + ProcessingStatusUnion | ExtendedProcessingTask | ProcessingStatus | None + ) = Field('COMPLETED', title='Processing Status Union Title') processing_status: ProcessingStatus | None = 'COMPLETED' name: str | None = None kind: Kind | None = None diff --git a/tests/data/expected/main/jsonschema/titles_use_title_as_name.py b/tests/data/expected/main/jsonschema/titles_use_title_as_name.py index a243ce107..eb9c9b2bd 100644 --- a/tests/data/expected/main/jsonschema/titles_use_title_as_name.py +++ b/tests/data/expected/main/jsonschema/titles_use_title_as_name.py @@ -45,9 +45,9 @@ class ExtendedProcessingTasksTitle(BaseModel): class ProcessingTaskTitle(BaseModel): - processing_status_union: ProcessingStatusDetail | ExtendedProcessingTask | ProcessingStatusTitle | None = Field( - 'COMPLETED', title='Processing Status Union Title' - ) + processing_status_union: ( + ProcessingStatusDetail | ExtendedProcessingTask | ProcessingStatusTitle | None + ) = Field('COMPLETED', title='Processing Status Union Title') processing_status: ProcessingStatusTitle | None = 'COMPLETED' name: str | None = None kind: Kind | None = None diff --git a/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py b/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py index 8428cb1e0..426939080 100644 --- a/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py +++ b/tests/data/expected/main/jsonschema/without_titles_use_title_as_name.py @@ -41,9 +41,9 @@ class ExtendedProcessingTasks(BaseModel): class ProcessingTask(BaseModel): - processing_status_union: ProcessingStatusUnion | ExtendedProcessingTask | ProcessingStatus | None = ( - 'COMPLETED' - ) + processing_status_union: ( + ProcessingStatusUnion | ExtendedProcessingTask | ProcessingStatus | None + ) = 'COMPLETED' processing_status: ProcessingStatus | None = 'COMPLETED' name: str | None = None kind: Kind | None = None diff --git a/tests/data/expected/main/openapi/collapse_root_models.py b/tests/data/expected/main/openapi/collapse_root_models.py index 61c22ed17..3b32843d4 100644 --- a/tests/data/expected/main/openapi/collapse_root_models.py +++ b/tests/data/expected/main/openapi/collapse_root_models.py @@ -22,9 +22,9 @@ class FileRequest(BaseModel): class ImageRequest(BaseModel): - image_hash: constr( - regex=r'^[a-fA-F\d]{32}$', min_length=64, max_length=64 - ) | None = Field(None, description='For image') + image_hash: ( + constr(regex=r'^[a-fA-F\d]{32}$', min_length=64, max_length=64) | None + ) = Field(None, description='For image') class FileHashes(BaseModel): diff --git a/tests/data/expected/main/openapi/msgspec_nullable.py b/tests/data/expected/main/openapi/msgspec_nullable.py index 0fc7fa9f0..66c469a8a 100644 --- a/tests/data/expected/main/openapi/msgspec_nullable.py +++ b/tests/data/expected/main/openapi/msgspec_nullable.py @@ -29,18 +29,22 @@ class User(Struct): class Api(Struct): - apiKey: Annotated[ - str, Meta(description='To be used as a dataset parameter value') - ] | UnsetType = UNSET - apiVersionNumber: Annotated[ - str, Meta(description='To be used as a version parameter value') - ] | UnsetType = UNSET - apiUrl: Annotated[ - str, Meta(description="The URL describing the dataset's fields") - ] | UnsetType = UNSET - apiDocumentationUrl: Annotated[ - str, Meta(description='A URL to the API console for each API') - ] | UnsetType = UNSET + apiKey: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = UNSET + apiVersionNumber: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = UNSET + apiUrl: ( + Annotated[str, Meta(description="The URL describing the dataset's fields")] + | UnsetType + ) = UNSET + apiDocumentationUrl: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = UNSET Apis: TypeAlias = list[Api] | None diff --git a/tests/data/expected/main/openapi/msgspec_struct.py b/tests/data/expected/main/openapi/msgspec_struct.py index 7f7847316..881e9517b 100644 --- a/tests/data/expected/main/openapi/msgspec_struct.py +++ b/tests/data/expected/main/openapi/msgspec_struct.py @@ -39,18 +39,22 @@ class Error(Struct): class Api(Struct): - apiKey: Annotated[ - str, Meta(description='To be used as a dataset parameter value') - ] | UnsetType = UNSET - apiVersionNumber: Annotated[ - str, Meta(description='To be used as a version parameter value') - ] | UnsetType = UNSET - apiUrl: Annotated[ - str, Meta(description="The URL describing the dataset's fields") - ] | UnsetType = UNSET - apiDocumentationUrl: Annotated[ - str, Meta(description='A URL to the API console for each API') - ] | UnsetType = UNSET + apiKey: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = UNSET + apiVersionNumber: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = UNSET + apiUrl: ( + Annotated[str, Meta(description="The URL describing the dataset's fields")] + | UnsetType + ) = UNSET + apiDocumentationUrl: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = UNSET Apis: TypeAlias = list[Api] diff --git a/tests/data/expected/main/openapi/msgspec_struct_snake_case.py b/tests/data/expected/main/openapi/msgspec_struct_snake_case.py index 77fb5fc34..efca091ba 100644 --- a/tests/data/expected/main/openapi/msgspec_struct_snake_case.py +++ b/tests/data/expected/main/openapi/msgspec_struct_snake_case.py @@ -40,18 +40,22 @@ class Error(Struct): class Api(Struct): - api_key: Annotated[ - str, Meta(description='To be used as a dataset parameter value') - ] | UnsetType = field(name='apiKey', default=UNSET) - api_version_number: Annotated[ - str, Meta(description='To be used as a version parameter value') - ] | UnsetType = field(name='apiVersionNumber', default=UNSET) - api_url: Annotated[ - str, Meta(description="The URL describing the dataset's fields") - ] | UnsetType = field(name='apiUrl', default=UNSET) - api_documentation_url: Annotated[ - str, Meta(description='A URL to the API console for each API') - ] | UnsetType = field(name='apiDocumentationUrl', default=UNSET) + api_key: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = field(name='apiKey', default=UNSET) + api_version_number: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = field(name='apiVersionNumber', default=UNSET) + api_url: ( + Annotated[str, Meta(description="The URL describing the dataset's fields")] + | UnsetType + ) = field(name='apiUrl', default=UNSET) + api_documentation_url: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = field(name='apiDocumentationUrl', default=UNSET) Apis: TypeAlias = list[Api] diff --git a/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py b/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py index f05d2f05c..18d486e5e 100644 --- a/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py +++ b/tests/data/expected/main/openapi/msgspec_use_annotated_with_field_constraints.py @@ -55,18 +55,25 @@ class Error(Struct): class Api(Struct): - apiKey: Annotated[ - str, Meta(description='To be used as a dataset parameter value') - ] | UnsetType = UNSET - apiVersionNumber: Annotated[ - str, Meta(description='To be used as a version parameter value') - ] | UnsetType = UNSET - apiUrl: Annotated[ - str, Meta(description="The URL describing the dataset's fields", min_length=1) - ] | UnsetType = UNSET - apiDocumentationUrl: Annotated[ - str, Meta(description='A URL to the API console for each API') - ] | UnsetType = UNSET + apiKey: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = UNSET + apiVersionNumber: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = UNSET + apiUrl: ( + Annotated[ + str, + Meta(description="The URL describing the dataset's fields", min_length=1), + ] + | UnsetType + ) = UNSET + apiDocumentationUrl: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = UNSET Apis: TypeAlias = list[Api] diff --git a/tests/data/expected/main/openapi/msgspec_use_union_operator.py b/tests/data/expected/main/openapi/msgspec_use_union_operator.py index 0fc7fa9f0..66c469a8a 100644 --- a/tests/data/expected/main/openapi/msgspec_use_union_operator.py +++ b/tests/data/expected/main/openapi/msgspec_use_union_operator.py @@ -29,18 +29,22 @@ class User(Struct): class Api(Struct): - apiKey: Annotated[ - str, Meta(description='To be used as a dataset parameter value') - ] | UnsetType = UNSET - apiVersionNumber: Annotated[ - str, Meta(description='To be used as a version parameter value') - ] | UnsetType = UNSET - apiUrl: Annotated[ - str, Meta(description="The URL describing the dataset's fields") - ] | UnsetType = UNSET - apiDocumentationUrl: Annotated[ - str, Meta(description='A URL to the API console for each API') - ] | UnsetType = UNSET + apiKey: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = UNSET + apiVersionNumber: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = UNSET + apiUrl: ( + Annotated[str, Meta(description="The URL describing the dataset's fields")] + | UnsetType + ) = UNSET + apiDocumentationUrl: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = UNSET Apis: TypeAlias = list[Api] | None diff --git a/tests/data/expected/main/openapi/pattern/general.py b/tests/data/expected/main/openapi/pattern/general.py index efdb37465..0158cb1d6 100644 --- a/tests/data/expected/main/openapi/pattern/general.py +++ b/tests/data/expected/main/openapi/pattern/general.py @@ -8,11 +8,14 @@ class Info(BaseModel): - hostName: constr( - regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' - ) | None = None - arn: constr( - regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$' - ) | None = None + hostName: ( + constr( + regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' + ) + | None + ) = None + arn: ( + constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') | None + ) = None tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None comment: constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None diff --git a/tests/data/expected/main/openapi/pattern/msgspec_pattern.py b/tests/data/expected/main/openapi/pattern/msgspec_pattern.py index a1d7448e9..fb80408ef 100644 --- a/tests/data/expected/main/openapi/pattern/msgspec_pattern.py +++ b/tests/data/expected/main/openapi/pattern/msgspec_pattern.py @@ -11,12 +11,16 @@ class Info(Struct): hostName: str | UnsetType = UNSET - arn: Annotated[ - str, Meta(pattern='(^arn:([^:]*):([^:]*):([^:]*):(|\\*|[\\d]{12}):(.+)$)|^\\*$') - ] | UnsetType = UNSET - tel: Annotated[ - str, Meta(pattern='^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$') - ] | UnsetType = UNSET - comment: Annotated[ - str, Meta(pattern='[^\\b\\f\\n\\r\\t\\\\a+.?\'"|()]+$') - ] | UnsetType = UNSET + arn: ( + Annotated[ + str, + Meta(pattern='(^arn:([^:]*):([^:]*):([^:]*):(|\\*|[\\d]{12}):(.+)$)|^\\*$'), + ] + | UnsetType + ) = UNSET + tel: ( + Annotated[str, Meta(pattern='^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$')] | UnsetType + ) = UNSET + comment: ( + Annotated[str, Meta(pattern='[^\\b\\f\\n\\r\\t\\\\a+.?\'"|()]+$')] | UnsetType + ) = UNSET diff --git a/tests/data/expected/main/openapi/pattern/pydantic_v2.py b/tests/data/expected/main/openapi/pattern/pydantic_v2.py index 60d07994e..7d3ef3535 100644 --- a/tests/data/expected/main/openapi/pattern/pydantic_v2.py +++ b/tests/data/expected/main/openapi/pattern/pydantic_v2.py @@ -8,11 +8,15 @@ class Info(BaseModel): - hostName: constr( - pattern=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])$' - ) | None = None - arn: constr( - pattern=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$' - ) | None = None + hostName: ( + constr( + pattern=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])$' + ) + | None + ) = None + arn: ( + constr(pattern=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') + | None + ) = None tel: constr(pattern=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None comment: constr(pattern=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None diff --git a/tests/data/expected/main/openapi/with_aliases_msgspec.py b/tests/data/expected/main/openapi/with_aliases_msgspec.py index 21f0bbf2a..b6b8f2fea 100644 --- a/tests/data/expected/main/openapi/with_aliases_msgspec.py +++ b/tests/data/expected/main/openapi/with_aliases_msgspec.py @@ -39,18 +39,22 @@ class Error(Struct): class Api(Struct): - apiKey: Annotated[ - str, Meta(description='To be used as a dataset parameter value') - ] | UnsetType = UNSET - apiVersionNumber: Annotated[ - str, Meta(description='To be used as a version parameter value') - ] | UnsetType = UNSET - apiUrl: Annotated[ - str, Meta(description="The URL describing the dataset's fields") - ] | UnsetType = UNSET - apiDocumentationUrl: Annotated[ - str, Meta(description='A URL to the API console for each API') - ] | UnsetType = UNSET + apiKey: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = UNSET + apiVersionNumber: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = UNSET + apiUrl: ( + Annotated[str, Meta(description="The URL describing the dataset's fields")] + | UnsetType + ) = UNSET + apiDocumentationUrl: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = UNSET Apis: TypeAlias = list[Api] From d259fdc32739d37fa6346cebfe853db92e26ff9f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 19 Dec 2025 20:08:46 +0000 Subject: [PATCH 12/17] docs: update CLI reference documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated by GitHub Actions --- docs/cli-reference/field-customization.md | 34 +++++++++++--------- docs/cli-reference/template-customization.md | 15 +++++---- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/docs/cli-reference/field-customization.md b/docs/cli-reference/field-customization.md index f9a669973..dfc0515f5 100644 --- a/docs/cli-reference/field-customization.md +++ b/docs/cli-reference/field-customization.md @@ -350,18 +350,22 @@ providing fine-grained control over generated names independent of schema defini class Api(Struct): - apiKey: Annotated[ - str, Meta(description='To be used as a dataset parameter value') - ] | UnsetType = UNSET - apiVersionNumber: Annotated[ - str, Meta(description='To be used as a version parameter value') - ] | UnsetType = UNSET - apiUrl: Annotated[ - str, Meta(description="The URL describing the dataset's fields") - ] | UnsetType = UNSET - apiDocumentationUrl: Annotated[ - str, Meta(description='A URL to the API console for each API') - ] | UnsetType = UNSET + apiKey: ( + Annotated[str, Meta(description='To be used as a dataset parameter value')] + | UnsetType + ) = UNSET + apiVersionNumber: ( + Annotated[str, Meta(description='To be used as a version parameter value')] + | UnsetType + ) = UNSET + apiUrl: ( + Annotated[str, Meta(description="The URL describing the dataset's fields")] + | UnsetType + ) = UNSET + apiDocumentationUrl: ( + Annotated[str, Meta(description='A URL to the API console for each API')] + | UnsetType + ) = UNSET Apis: TypeAlias = list[Api] @@ -3539,9 +3543,9 @@ This is useful when schemas have descriptive titles that should be preserved. class ProcessingTaskTitle(BaseModel): - processing_status_union: ProcessingStatusDetail | ExtendedProcessingTask | ProcessingStatusTitle | None = Field( - 'COMPLETED', title='Processing Status Union Title' - ) + processing_status_union: ( + ProcessingStatusDetail | ExtendedProcessingTask | ProcessingStatusTitle | None + ) = Field('COMPLETED', title='Processing Status Union Title') processing_status: ProcessingStatusTitle | None = 'COMPLETED' name: str | None = None kind: Kind | None = None diff --git a/docs/cli-reference/template-customization.md b/docs/cli-reference/template-customization.md index ec09679c5..5bbaf6986 100644 --- a/docs/cli-reference/template-customization.md +++ b/docs/cli-reference/template-customization.md @@ -1275,12 +1275,15 @@ The `--disable-timestamp` flag configures the code generation behavior. class Info(BaseModel): - hostName: constr( - regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' - ) | None = None - arn: constr( - regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$' - ) | None = None + hostName: ( + constr( + regex=r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\Z' + ) + | None + ) = None + arn: ( + constr(regex=r'(^arn:([^:]*):([^:]*):([^:]*):(|\*|[\d]{12}):(.+)$)|^\*$') | None + ) = None tel: constr(regex=r'^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$') | None = None comment: constr(regex=r'[^\b\f\n\r\t\\a+.?\'"|()]+$') | None = None ``` From e2a41e829656aa189850ec7ad0ead981c3c85bff Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 20:11:54 +0000 Subject: [PATCH 13/17] feat: Add LEGACY_BLACK_SKIP decorator to JSON Schema test functions --- tests/main/jsonschema/test_main_jsonschema.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/main/jsonschema/test_main_jsonschema.py b/tests/main/jsonschema/test_main_jsonschema.py index a6f004ce6..20f630120 100644 --- a/tests/main/jsonschema/test_main_jsonschema.py +++ b/tests/main/jsonschema/test_main_jsonschema.py @@ -1249,6 +1249,7 @@ def test_main_combined_array(output_file: Path) -> None: ) +@LEGACY_BLACK_SKIP @pytest.mark.cli_doc( options=["--disable-timestamp"], input_schema="jsonschema/pattern.json", @@ -2181,6 +2182,7 @@ def test_jsonschema_pattern_properties_field_constraints(output_file: Path) -> N ) +@LEGACY_BLACK_SKIP def test_jsonschema_titles(output_file: Path) -> None: """Test JSON Schema title handling.""" run_main_and_assert( @@ -2192,6 +2194,7 @@ def test_jsonschema_titles(output_file: Path) -> None: ) +@LEGACY_BLACK_SKIP @pytest.mark.cli_doc( options=["--use-title-as-name"], input_schema="jsonschema/titles.json", @@ -2216,6 +2219,7 @@ def test_jsonschema_titles_use_title_as_name(output_file: Path) -> None: ) +@LEGACY_BLACK_SKIP def test_jsonschema_without_titles_use_title_as_name(output_file: Path) -> None: """Test title as name without titles present.""" run_main_and_assert( From 76c58ba94091c04fca7c6b521a840b881f41b270 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 20:12:30 +0000 Subject: [PATCH 14/17] feat: Add LEGACY_BLACK_SKIP decorator to JSON Schema test functions --- tests/main/jsonschema/test_main_jsonschema.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/main/jsonschema/test_main_jsonschema.py b/tests/main/jsonschema/test_main_jsonschema.py index 20f630120..8902d4418 100644 --- a/tests/main/jsonschema/test_main_jsonschema.py +++ b/tests/main/jsonschema/test_main_jsonschema.py @@ -2645,6 +2645,7 @@ def test_main_disable_warnings(capsys: pytest.CaptureFixture[str], output_file: ) +@LEGACY_BLACK_SKIP def test_main_jsonschema_pattern_properties_by_reference(output_file: Path) -> None: """Test pattern properties by reference.""" run_main_and_assert( From 4b0519fb9b0d990cca3fdc72a07abc9690bb8932 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 22:24:05 +0000 Subject: [PATCH 15/17] feat: Apply LEGACY_BLACK_SKIP decorator to relevant test functions --- tests/main/graphql/test_main_graphql.py | 3 ++- tests/main/openapi/test_main_openapi.py | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/main/graphql/test_main_graphql.py b/tests/main/graphql/test_main_graphql.py index 16a817f01..ed6ef850c 100644 --- a/tests/main/graphql/test_main_graphql.py +++ b/tests/main/graphql/test_main_graphql.py @@ -7,7 +7,7 @@ import black import pytest -from tests.main.conftest import GRAPHQL_DATA_PATH, run_main_and_assert +from tests.main.conftest import GRAPHQL_DATA_PATH, LEGACY_BLACK_SKIP, run_main_and_assert from tests.main.graphql.conftest import assert_file_content if TYPE_CHECKING: @@ -56,6 +56,7 @@ def test_main_graphql_simple_star_wars(output_model: str, expected_output: str, ) +@LEGACY_BLACK_SKIP @pytest.mark.skipif( black.__version__.split(".")[0] == "19", reason="Installed black doesn't support the old style", diff --git a/tests/main/openapi/test_main_openapi.py b/tests/main/openapi/test_main_openapi.py index 0a14ec28e..4ae50416c 100644 --- a/tests/main/openapi/test_main_openapi.py +++ b/tests/main/openapi/test_main_openapi.py @@ -770,9 +770,10 @@ def test_main_without_field_constraints(output_model: str, expected_output: str, "pydantic.BaseModel", "with_aliases.py", ), - ( + pytest.param( "msgspec.Struct", "with_aliases_msgspec.py", + marks=LEGACY_BLACK_SKIP, ), ], ) @@ -1447,6 +1448,7 @@ def test_main_openapi_ref_nullable_strict_nullable(output_file: Path) -> None: ) +@LEGACY_BLACK_SKIP @pytest.mark.parametrize( ("output_model", "expected_output"), [ @@ -1818,6 +1820,7 @@ def test_paths_ref_with_external_schema(output_file: Path) -> None: ) +@LEGACY_BLACK_SKIP @pytest.mark.benchmark @pytest.mark.cli_doc( options=["--collapse-root-models"], @@ -2888,6 +2891,7 @@ def test_main_openapi_all_of_with_relative_ref(output_file: Path) -> None: ) +@LEGACY_BLACK_SKIP def test_main_openapi_msgspec_struct(min_version: str, output_file: Path) -> None: """Test OpenAPI generation with msgspec Struct output.""" run_main_and_assert( @@ -2900,6 +2904,7 @@ def test_main_openapi_msgspec_struct(min_version: str, output_file: Path) -> Non ) +@LEGACY_BLACK_SKIP def test_main_openapi_msgspec_struct_snake_case(min_version: str, output_file: Path) -> None: """Test OpenAPI generation with msgspec Struct and snake case.""" run_main_and_assert( From 6e4ff4fe479dc74502542ca626c693bf01490739 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 22:26:46 +0000 Subject: [PATCH 16/17] feat: Apply LEGACY_BLACK_SKIP decorator to relevant test functions --- tests/main/openapi/test_main_openapi.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/main/openapi/test_main_openapi.py b/tests/main/openapi/test_main_openapi.py index 4ae50416c..5a0a0fe89 100644 --- a/tests/main/openapi/test_main_openapi.py +++ b/tests/main/openapi/test_main_openapi.py @@ -2646,6 +2646,7 @@ def test_main_typed_dict_nullable(output_file: Path) -> None: ) +@LEGACY_BLACK_SKIP @pytest.mark.skipif( version.parse(black.__version__) < version.parse("23.3.0"), reason="Require Black version 23.3.0 or later ", From bec6c8162790dfcbd1407a3cd661aca587efdd95 Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Fri, 19 Dec 2025 22:53:45 +0000 Subject: [PATCH 17/17] feat: Add coverage pragma to type hint method return --- src/datamodel_code_generator/model/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/datamodel_code_generator/model/base.py b/src/datamodel_code_generator/model/base.py index c8d6401f7..1935cfc40 100644 --- a/src/datamodel_code_generator/model/base.py +++ b/src/datamodel_code_generator/model/base.py @@ -227,7 +227,7 @@ def _build_union_type_hint(self) -> str | None: parts = [dt.type_hint for dt in self.data_type.data_types if dt.type_hint] if len(parts) > 1: return f"Union[{', '.join(parts)}]" - return None + return None # pragma: no cover @property def type_hint(self) -> str: # noqa: PLR0911