]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
:bug: Fix path encoding (#978)
authorPatrick McKenna <patrick.b.mckenna@gmail.com>
Sun, 16 Feb 2020 20:06:41 +0000 (12:06 -0800)
committerGitHub <noreply@github.com>
Sun, 16 Feb 2020 20:06:41 +0000 (21:06 +0100)
fastapi/encoders.py
tests/test_jsonable_encoder.py

index cb94a91a73d8ed8300209824fac88d83b1520433..ae4794bae8d948f3809e04729df6e548775e16e3 100644 (file)
@@ -1,4 +1,5 @@
 from enum import Enum
+from pathlib import PurePath
 from types import GeneratorType
 from typing import Any, Callable, Dict, List, Set, Tuple, Union
 
@@ -73,6 +74,8 @@ def jsonable_encoder(
         )
     if isinstance(obj, Enum):
         return obj.value
+    if isinstance(obj, PurePath):
+        return str(obj)
     if isinstance(obj, (str, int, float, type(None))):
         return obj
     if isinstance(obj, dict):
index 97fbf6e6de7178d51dc528ea6af2f833400f236c..f94771aaeed94ed8bdca1853635e226bf73c1f6d 100644 (file)
@@ -1,9 +1,10 @@
 from datetime import datetime, timezone
 from enum import Enum
+from pathlib import PurePath, PurePosixPath, PureWindowsPath
 
 import pytest
 from fastapi.encoders import jsonable_encoder
-from pydantic import BaseModel, ValidationError
+from pydantic import BaseModel, ValidationError, create_model
 
 try:
     from pydantic import Field
@@ -69,6 +70,19 @@ class ModelWithAlias(BaseModel):
     foo: str = Field(..., alias="Foo")
 
 
+@pytest.fixture(
+    name="model_with_path", params=[PurePath, PurePosixPath, PureWindowsPath]
+)
+def fixture_model_with_path(request):
+    class Config:
+        arbitrary_types_allowed = True
+
+    ModelWithPath = create_model(
+        "ModelWithPath", path=(request.param, ...), __config__=Config
+    )
+    return ModelWithPath(path=request.param("/foo", "bar"))
+
+
 def test_encode_class():
     person = Person(name="Foo")
     pet = Pet(owner=person, name="Firulais")
@@ -120,3 +134,11 @@ def test_custom_encoders():
         instance, custom_encoder={safe_datetime: lambda o: o.isoformat()}
     )
     assert encoded_instance["dt_field"] == instance.dt_field.isoformat()
+
+
+def test_encode_model_with_path(model_with_path):
+    if isinstance(model_with_path.path, PureWindowsPath):
+        expected = "\\foo\\bar"
+    else:
+        expected = "/foo/bar"
+    assert jsonable_encoder(model_with_path) == {"path": expected}