diff --git a/AUTHORS.rst b/AUTHORS.rst
index 3bb7ca8..f5c38c0 100644
--- a/AUTHORS.rst
+++ b/AUTHORS.rst
@@ -55,3 +55,4 @@ Contributors (chronological)
 - Jonathan Beezley `@jbeezley <https://github.com/jbeezley>`_
 - David Stapleton `@dstape <https://github.com/DStape>`_
 - Szabolcs Blága `@blagasz <https://github.com/blagasz>`_
+- Andrew Johnson `@andrjohn <https://github.com/andrjohn>`_
diff --git a/src/apispec/ext/marshmallow/openapi.py b/src/apispec/ext/marshmallow/openapi.py
index cd72e3f..f42d503 100644
--- a/src/apispec/ext/marshmallow/openapi.py
+++ b/src/apispec/ext/marshmallow/openapi.py
@@ -163,7 +163,20 @@ class OpenAPIConverter(object):
         :param Field field: A marshmallow field.
         :rtype: dict
         """
-        type_, fmt = self.field_mapping.get(type(field), ("string", None))
+        # If this type isn't directly in the field mapping then check the
+        # hierarchy until we find something that does.
+        for field_class in type(field).__mro__:
+            if field_class in self.field_mapping:
+                type_, fmt = self.field_mapping[field_class]
+                break
+        else:
+            warnings.warn(
+                "Field of type {} does not inherit from marshmallow.Field.".format(
+                    type(field)
+                ),
+                UserWarning,
+            )
+            type_, fmt = "string", None
 
         ret = {"type": type_}
 

Subclassed Lists marked as string type
I am using a tool to generate a Marshmallow schema that I then present as a RESTful API. In order to override some of the methods of marshmallow.fields.List, the generated schema can have generated classes that subclass List. The resulting APISpec is _almost_ perfect because openapi.py mostly uses isinstance to see if the field is a list. For example:

        is_array = isinstance(
            field, (marshmallow.fields.Nested, marshmallow.fields.List)
        )

However, when working out the field type the mapping is looked up using a concrete type:

        self.field_mapping.get(type(field), ("string", None))

It isn't straightforward for me to add the new types using map_to_openapi_type because of the generated nature of my marshmallow and the way the presentation layer is kept separate. However, instead of falling back to `("string", None)`, we can either: fall back to `("array", None)` for instances of a List (and Nested?) either by explicitly checking for those types in `field2type_and_format`; or walking through the field_mapping (in order), checking for instances of each type.
diff --git a/tests/test_ext_marshmallow_openapi.py b/tests/test_ext_marshmallow_openapi.py
index cce5006..68f57bc 100644
--- a/tests/test_ext_marshmallow_openapi.py
+++ b/tests/test_ext_marshmallow_openapi.py
@@ -4,7 +4,6 @@ import re
 import warnings
 
 import pytest
-from pytest import mark
 
 from marshmallow import fields, Schema, validate
 
@@ -15,13 +14,25 @@ from apispec import exceptions, utils, APISpec
 from .utils import get_schemas, build_ref
 
 
+class CustomList(fields.List):
+    pass
+
+
+class CustomStringField(fields.String):
+    pass
+
+
+class CustomIntegerField(fields.Integer):
+    pass
+
+
 class TestMarshmallowFieldToOpenAPI:
     def test_field2choices_preserving_order(self, openapi):
         choices = ["a", "b", "c", "aa", "0", "cc"]
         field = fields.String(validate=validate.OneOf(choices))
         assert openapi.field2choices(field) == {"enum": choices}
 
-    @mark.parametrize(
+    @pytest.mark.parametrize(
         ("FieldClass", "jsontype"),
         [
             (fields.Integer, "integer"),
@@ -40,6 +51,9 @@ class TestMarshmallowFieldToOpenAPI:
             # Assume base Field and Raw are strings
             (fields.Field, "string"),
             (fields.Raw, "string"),
+            # Custom fields inherit types from their parents
+            (CustomStringField, "string"),
+            (CustomIntegerField, "integer"),
         ],
     )
     def test_field2property_type(self, FieldClass, jsontype, openapi):
@@ -47,13 +61,14 @@ class TestMarshmallowFieldToOpenAPI:
         res = openapi.field2property(field)
         assert res["type"] == jsontype
 
-    def test_formatted_field_translates_to_array(self, openapi):
-        field = fields.List(fields.String)
+    @pytest.mark.parametrize("ListClass", [fields.List, CustomList])
+    def test_formatted_field_translates_to_array(self, ListClass, openapi):
+        field = ListClass(fields.String)
         res = openapi.field2property(field)
         assert res["type"] == "array"
         assert res["items"] == openapi.field2property(fields.String())
 
-    @mark.parametrize(
+    @pytest.mark.parametrize(
         ("FieldClass", "expected_format"),
         [
             (fields.Integer, "int32"),
@@ -435,8 +450,9 @@ class TestMarshmallowSchemaToModelDefinition:
 
 
 class TestMarshmallowSchemaToParameters:
-    def test_field_multiple(self, openapi):
-        field = fields.List(fields.Str, location="querystring")
+    @pytest.mark.parametrize("ListClass", [fields.List, CustomList])
+    def test_field_multiple(self, ListClass, openapi):
+        field = ListClass(fields.Str, location="querystring")
         res = openapi.field2parameter(field, name="field")
         assert res["in"] == "query"
         if openapi.openapi_version.major < 3:
@@ -827,83 +843,53 @@ def test_openapi_tools_validate_v3():
         pytest.fail(str(error))
 
 
-class ValidationSchema(Schema):
-    id = fields.Int(dump_only=True)
-    range = fields.Int(validate=validate.Range(min=1, max=10))
-    multiple_ranges = fields.Int(
-        validate=[
-            validate.Range(min=1),
-            validate.Range(min=3),
-            validate.Range(max=10),
-            validate.Range(max=7),
-        ]
-    )
-    list_length = fields.List(fields.Str, validate=validate.Length(min=1, max=10))
-    string_length = fields.Str(validate=validate.Length(min=1, max=10))
-    multiple_lengths = fields.Str(
-        validate=[
-            validate.Length(min=1),
-            validate.Length(min=3),
-            validate.Length(max=10),
-            validate.Length(max=7),
-        ]
-    )
-    equal_length = fields.Str(
-        validate=[validate.Length(equal=5), validate.Length(min=1, max=10)]
-    )
+class TestFieldValidation:
+    class ValidationSchema(Schema):
+        id = fields.Int(dump_only=True)
+        range = fields.Int(validate=validate.Range(min=1, max=10))
+        multiple_ranges = fields.Int(
+            validate=[
+                validate.Range(min=1),
+                validate.Range(min=3),
+                validate.Range(max=10),
+                validate.Range(max=7),
+            ]
+        )
+        list_length = fields.List(fields.Str, validate=validate.Length(min=1, max=10))
+        custom_list_length = CustomList(
+            fields.Str, validate=validate.Length(min=1, max=10)
+        )
+        string_length = fields.Str(validate=validate.Length(min=1, max=10))
+        custom_field_length = CustomStringField(validate=validate.Length(min=1, max=10))
+        multiple_lengths = fields.Str(
+            validate=[
+                validate.Length(min=1),
+                validate.Length(min=3),
+                validate.Length(max=10),
+                validate.Length(max=7),
+            ]
+        )
+        equal_length = fields.Str(
+            validate=[validate.Length(equal=5), validate.Length(min=1, max=10)]
+        )
 
+    @pytest.mark.parametrize(
+        ("field", "properties"),
+        [
+            ("range", {"minimum": 1, "maximum": 10}),
+            ("multiple_ranges", {"minimum": 3, "maximum": 7}),
+            ("list_length", {"minItems": 1, "maxItems": 10}),
+            ("custom_list_length", {"minItems": 1, "maxItems": 10}),
+            ("string_length", {"minLength": 1, "maxLength": 10}),
+            ("custom_field_length", {"minLength": 1, "maxLength": 10}),
+            ("multiple_lengths", {"minLength": 3, "maxLength": 7}),
+            ("equal_length", {"minLength": 5, "maxLength": 5}),
+        ],
+    )
+    def test_properties(self, field, properties, spec):
+        spec.components.schema("Validation", schema=self.ValidationSchema)
+        result = get_schemas(spec)["Validation"]["properties"][field]
 
-class TestFieldValidation:
-    def test_range(self, spec):
-        spec.components.schema("Validation", schema=ValidationSchema)
-        result = get_schemas(spec)["Validation"]["properties"]["range"]
-
-        assert "minimum" in result
-        assert result["minimum"] == 1
-        assert "maximum" in result
-        assert result["maximum"] == 10
-
-    def test_multiple_ranges(self, spec):
-        spec.components.schema("Validation", schema=ValidationSchema)
-        result = get_schemas(spec)["Validation"]["properties"]["multiple_ranges"]
-
-        assert "minimum" in result
-        assert result["minimum"] == 3
-        assert "maximum" in result
-        assert result["maximum"] == 7
-
-    def test_list_length(self, spec):
-        spec.components.schema("Validation", schema=ValidationSchema)
-        result = get_schemas(spec)["Validation"]["properties"]["list_length"]
-
-        assert "minItems" in result
-        assert result["minItems"] == 1
-        assert "maxItems" in result
-        assert result["maxItems"] == 10
-
-    def test_string_length(self, spec):
-        spec.components.schema("Validation", schema=ValidationSchema)
-        result = get_schemas(spec)["Validation"]["properties"]["string_length"]
-
-        assert "minLength" in result
-        assert result["minLength"] == 1
-        assert "maxLength" in result
-        assert result["maxLength"] == 10
-
-    def test_multiple_lengths(self, spec):
-        spec.components.schema("Validation", schema=ValidationSchema)
-        result = get_schemas(spec)["Validation"]["properties"]["multiple_lengths"]
-
-        assert "minLength" in result
-        assert result["minLength"] == 3
-        assert "maxLength" in result
-        assert result["maxLength"] == 7
-
-    def test_equal_length(self, spec):
-        spec.components.schema("Validation", schema=ValidationSchema)
-        result = get_schemas(spec)["Validation"]["properties"]["equal_length"]
-
-        assert "minLength" in result
-        assert result["minLength"] == 5
-        assert "maxLength" in result
-        assert result["maxLength"] == 5
+        for attr, expected_value in properties.items():
+            assert attr in result
+            assert result[attr] == expected_value

pip install -e .[dev]
parse_log_pytest
pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/marshmallow-code/apispec.git@aca2ec378e67e4541cef7fc7a7fec0e0c2a9587e#egg=apispec
aspy.yaml==1.3.0
attrs==25.3.0
cachetools==5.5.2
certifi==2025.1.31
cfgv==3.4.0
chardet==5.2.0
charset-normalizer==3.4.1
colorama==0.4.6
distlib==0.3.9
entrypoints==0.3
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
filelock==3.18.0
flake8==3.7.7
flake8-bugbear==19.3.0
identify==2.6.9
idna==3.10
importlib_metadata==8.6.1
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
jsonschema==4.17.3
jsonschema-spec==0.1.6
lazy-object-proxy==1.10.0
marshmallow==2.19.2
mccabe==0.6.1
mock==5.2.0
nodeenv==1.9.1
openapi-schema-validator==0.4.4
openapi-spec-validator==0.5.7
packaging @ file:///croot/packaging_1734472117206/work
pathable==0.4.4
platformdirs==4.3.7
pluggy @ file:///croot/pluggy_1733169602837/work
prance==23.6.21.0
pre-commit==1.15.2
pycodestyle==2.5.0
pyflakes==2.1.1
pyproject-api==1.9.0
pyrsistent==0.20.0
pytest @ file:///croot/pytest_1738938843180/work
PyYAML==6.0.2
requests==2.32.3
rfc3339-validator==0.1.4
ruamel.yaml==0.18.10
ruamel.yaml.clib==0.2.12
six==1.17.0
toml==0.10.2
tomli==2.2.1
tox==4.25.0
typing_extensions==4.13.0
urllib3==2.3.0
virtualenv==20.29.3
zipp==3.21.0

name: apispec
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - aspy-yaml==1.3.0
      - attrs==25.3.0
      - cachetools==5.5.2
      - certifi==2025.1.31
      - cfgv==3.4.0
      - chardet==5.2.0
      - charset-normalizer==3.4.1
      - colorama==0.4.6
      - distlib==0.3.9
      - entrypoints==0.3
      - filelock==3.18.0
      - flake8==3.7.7
      - flake8-bugbear==19.3.0
      - identify==2.6.9
      - idna==3.10
      - importlib-metadata==8.6.1
      - jsonschema==4.17.3
      - jsonschema-spec==0.1.6
      - lazy-object-proxy==1.10.0
      - marshmallow==2.19.2
      - mccabe==0.6.1
      - mock==5.2.0
      - nodeenv==1.9.1
      - openapi-schema-validator==0.4.4
      - openapi-spec-validator==0.5.7
      - pathable==0.4.4
      - platformdirs==4.3.7
      - prance==23.6.21.0
      - pre-commit==1.15.2
      - pycodestyle==2.5.0
      - pyflakes==2.1.1
      - pyproject-api==1.9.0
      - pyrsistent==0.20.0
      - pyyaml==6.0.2
      - requests==2.32.3
      - rfc3339-validator==0.1.4
      - ruamel-yaml==0.18.10
      - ruamel-yaml-clib==0.2.12
      - six==1.17.0
      - toml==0.10.2
      - tomli==2.2.1
      - tox==4.25.0
      - typing-extensions==4.13.0
      - urllib3==2.3.0
      - virtualenv==20.29.3
      - zipp==3.21.0
prefix: /opt/conda/envs/apispec

tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-CustomIntegerField-integer] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-CustomIntegerField-integer] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_formatted_field_translates_to_array[2.0-CustomList] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_formatted_field_translates_to_array[3.0.0-CustomList] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_field_multiple[2.0-CustomList] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_field_multiple[3.0.0-CustomList]
tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2choices_preserving_order[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2choices_preserving_order[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-Integer-integer] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-Number-number] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-Float-number] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-String-string0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-String-string1] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-Boolean-boolean0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-Boolean-boolean1] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-UUID-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-DateTime-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-Date-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-Time-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-Email-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-Url-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-Field-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-Raw-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[2.0-CustomStringField-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-Integer-integer] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-Number-number] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-Float-number] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-String-string0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-String-string1] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-Boolean-boolean0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-Boolean-boolean1] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-UUID-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-DateTime-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-Date-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-Time-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-Email-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-Url-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-Field-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-Raw-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_type[3.0.0-CustomStringField-string] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_formatted_field_translates_to_array[2.0-List] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_formatted_field_translates_to_array[3.0.0-List] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[2.0-Integer-int32] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[2.0-Float-float] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[2.0-UUID-uuid] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[2.0-DateTime-date-time] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[2.0-Date-date] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[2.0-Email-email] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[2.0-Url-url] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[3.0.0-Integer-int32] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[3.0.0-Float-float] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[3.0.0-UUID-uuid] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[3.0.0-DateTime-date-time] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[3.0.0-Date-date] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[3.0.0-Email-email] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field2property_formats[3.0.0-Url-url] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_description[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_description[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_missing[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_missing[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_boolean_false_missing[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_boolean_false_missing[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_missing_load[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_missing_load[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_boolean_false_missing_load[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_boolean_false_missing_load[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_missing_callable[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_missing_callable[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_doc_default[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_doc_default[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_doc_default_and_missing[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_doc_default_and_missing[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_with_missing_load[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_with_missing_load[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_with_location[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_with_location[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_with_multiple_json_locations[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields2parameters_does_not_modify_metadata[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields2parameters_does_not_modify_metadata[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_location_mapping[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_location_mapping[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_default_location_mapping[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_default_location_mapping[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_default_location_mapping_if_schema_many[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_with_dump_only[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_fields_with_dump_only[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_choices[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_choices[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_equal[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_equal[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_only_allows_valid_properties_in_metadata[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_only_allows_valid_properties_in_metadata[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_choices_multiple[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_choices_multiple[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_additional_metadata[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_additional_metadata[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_allow_none[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_allow_none[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_str_regex[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_str_regex[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_pattern_obj_regex[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_pattern_obj_regex[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_no_pattern[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_no_pattern[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_multiple_patterns[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowFieldToOpenAPI::test_field_with_multiple_patterns[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_invalid_schema[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_invalid_schema[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_schema2jsonschema_with_explicit_fields[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_schema2jsonschema_with_explicit_fields[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_schema2jsonschema_override_name_ma2[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_schema2jsonschema_override_name_ma2[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_required_fields[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_required_fields[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_partial[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_partial[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_no_required_fields[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_no_required_fields[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_title_and_description_may_be_added[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_title_and_description_may_be_added[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_excluded_fields[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_excluded_fields[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_only_explicitly_declared_fields_are_translated[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_only_explicitly_declared_fields_are_translated[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_observed_field_name_for_required_field[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_observed_field_name_for_required_field[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_schema_instance_inspection[2.0-True] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_schema_instance_inspection[2.0-False] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_schema_instance_inspection[3.0.0-True] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_schema_instance_inspection[3.0.0-False] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_raises_error_if_no_declared_fields[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToModelDefinition::test_raises_error_if_no_declared_fields[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_field_multiple[2.0-List] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_field_multiple[3.0.0-List] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_field_required[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_field_required[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_invalid_schema[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_invalid_schema[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_schema_body[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_schema_body_with_dump_only[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_schema_body_many[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_schema_query[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_schema_query[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_schema_query_instance[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_schema_query_instance[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_schema_query_instance_many_should_raise_exception[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_schema_query_instance_many_should_raise_exception[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_fields_default_in_body[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_fields_query[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_fields_query[3.0.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_raises_error_if_not_a_schema[2.0] tests/test_ext_marshmallow_openapi.py::TestMarshmallowSchemaToParameters::test_raises_error_if_not_a_schema[3.0.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_field2property_nested_spec_metadatas[2.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_field2property_nested_spec_metadatas[3.0.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_field2property_nested_spec[2.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_field2property_nested_spec[3.0.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_field2property_nested_many_spec[2.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_field2property_nested_many_spec[3.0.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_field2property_nested_ref[2.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_field2property_nested_ref[3.0.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_field2property_nested_many[2.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_field2property_nested_many[3.0.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_schema2jsonschema_with_nested_fields[2.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_schema2jsonschema_with_nested_fields[3.0.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_schema2jsonschema_with_nested_fields_only_exclude[2.0-only] tests/test_ext_marshmallow_openapi.py::TestNesting::test_schema2jsonschema_with_nested_fields_only_exclude[2.0-exclude] tests/test_ext_marshmallow_openapi.py::TestNesting::test_schema2jsonschema_with_nested_fields_only_exclude[3.0.0-only] tests/test_ext_marshmallow_openapi.py::TestNesting::test_schema2jsonschema_with_nested_fields_only_exclude[3.0.0-exclude] tests/test_ext_marshmallow_openapi.py::TestNesting::test_schema2jsonschema_with_nested_fields_with_adhoc_changes[2.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_schema2jsonschema_with_nested_fields_with_adhoc_changes[3.0.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_schema2jsonschema_with_nested_excluded_fields[2.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_schema2jsonschema_with_nested_excluded_fields[3.0.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_nested_field_with_property[2.0] tests/test_ext_marshmallow_openapi.py::TestNesting::test_nested_field_with_property[3.0.0] tests/test_ext_marshmallow_openapi.py::test_openapi_tools_validate_v2 tests/test_ext_marshmallow_openapi.py::test_openapi_tools_validate_v3 tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[2.0-range-properties0] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[2.0-multiple_ranges-properties1] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[2.0-list_length-properties2] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[2.0-custom_list_length-properties3] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[2.0-string_length-properties4] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[2.0-custom_field_length-properties5] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[2.0-multiple_lengths-properties6] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[2.0-equal_length-properties7] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[3.0.0-range-properties0] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[3.0.0-multiple_ranges-properties1] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[3.0.0-list_length-properties2] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[3.0.0-custom_list_length-properties3] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[3.0.0-string_length-properties4] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[3.0.0-custom_field_length-properties5] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[3.0.0-multiple_lengths-properties6] tests/test_ext_marshmallow_openapi.py::TestFieldValidation::test_properties[3.0.0-equal_length-properties7]
AUTHORS.rst src/apispec/ext/marshmallow/openapi.py
AUTHORS.rst src/apispec/ext/marshmallow/openapi.py