Skip to content

Commit 9c1b17c

Browse files
Merge pull request #30 from brl0/20210804
Fixes #25, #26, #29
2 parents dbc57f7 + ea19fc1 commit 9c1b17c

File tree

3 files changed

+50
-8
lines changed

3 files changed

+50
-8
lines changed

upath/core.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
1+
from abc import ABCMeta
12
import os
23
import pathlib
34
import urllib
45

56
from fsspec.registry import known_implementations, registry
7+
from fsspec.utils import stringify_path
68

79
from upath.registry import _registry
810

911

10-
class UPath(pathlib.Path):
12+
class UPathMeta(ABCMeta):
13+
def __instancecheck__(cls, instance):
14+
return isinstance(instance, pathlib.Path)
15+
16+
def __subclasscheck__(cls, subclass):
17+
return issubclass(subclass, pathlib.Path)
18+
19+
20+
class UPath(pathlib.Path, metaclass=UPathMeta):
1121
def __new__(cls, *args, **kwargs):
12-
if cls is UPath:
22+
if issubclass(cls, UPath):
1323
args_list = list(args)
1424
url = args_list.pop(0)
25+
url = stringify_path(url)
1526
parsed_url = urllib.parse.urlparse(url)
1627
for key in ["scheme", "netloc"]:
1728
val = kwargs.get(key)
@@ -38,4 +49,6 @@ def __new__(cls, *args, **kwargs):
3849
args = tuple(args_list)
3950
self = cls._from_parts_init(args, init=False)
4051
self._init(*args, **kwargs)
52+
else:
53+
self = super().__new__(*args, **kwargs)
4154
return self

upath/tests/conftest.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import os
22
import tempfile
3-
import shutil
43
from pathlib import Path
54
import subprocess
65
import shlex
@@ -48,15 +47,14 @@ def clear_registry():
4847

4948
@pytest.fixture()
5049
def tempdir(clear_registry):
51-
tempdir = tempfile.TemporaryDirectory()
52-
tempdir = tempdir.name
53-
return tempdir
50+
with tempfile.TemporaryDirectory() as tempdir:
51+
yield tempdir
5452

5553

5654
@pytest.fixture()
5755
def local_testdir(tempdir, clear_registry):
5856
tmp = Path(tempdir)
59-
tmp.mkdir()
57+
tmp.mkdir(exist_ok=True)
6058
folder1 = tmp.joinpath("folder1")
6159
folder1.mkdir()
6260
folder1_files = ["file1.txt", "file2.txt"]
@@ -75,7 +73,6 @@ def local_testdir(tempdir, clear_registry):
7573
yield str(Path(tempdir)).replace("\\", "/")
7674
else:
7775
yield tempdir
78-
shutil.rmtree(tempdir)
7976

8077

8178
@pytest.fixture()

upath/tests/test_core.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import sys
22
import pathlib
33
import warnings
4+
from pathlib import Path
45

56
import pytest
67

@@ -52,3 +53,34 @@ def test_multiple_backend_paths(local_testdir, s3, hdfs):
5253
path = f"hdfs:{local_testdir}"
5354
UPath(path, host=host, user=user, port=port)
5455
assert s3_path.joinpath("text1.txt")._url.scheme == "s3"
56+
57+
58+
def test_constructor_accept_path(local_testdir):
59+
path = UPath(pathlib.Path(local_testdir))
60+
assert str(path) == str(Path(local_testdir))
61+
62+
63+
def test_constructor_accept_upath(local_testdir):
64+
path = UPath(UPath(local_testdir))
65+
assert str(path) == str(Path(local_testdir))
66+
67+
68+
def test_subclass(local_testdir):
69+
class MyPath(UPath):
70+
pass
71+
72+
path = MyPath(local_testdir)
73+
assert str(path) == str(Path(local_testdir))
74+
assert issubclass(MyPath, UPath)
75+
assert isinstance(path, pathlib.Path)
76+
77+
78+
def test_instance_check(local_testdir):
79+
path = UPath(local_testdir)
80+
assert isinstance(path, UPath)
81+
82+
83+
def test_new_method(local_testdir):
84+
path = UPath.__new__(pathlib.Path, local_testdir)
85+
assert str(path) == str(Path(local_testdir))
86+
assert isinstance(path, pathlib.Path)

0 commit comments

Comments
 (0)