Skip to content

Add support for DeepFriedMarshmallow - #328

Draft
illusional wants to merge 4 commits into
masterfrom
support-deepfriedmarshmallow
Draft

illusional wants to merge 4 commits into
masterfrom
support-deepfriedmarshmallow

Add support for deepfried-marshmallow

a1e0759
Select commit
Loading
Failed to load commit list.
Sign in for the full log view
GitHub Actions / JUnit Report python3.12 'marshmallow>4.2.0' flask=='2.3.*' werkzeug=='2.3.*' failed Feb 3, 2026 in 0s

125 tests run, 122 passed, 1 skipped, 2 failed.

Annotations

Check failure on line 283 in tests/swagger_generation/test_swagger_generator.py

See this annotation in the file changed.

@github-actions github-actions / JUnit Report python3.12 'marshmallow>4.2.0' flask=='2.3.*' werkzeug=='2.3.*'

test_swagger_generator.test_swagger_generators[registry8-swagger_generator8-expected_swagger8]

assert '{\n  "consum...er": "2.0"\n}' == '{\n  "consum...er": "2.0"\n}'
    {
      "consumes": [
        "application/json"
      ],
      "definitions": {
        "AlbumSchema": {
          "additionalProperties": false,
          "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema.",
          "properties": {
            "artist": {
              "$ref": "#/definitions/ArtistSchema"
            },
            "release_date": {
              "format": "date",
              "type": "string"
            },
            "title": {
              "type": "string"
            }
          },
          "title": "AlbumSchema",
          "type": "object"
        },
        "AlbumUpdateSchema": {
          "additionalProperties": false,
          "description": "Schema for updating album - partial fields.",
          "properties": {
            "title": {
              "type": "string"
            }
          },
          "title": "AlbumUpdateSchema",
          "type": "object"
        },
        "ArtistSchema": {
          "additionalProperties": false,
          "description": "Artist schema using DeepFriedMarshmallow's JitSchema.",
          "properties": {
            "name": {
              "type": "string"
            }
          },
          "title": "ArtistSchema",
          "type": "object"
        },
        "CompressedSheetText": {
          "additionalProperties": false,
          "description": "Schema with List field to test deepcopy recursion fix.",
          "properties": {
            "frame": {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            "sheet": {
              "format": "uuid",
              "type": "string"
            },
            "text": {
              "type": "string"
            }
          },
          "required": [
  -         "frame",
            "sheet",
  -         "text"
  +         "text",
  ?               +
  +         "frame"
          ],
          "title": "CompressedSheetText",
          "type": "object"
        },
        "Error": {
          "additionalProperties": false,
          "properties": {
            "errors": {
              "type": "object"
            },
            "message": {
              "type": "string"
            }
          },
          "required": [
            "message"
          ],
          "title": "Error",
          "type": "object"
        }
      },
      "host": "localhost",
      "info": {
        "description": "",
        "title": "My API",
        "version": "1.0.0"
      },
      "paths": {
        "/albums/{album_uid}": {
          "get": {
            "description": "Get an album by UID",
            "operationId": "get_album",
            "parameters": [
              {
                "in": "header",
                "name": "X-UserId",
                "required": true,
                "type": "string"
              }
            ],
            "responses": {
              "200": {
                "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema.",
                "schema": {
                  "$ref": "#/definitions/AlbumSchema"
                }
              },
              "default": {
                "description": "Error",
                "schema": {
                  "$ref": "#/definitions/Error"
                }
              }
            }
          },
          "parameters": [
            {
              "in": "path",
              "name": "album_uid",
              "required": true,
              "type": "string"
            }
          ],
          "patch": {
            "description": "Update an album",
            "operationId": "update_album",
            "parameters": [
              {
                "in": "body",
                "name": "AlbumUpdateSchema",
                "required": true,
                "schema": {
                  "$ref": "#/definitions/AlbumUpdateSchema"
                }
              }
            ],
            "responses": {
              "200": {
                "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema.",
                "schema": {
                  "$ref": "#/definitions/AlbumSchema"
                }
              },
              "default": {
                "description": "Error",
                "schema": {
                  "$ref": "#/definitions/Error"
                }
              }
            },
            "security": [
              {
                "sharedSecret": []
              }
            ]
          }
        },
        "/artists/{artist_uid}": {
          "get": {
            "description": "Get an artist by UID",
            "operationId": "get_artist",
            "responses": {
              "200": {
                "description": "Artist schema using DeepFriedMarshmallow's JitSchema.",
                "schema": {
                  "$ref": "#/definitions/ArtistSchema"
                }
              },
              "default": {
                "description": "Error",
                "schema": {
                  "$ref": "#/definitions/Error"
                }
              }
            },
            "security": []
          },
          "parameters": [
            {
              "in": "path",
              "name": "artist_uid",
              "required": true,
              "type": "string"
            }
          ]
        },
        "/sheets": {
          "get": {
            "description": "Get multiple sheets - tests List field with many=True",
            "operationId": "get_sheets",
            "responses": {
              "200": {
                "description": "Schema with List field to test deepcopy recursion fix.",
                "schema": {
                  "items": {
                    "$ref": "#/definitions/CompressedSheetText"
                  },
                  "type": "array"
                }
              },
              "default": {
                "description": "Error",
                "schema": {
                  "$ref": "#/definitions/Error"
                }
              }
            }
          }
        }
      },
      "produces": [
        "application/json"
      ],
      "schemes": [],
      "security": [
        {
          "default": []
        }
      ],
      "securityDefinitions": {
        "default": {
          "in": "header",
          "name": "x-another",
          "type": "apiKey"
        },
        "sharedSecret": {
          "in": "header",
          "name": "x-auth",
          "type": "apiKey"
        }
      },
      "swagger": "2.0"
    }
Raw output
registry = <flask_rebar.rebar.HandlerRegistry object at 0x7f053a4b71a0>
swagger_generator = <flask_rebar.swagger_generation.swagger_generator_v2.SwaggerV2Generator object at 0x7f053a4b7a10>
expected_swagger = {'consumes': ['application/json'], 'definitions': {'AlbumSchema': {'additionalProperties': False, 'description': "Albu...et', 'text'], ...}, ...}, 'host': 'localhost', 'info': {'description': '', 'title': 'My API', 'version': '1.0.0'}, ...}

    @pytest.mark.parametrize(
        "registry, swagger_generator, expected_swagger",
        [
            (legacy.registry, legacy.swagger_v2_generator, legacy.EXPECTED_SWAGGER_V2),
            (legacy.registry, legacy.swagger_v3_generator, legacy.EXPECTED_SWAGGER_V3),
            (
                exploded_query_string.registry,
                exploded_query_string.swagger_v2_generator,
                exploded_query_string.EXPECTED_SWAGGER_V2,
            ),
            (
                exploded_query_string.registry,
                exploded_query_string.swagger_v3_generator,
                exploded_query_string.EXPECTED_SWAGGER_V3,
            ),
            (
                multiple_authenticators.registry,
                multiple_authenticators.swagger_v2_generator,
                multiple_authenticators.EXPECTED_SWAGGER_V2,
            ),
            (
                multiple_authenticators.registry,
                multiple_authenticators.swagger_v3_generator,
                multiple_authenticators.EXPECTED_SWAGGER_V3,
            ),
            (
                marshmallow_objects.registry,
                marshmallow_objects.swagger_v2_generator,
                marshmallow_objects.EXPECTED_SWAGGER_V2,
            ),
            (
                marshmallow_objects.registry,
                marshmallow_objects.swagger_v3_generator,
                marshmallow_objects.EXPECTED_SWAGGER_V3,
            ),
            (
                deepfried_marshmallow.registry,
                deepfried_marshmallow.swagger_v2_generator,
                deepfried_marshmallow.EXPECTED_SWAGGER_V2,
            ),
            (
                deepfried_marshmallow.registry,
                deepfried_marshmallow.swagger_v3_generator,
                deepfried_marshmallow.EXPECTED_SWAGGER_V3,
            ),
        ],
    )
    def test_swagger_generators(registry, swagger_generator, expected_swagger):
        open_api_version = swagger_generator.get_open_api_version()
        if open_api_version == "2.0":
            swagger_jsonschema = SWAGGER_V2_JSONSCHEMA
        elif open_api_version == "3.1.0":
            swagger_jsonschema = SWAGGER_V3_JSONSCHEMA
        else:
            raise ValueError(f"Unknown swagger_version: {open_api_version}")
    
        validate_swagger(expected_swagger, schema=swagger_jsonschema)
    
        swagger = swagger_generator.generate(registry)
    
        result = json.dumps(swagger, indent=2, sort_keys=True)
        expected = json.dumps(expected_swagger, indent=2, sort_keys=True)
    
>       assert result == expected
E       assert '{\n  "consum...er": "2.0"\n}' == '{\n  "consum...er": "2.0"\n}'
E           {
E             "consumes": [
E               "application/json"
E             ],
E             "definitions": {
E               "AlbumSchema": {
E                 "additionalProperties": false,
E                 "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema.",
E                 "properties": {
E                   "artist": {
E                     "$ref": "#/definitions/ArtistSchema"
E                   },
E                   "release_date": {
E                     "format": "date",
E                     "type": "string"
E                   },
E                   "title": {
E                     "type": "string"
E                   }
E                 },
E                 "title": "AlbumSchema",
E                 "type": "object"
E               },
E               "AlbumUpdateSchema": {
E                 "additionalProperties": false,
E                 "description": "Schema for updating album - partial fields.",
E                 "properties": {
E                   "title": {
E                     "type": "string"
E                   }
E                 },
E                 "title": "AlbumUpdateSchema",
E                 "type": "object"
E               },
E               "ArtistSchema": {
E                 "additionalProperties": false,
E                 "description": "Artist schema using DeepFriedMarshmallow's JitSchema.",
E                 "properties": {
E                   "name": {
E                     "type": "string"
E                   }
E                 },
E                 "title": "ArtistSchema",
E                 "type": "object"
E               },
E               "CompressedSheetText": {
E                 "additionalProperties": false,
E                 "description": "Schema with List field to test deepcopy recursion fix.",
E                 "properties": {
E                   "frame": {
E                     "items": {
E                       "type": "number"
E                     },
E                     "type": "array"
E                   },
E                   "sheet": {
E                     "format": "uuid",
E                     "type": "string"
E                   },
E                   "text": {
E                     "type": "string"
E                   }
E                 },
E                 "required": [
E         -         "frame",
E                   "sheet",
E         -         "text"
E         +         "text",
E         ?               +
E         +         "frame"
E                 ],
E                 "title": "CompressedSheetText",
E                 "type": "object"
E               },
E               "Error": {
E                 "additionalProperties": false,
E                 "properties": {
E                   "errors": {
E                     "type": "object"
E                   },
E                   "message": {
E                     "type": "string"
E                   }
E                 },
E                 "required": [
E                   "message"
E                 ],
E                 "title": "Error",
E                 "type": "object"
E               }
E             },
E             "host": "localhost",
E             "info": {
E               "description": "",
E               "title": "My API",
E               "version": "1.0.0"
E             },
E             "paths": {
E               "/albums/{album_uid}": {
E                 "get": {
E                   "description": "Get an album by UID",
E                   "operationId": "get_album",
E                   "parameters": [
E                     {
E                       "in": "header",
E                       "name": "X-UserId",
E                       "required": true,
E                       "type": "string"
E                     }
E                   ],
E                   "responses": {
E                     "200": {
E                       "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema.",
E                       "schema": {
E                         "$ref": "#/definitions/AlbumSchema"
E                       }
E                     },
E                     "default": {
E                       "description": "Error",
E                       "schema": {
E                         "$ref": "#/definitions/Error"
E                       }
E                     }
E                   }
E                 },
E                 "parameters": [
E                   {
E                     "in": "path",
E                     "name": "album_uid",
E                     "required": true,
E                     "type": "string"
E                   }
E                 ],
E                 "patch": {
E                   "description": "Update an album",
E                   "operationId": "update_album",
E                   "parameters": [
E                     {
E                       "in": "body",
E                       "name": "AlbumUpdateSchema",
E                       "required": true,
E                       "schema": {
E                         "$ref": "#/definitions/AlbumUpdateSchema"
E                       }
E                     }
E                   ],
E                   "responses": {
E                     "200": {
E                       "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema.",
E                       "schema": {
E                         "$ref": "#/definitions/AlbumSchema"
E                       }
E                     },
E                     "default": {
E                       "description": "Error",
E                       "schema": {
E                         "$ref": "#/definitions/Error"
E                       }
E                     }
E                   },
E                   "security": [
E                     {
E                       "sharedSecret": []
E                     }
E                   ]
E                 }
E               },
E               "/artists/{artist_uid}": {
E                 "get": {
E                   "description": "Get an artist by UID",
E                   "operationId": "get_artist",
E                   "responses": {
E                     "200": {
E                       "description": "Artist schema using DeepFriedMarshmallow's JitSchema.",
E                       "schema": {
E                         "$ref": "#/definitions/ArtistSchema"
E                       }
E                     },
E                     "default": {
E                       "description": "Error",
E                       "schema": {
E                         "$ref": "#/definitions/Error"
E                       }
E                     }
E                   },
E                   "security": []
E                 },
E                 "parameters": [
E                   {
E                     "in": "path",
E                     "name": "artist_uid",
E                     "required": true,
E                     "type": "string"
E                   }
E                 ]
E               },
E               "/sheets": {
E                 "get": {
E                   "description": "Get multiple sheets - tests List field with many=True",
E                   "operationId": "get_sheets",
E                   "responses": {
E                     "200": {
E                       "description": "Schema with List field to test deepcopy recursion fix.",
E                       "schema": {
E                         "items": {
E                           "$ref": "#/definitions/CompressedSheetText"
E                         },
E                         "type": "array"
E                       }
E                     },
E                     "default": {
E                       "description": "Error",
E                       "schema": {
E                         "$ref": "#/definitions/Error"
E                       }
E                     }
E                   }
E                 }
E               }
E             },
E             "produces": [
E               "application/json"
E             ],
E             "schemes": [],
E             "security": [
E               {
E                 "default": []
E               }
E             ],
E             "securityDefinitions": {
E               "default": {
E                 "in": "header",
E                 "name": "x-another",
E                 "type": "apiKey"
E               },
E               "sharedSecret": {
E                 "in": "header",
E                 "name": "x-auth",
E                 "type": "apiKey"
E               }
E             },
E             "swagger": "2.0"
E           }

tests/swagger_generation/test_swagger_generator.py:283: AssertionError

Check failure on line 283 in tests/swagger_generation/test_swagger_generator.py

See this annotation in the file changed.

@github-actions github-actions / JUnit Report python3.12 'marshmallow>4.2.0' flask=='2.3.*' werkzeug=='2.3.*'

test_swagger_generator.test_swagger_generators[registry9-swagger_generator9-expected_swagger9]

assert '{\n  "compon...    }\n  ]\n}' == '{\n  "compon...    }\n  ]\n}'
    {
      "components": {
        "schemas": {
          "AlbumSchema": {
            "additionalProperties": false,
            "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema.",
            "properties": {
              "artist": {
                "$ref": "#/components/schemas/ArtistSchema"
              },
              "release_date": {
                "format": "date",
                "type": "string"
              },
              "title": {
                "type": "string"
              }
            },
            "title": "AlbumSchema",
            "type": "object"
          },
          "AlbumUpdateSchema": {
            "additionalProperties": false,
            "description": "Schema for updating album - partial fields.",
            "properties": {
              "title": {
                "type": "string"
              }
            },
            "title": "AlbumUpdateSchema",
            "type": "object"
          },
          "ArtistSchema": {
            "additionalProperties": false,
            "description": "Artist schema using DeepFriedMarshmallow's JitSchema.",
            "properties": {
              "name": {
                "type": "string"
              }
            },
            "title": "ArtistSchema",
            "type": "object"
          },
          "CompressedSheetText": {
            "additionalProperties": false,
            "description": "Schema with List field to test deepcopy recursion fix.",
            "properties": {
              "frame": {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              "sheet": {
                "format": "uuid",
                "type": "string"
              },
              "text": {
                "type": "string"
              }
            },
            "required": [
  -           "frame",
              "sheet",
  -           "text"
  +           "text",
  ?                 +
  +           "frame"
            ],
            "title": "CompressedSheetText",
            "type": "object"
          },
          "Error": {
            "additionalProperties": false,
            "properties": {
              "errors": {
                "type": "object"
              },
              "message": {
                "type": "string"
              }
            },
            "required": [
              "message"
            ],
            "title": "Error",
            "type": "object"
          }
        },
        "securitySchemes": {
          "default": {
            "in": "header",
            "name": "x-another",
            "type": "apiKey"
          },
          "sharedSecret": {
            "in": "header",
            "name": "x-auth",
            "type": "apiKey"
          }
        }
      },
      "info": {
        "description": "",
        "title": "My API",
        "version": "1.0.0"
      },
      "openapi": "3.1.0",
      "paths": {
        "/albums/{album_uid}": {
          "get": {
            "description": "Get an album by UID",
            "operationId": "get_album",
            "parameters": [
              {
                "in": "header",
                "name": "X-UserId",
                "required": true,
                "schema": {
                  "type": "string"
                }
              }
            ],
            "responses": {
              "200": {
                "content": {
                  "application/json": {
                    "schema": {
                      "$ref": "#/components/schemas/AlbumSchema"
                    }
                  }
                },
                "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema."
              },
              "default": {
                "content": {
                  "application/json": {
                    "schema": {
                      "$ref": "#/components/schemas/Error"
                    }
                  }
                },
                "description": "Error"
              }
            }
          },
          "parameters": [
            {
              "in": "path",
              "name": "album_uid",
              "required": true,
              "schema": {
                "type": "string"
              },
              "style": "simple"
            }
          ],
          "patch": {
            "description": "Update an album",
            "operationId": "update_album",
            "requestBody": {
              "content": {
                "application/json": {
                  "schema": {
                    "$ref": "#/components/schemas/AlbumUpdateSchema"
                  }
                }
              },
              "required": true
            },
            "responses": {
              "200": {
                "content": {
                  "application/json": {
                    "schema": {
                      "$ref": "#/components/schemas/AlbumSchema"
                    }
                  }
                },
                "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema."
              },
              "default": {
                "content": {
                  "application/json": {
                    "schema": {
                      "$ref": "#/components/schemas/Error"
                    }
                  }
                },
                "description": "Error"
              }
            },
            "security": [
              {
                "sharedSecret": []
              }
            ]
          }
        },
        "/artists/{artist_uid}": {
          "get": {
            "description": "Get an artist by UID",
            "operationId": "get_artist",
            "responses": {
              "200": {
                "content": {
                  "application/json": {
                    "schema": {
                      "$ref": "#/components/schemas/ArtistSchema"
                    }
                  }
                },
                "description": "Artist schema using DeepFriedMarshmallow's JitSchema."
              },
              "default": {
                "content": {
                  "application/json": {
                    "schema": {
                      "$ref": "#/components/schemas/Error"
                    }
                  }
                },
                "description": "Error"
              }
            },
            "security": []
          },
          "parameters": [
            {
              "in": "path",
              "name": "artist_uid",
              "required": true,
              "schema": {
                "type": "string"
              },
              "style": "simple"
            }
          ]
        },
        "/sheets": {
          "get": {
            "description": "Get multiple sheets - tests List field with many=True",
            "operationId": "get_sheets",
            "responses": {
              "200": {
                "content": {
                  "application/json": {
                    "schema": {
                      "items": {
                        "$ref": "#/components/schemas/CompressedSheetText"
                      },
                      "type": "array"
                    }
                  }
                },
                "description": "Schema with List field to test deepcopy recursion fix."
              },
              "default": {
                "content": {
                  "application/json": {
                    "schema": {
                      "$ref": "#/components/schemas/Error"
                    }
                  }
                },
                "description": "Error"
              }
            }
          }
        }
      },
      "security": [
        {
          "default": []
        }
      ]
    }
Raw output
registry = <flask_rebar.rebar.HandlerRegistry object at 0x7f053a4b71a0>
swagger_generator = <flask_rebar.swagger_generation.swagger_generator_v3.SwaggerV3Generator object at 0x7f053a4b6ae0>
expected_swagger = {'components': {'schemas': {'AlbumSchema': {'additionalProperties': False, 'description': "Album schema using DeepFrie...hema with List field to test deepcopy recursion fix.'}, 'default': {'content': {...}, 'description': 'Error'}}}}}, ...}

    @pytest.mark.parametrize(
        "registry, swagger_generator, expected_swagger",
        [
            (legacy.registry, legacy.swagger_v2_generator, legacy.EXPECTED_SWAGGER_V2),
            (legacy.registry, legacy.swagger_v3_generator, legacy.EXPECTED_SWAGGER_V3),
            (
                exploded_query_string.registry,
                exploded_query_string.swagger_v2_generator,
                exploded_query_string.EXPECTED_SWAGGER_V2,
            ),
            (
                exploded_query_string.registry,
                exploded_query_string.swagger_v3_generator,
                exploded_query_string.EXPECTED_SWAGGER_V3,
            ),
            (
                multiple_authenticators.registry,
                multiple_authenticators.swagger_v2_generator,
                multiple_authenticators.EXPECTED_SWAGGER_V2,
            ),
            (
                multiple_authenticators.registry,
                multiple_authenticators.swagger_v3_generator,
                multiple_authenticators.EXPECTED_SWAGGER_V3,
            ),
            (
                marshmallow_objects.registry,
                marshmallow_objects.swagger_v2_generator,
                marshmallow_objects.EXPECTED_SWAGGER_V2,
            ),
            (
                marshmallow_objects.registry,
                marshmallow_objects.swagger_v3_generator,
                marshmallow_objects.EXPECTED_SWAGGER_V3,
            ),
            (
                deepfried_marshmallow.registry,
                deepfried_marshmallow.swagger_v2_generator,
                deepfried_marshmallow.EXPECTED_SWAGGER_V2,
            ),
            (
                deepfried_marshmallow.registry,
                deepfried_marshmallow.swagger_v3_generator,
                deepfried_marshmallow.EXPECTED_SWAGGER_V3,
            ),
        ],
    )
    def test_swagger_generators(registry, swagger_generator, expected_swagger):
        open_api_version = swagger_generator.get_open_api_version()
        if open_api_version == "2.0":
            swagger_jsonschema = SWAGGER_V2_JSONSCHEMA
        elif open_api_version == "3.1.0":
            swagger_jsonschema = SWAGGER_V3_JSONSCHEMA
        else:
            raise ValueError(f"Unknown swagger_version: {open_api_version}")
    
        validate_swagger(expected_swagger, schema=swagger_jsonschema)
    
        swagger = swagger_generator.generate(registry)
    
        result = json.dumps(swagger, indent=2, sort_keys=True)
        expected = json.dumps(expected_swagger, indent=2, sort_keys=True)
    
>       assert result == expected
E       assert '{\n  "compon...    }\n  ]\n}' == '{\n  "compon...    }\n  ]\n}'
E           {
E             "components": {
E               "schemas": {
E                 "AlbumSchema": {
E                   "additionalProperties": false,
E                   "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema.",
E                   "properties": {
E                     "artist": {
E                       "$ref": "#/components/schemas/ArtistSchema"
E                     },
E                     "release_date": {
E                       "format": "date",
E                       "type": "string"
E                     },
E                     "title": {
E                       "type": "string"
E                     }
E                   },
E                   "title": "AlbumSchema",
E                   "type": "object"
E                 },
E                 "AlbumUpdateSchema": {
E                   "additionalProperties": false,
E                   "description": "Schema for updating album - partial fields.",
E                   "properties": {
E                     "title": {
E                       "type": "string"
E                     }
E                   },
E                   "title": "AlbumUpdateSchema",
E                   "type": "object"
E                 },
E                 "ArtistSchema": {
E                   "additionalProperties": false,
E                   "description": "Artist schema using DeepFriedMarshmallow's JitSchema.",
E                   "properties": {
E                     "name": {
E                       "type": "string"
E                     }
E                   },
E                   "title": "ArtistSchema",
E                   "type": "object"
E                 },
E                 "CompressedSheetText": {
E                   "additionalProperties": false,
E                   "description": "Schema with List field to test deepcopy recursion fix.",
E                   "properties": {
E                     "frame": {
E                       "items": {
E                         "type": "number"
E                       },
E                       "type": "array"
E                     },
E                     "sheet": {
E                       "format": "uuid",
E                       "type": "string"
E                     },
E                     "text": {
E                       "type": "string"
E                     }
E                   },
E                   "required": [
E         -           "frame",
E                     "sheet",
E         -           "text"
E         +           "text",
E         ?                 +
E         +           "frame"
E                   ],
E                   "title": "CompressedSheetText",
E                   "type": "object"
E                 },
E                 "Error": {
E                   "additionalProperties": false,
E                   "properties": {
E                     "errors": {
E                       "type": "object"
E                     },
E                     "message": {
E                       "type": "string"
E                     }
E                   },
E                   "required": [
E                     "message"
E                   ],
E                   "title": "Error",
E                   "type": "object"
E                 }
E               },
E               "securitySchemes": {
E                 "default": {
E                   "in": "header",
E                   "name": "x-another",
E                   "type": "apiKey"
E                 },
E                 "sharedSecret": {
E                   "in": "header",
E                   "name": "x-auth",
E                   "type": "apiKey"
E                 }
E               }
E             },
E             "info": {
E               "description": "",
E               "title": "My API",
E               "version": "1.0.0"
E             },
E             "openapi": "3.1.0",
E             "paths": {
E               "/albums/{album_uid}": {
E                 "get": {
E                   "description": "Get an album by UID",
E                   "operationId": "get_album",
E                   "parameters": [
E                     {
E                       "in": "header",
E                       "name": "X-UserId",
E                       "required": true,
E                       "schema": {
E                         "type": "string"
E                       }
E                     }
E                   ],
E                   "responses": {
E                     "200": {
E                       "content": {
E                         "application/json": {
E                           "schema": {
E                             "$ref": "#/components/schemas/AlbumSchema"
E                           }
E                         }
E                       },
E                       "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema."
E                     },
E                     "default": {
E                       "content": {
E                         "application/json": {
E                           "schema": {
E                             "$ref": "#/components/schemas/Error"
E                           }
E                         }
E                       },
E                       "description": "Error"
E                     }
E                   }
E                 },
E                 "parameters": [
E                   {
E                     "in": "path",
E                     "name": "album_uid",
E                     "required": true,
E                     "schema": {
E                       "type": "string"
E                     },
E                     "style": "simple"
E                   }
E                 ],
E                 "patch": {
E                   "description": "Update an album",
E                   "operationId": "update_album",
E                   "requestBody": {
E                     "content": {
E                       "application/json": {
E                         "schema": {
E                           "$ref": "#/components/schemas/AlbumUpdateSchema"
E                         }
E                       }
E                     },
E                     "required": true
E                   },
E                   "responses": {
E                     "200": {
E                       "content": {
E                         "application/json": {
E                           "schema": {
E                             "$ref": "#/components/schemas/AlbumSchema"
E                           }
E                         }
E                       },
E                       "description": "Album schema using DeepFriedMarshmallow's JitSchema with nested schema."
E                     },
E                     "default": {
E                       "content": {
E                         "application/json": {
E                           "schema": {
E                             "$ref": "#/components/schemas/Error"
E                           }
E                         }
E                       },
E                       "description": "Error"
E                     }
E                   },
E                   "security": [
E                     {
E                       "sharedSecret": []
E                     }
E                   ]
E                 }
E               },
E               "/artists/{artist_uid}": {
E                 "get": {
E                   "description": "Get an artist by UID",
E                   "operationId": "get_artist",
E                   "responses": {
E                     "200": {
E                       "content": {
E                         "application/json": {
E                           "schema": {
E                             "$ref": "#/components/schemas/ArtistSchema"
E                           }
E                         }
E                       },
E                       "description": "Artist schema using DeepFriedMarshmallow's JitSchema."
E                     },
E                     "default": {
E                       "content": {
E                         "application/json": {
E                           "schema": {
E                             "$ref": "#/components/schemas/Error"
E                           }
E                         }
E                       },
E                       "description": "Error"
E                     }
E                   },
E                   "security": []
E                 },
E                 "parameters": [
E                   {
E                     "in": "path",
E                     "name": "artist_uid",
E                     "required": true,
E                     "schema": {
E                       "type": "string"
E                     },
E                     "style": "simple"
E                   }
E                 ]
E               },
E               "/sheets": {
E                 "get": {
E                   "description": "Get multiple sheets - tests List field with many=True",
E                   "operationId": "get_sheets",
E                   "responses": {
E                     "200": {
E                       "content": {
E                         "application/json": {
E                           "schema": {
E                             "items": {
E                               "$ref": "#/components/schemas/CompressedSheetText"
E                             },
E                             "type": "array"
E                           }
E                         }
E                       },
E                       "description": "Schema with List field to test deepcopy recursion fix."
E                     },
E                     "default": {
E                       "content": {
E                         "application/json": {
E                           "schema": {
E                             "$ref": "#/components/schemas/Error"
E                           }
E                         }
E                       },
E                       "description": "Error"
E                     }
E                   }
E                 }
E               }
E             },
E             "security": [
E               {
E                 "default": []
E               }
E             ]
E           }

tests/swagger_generation/test_swagger_generator.py:283: AssertionError