summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-07-15 14:15:24 (GMT)
committerGitHub <noreply@github.com>2023-07-15 14:15:24 (GMT)
commit060f58d877d738cc8659194f82864985f08a94ef (patch)
treeb3f501b3c26a4e54bab8340f70c90b687d3528d6 /Lib/test
parente99b69c5aea1aed6e3ea5f550b07698291fc8aeb (diff)
downloadcpython-060f58d877d738cc8659194f82864985f08a94ef.zip
cpython-060f58d877d738cc8659194f82864985f08a94ef.tar.gz
cpython-060f58d877d738cc8659194f82864985f08a94ef.tar.bz2
[3.12] gh-106752: Sync with zipp 3.16.2 (GH-106757) (#106777)
gh-106752: Sync with zipp 3.16.2 (GH-106757) * gh-106752: Sync with zipp 3.16.2 * Add blurb (cherry picked from commit 22980dc7c9dcec4b74fea815542601ef582c230e) Co-authored-by: Jason R. Coombs <jaraco@jaraco.com>
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_zipfile/_path/test_complexity.py81
-rw-r--r--Lib/test/test_zipfile/_path/test_path.py70
-rw-r--r--Lib/test/test_zipfile/_path/write-alpharep.py4
3 files changed, 146 insertions, 9 deletions
diff --git a/Lib/test/test_zipfile/_path/test_complexity.py b/Lib/test/test_zipfile/_path/test_complexity.py
index 3432dc3..7050937 100644
--- a/Lib/test/test_zipfile/_path/test_complexity.py
+++ b/Lib/test/test_zipfile/_path/test_complexity.py
@@ -1,5 +1,9 @@
-import unittest
+import io
+import itertools
+import math
+import re
import string
+import unittest
import zipfile
from ._functools import compose
@@ -9,9 +13,11 @@ from ._support import import_or_skip
big_o = import_or_skip('big_o')
+pytest = import_or_skip('pytest')
class TestComplexity(unittest.TestCase):
+ @pytest.mark.flaky
def test_implied_dirs_performance(self):
best, others = big_o.big_o(
compose(consume, zipfile.CompleteDirs._implied_dirs),
@@ -22,3 +28,76 @@ class TestComplexity(unittest.TestCase):
min_n=1,
)
assert best <= big_o.complexities.Linear
+
+ def make_zip_path(self, depth=1, width=1) -> zipfile.Path:
+ """
+ Construct a Path with width files at every level of depth.
+ """
+ zf = zipfile.ZipFile(io.BytesIO(), mode='w')
+ pairs = itertools.product(self.make_deep_paths(depth), self.make_names(width))
+ for path, name in pairs:
+ zf.writestr(f"{path}{name}.txt", b'')
+ zf.filename = "big un.zip"
+ return zipfile.Path(zf)
+
+ @classmethod
+ def make_names(cls, width, letters=string.ascii_lowercase):
+ """
+ >>> list(TestComplexity.make_names(2))
+ ['a', 'b']
+ >>> list(TestComplexity.make_names(30))
+ ['aa', 'ab', ..., 'bd']
+ """
+ # determine how many products are needed to produce width
+ n_products = math.ceil(math.log(width, len(letters)))
+ inputs = (letters,) * n_products
+ combinations = itertools.product(*inputs)
+ names = map(''.join, combinations)
+ return itertools.islice(names, width)
+
+ @classmethod
+ def make_deep_paths(cls, depth):
+ return map(cls.make_deep_path, range(depth))
+
+ @classmethod
+ def make_deep_path(cls, depth):
+ return ''.join(('d/',) * depth)
+
+ def test_baseline_regex_complexity(self):
+ best, others = big_o.big_o(
+ lambda path: re.fullmatch(r'[^/]*\\.txt', path),
+ self.make_deep_path,
+ max_n=100,
+ min_n=1,
+ )
+ assert best <= big_o.complexities.Constant
+
+ @pytest.mark.flaky
+ def test_glob_depth(self):
+ best, others = big_o.big_o(
+ lambda path: consume(path.glob('*.txt')),
+ self.make_zip_path,
+ max_n=100,
+ min_n=1,
+ )
+ assert best <= big_o.complexities.Quadratic
+
+ @pytest.mark.flaky
+ def test_glob_width(self):
+ best, others = big_o.big_o(
+ lambda path: consume(path.glob('*.txt')),
+ lambda size: self.make_zip_path(width=size),
+ max_n=100,
+ min_n=1,
+ )
+ assert best <= big_o.complexities.Linear
+
+ @pytest.mark.flaky
+ def test_glob_width_and_depth(self):
+ best, others = big_o.big_o(
+ lambda path: consume(path.glob('*.txt')),
+ lambda size: self.make_zip_path(depth=size, width=size),
+ max_n=10,
+ min_n=1,
+ )
+ assert best <= big_o.complexities.Linear
diff --git a/Lib/test/test_zipfile/_path/test_path.py b/Lib/test/test_zipfile/_path/test_path.py
index aff91e5..c66cb3c 100644
--- a/Lib/test/test_zipfile/_path/test_path.py
+++ b/Lib/test/test_zipfile/_path/test_path.py
@@ -41,9 +41,13 @@ def build_alpharep_fixture():
│ ├── d
│ │ └── e.txt
│ └── f.txt
- └── g
- └── h
- └── i.txt
+ ├── g
+ │ └── h
+ │ └── i.txt
+ └── j
+ ├── k.bin
+ ├── l.baz
+ └── m.bar
This fixture has the following key characteristics:
@@ -51,6 +55,7 @@ def build_alpharep_fixture():
- a file two levels deep (b/d/e)
- multiple files in a directory (b/c, b/f)
- a directory containing only a directory (g/h)
+ - a directory with files of different extensions (j/klm)
"alpha" because it uses alphabet
"rep" because it's a representative example
@@ -62,6 +67,9 @@ def build_alpharep_fixture():
zf.writestr("b/d/e.txt", b"content of e")
zf.writestr("b/f.txt", b"content of f")
zf.writestr("g/h/i.txt", b"content of i")
+ zf.writestr("j/k.bin", b"content of k")
+ zf.writestr("j/l.baz", b"content of l")
+ zf.writestr("j/m.bar", b"content of m")
zf.filename = "alpharep.zip"
return zf
@@ -92,7 +100,7 @@ class TestPath(unittest.TestCase):
def test_iterdir_and_types(self, alpharep):
root = zipfile.Path(alpharep)
assert root.is_dir()
- a, b, g = root.iterdir()
+ a, b, g, j = root.iterdir()
assert a.is_file()
assert b.is_dir()
assert g.is_dir()
@@ -112,7 +120,7 @@ class TestPath(unittest.TestCase):
@pass_alpharep
def test_iterdir_on_file(self, alpharep):
root = zipfile.Path(alpharep)
- a, b, g = root.iterdir()
+ a, b, g, j = root.iterdir()
with self.assertRaises(ValueError):
a.iterdir()
@@ -127,7 +135,7 @@ class TestPath(unittest.TestCase):
@pass_alpharep
def test_open(self, alpharep):
root = zipfile.Path(alpharep)
- a, b, g = root.iterdir()
+ a, b, g, j = root.iterdir()
with a.open(encoding="utf-8") as strm:
data = strm.read()
self.assertEqual(data, "content of a")
@@ -229,7 +237,7 @@ class TestPath(unittest.TestCase):
@pass_alpharep
def test_read(self, alpharep):
root = zipfile.Path(alpharep)
- a, b, g = root.iterdir()
+ a, b, g, j = root.iterdir()
assert a.read_text(encoding="utf-8") == "content of a"
# Also check positional encoding arg (gh-101144).
assert a.read_text("utf-8") == "content of a"
@@ -295,7 +303,7 @@ class TestPath(unittest.TestCase):
reflect that change.
"""
root = zipfile.Path(alpharep)
- a, b, g = root.iterdir()
+ a, b, g, j = root.iterdir()
alpharep.writestr('foo.txt', 'foo')
alpharep.writestr('bar/baz.txt', 'baz')
assert any(child.name == 'foo.txt' for child in root.iterdir())
@@ -395,6 +403,13 @@ class TestPath(unittest.TestCase):
assert e.suffixes == []
@pass_alpharep
+ def test_suffix_no_filename(self, alpharep):
+ alpharep.filename = None
+ root = zipfile.Path(alpharep)
+ assert root.joinpath('example').suffix == ""
+ assert root.joinpath('example').suffixes == []
+
+ @pass_alpharep
def test_stem(self, alpharep):
"""
The final path component, without its suffix
@@ -411,6 +426,8 @@ class TestPath(unittest.TestCase):
d = root / "d"
assert d.stem == "d"
+ assert (root / ".gitignore").stem == ".gitignore"
+
@pass_alpharep
def test_root_parent(self, alpharep):
root = zipfile.Path(alpharep)
@@ -442,12 +459,49 @@ class TestPath(unittest.TestCase):
assert not root.match("*.txt")
assert list(root.glob("b/c.*")) == [zipfile.Path(alpharep, "b/c.txt")]
+ assert list(root.glob("b/*.txt")) == [
+ zipfile.Path(alpharep, "b/c.txt"),
+ zipfile.Path(alpharep, "b/f.txt"),
+ ]
+ @pass_alpharep
+ def test_glob_recursive(self, alpharep):
+ root = zipfile.Path(alpharep)
files = root.glob("**/*.txt")
assert all(each.match("*.txt") for each in files)
assert list(root.glob("**/*.txt")) == list(root.rglob("*.txt"))
+ @pass_alpharep
+ def test_glob_subdirs(self, alpharep):
+ root = zipfile.Path(alpharep)
+
+ assert list(root.glob("*/i.txt")) == []
+ assert list(root.rglob("*/i.txt")) == [zipfile.Path(alpharep, "g/h/i.txt")]
+
+ @pass_alpharep
+ def test_glob_does_not_overmatch_dot(self, alpharep):
+ root = zipfile.Path(alpharep)
+
+ assert list(root.glob("*.xt")) == []
+
+ @pass_alpharep
+ def test_glob_single_char(self, alpharep):
+ root = zipfile.Path(alpharep)
+
+ assert list(root.glob("a?txt")) == [zipfile.Path(alpharep, "a.txt")]
+ assert list(root.glob("a[.]txt")) == [zipfile.Path(alpharep, "a.txt")]
+ assert list(root.glob("a[?]txt")) == []
+
+ @pass_alpharep
+ def test_glob_chars(self, alpharep):
+ root = zipfile.Path(alpharep)
+
+ assert list(root.glob("j/?.b[ai][nz]")) == [
+ zipfile.Path(alpharep, "j/k.bin"),
+ zipfile.Path(alpharep, "j/l.baz"),
+ ]
+
def test_glob_empty(self):
root = zipfile.Path(zipfile.ZipFile(io.BytesIO(), 'w'))
with self.assertRaises(ValueError):
diff --git a/Lib/test/test_zipfile/_path/write-alpharep.py b/Lib/test/test_zipfile/_path/write-alpharep.py
new file mode 100644
index 0000000..48c09b5
--- /dev/null
+++ b/Lib/test/test_zipfile/_path/write-alpharep.py
@@ -0,0 +1,4 @@
+from . import test_path
+
+
+__name__ == '__main__' and test_path.build_alpharep_fixture().extractall('alpharep')