annotate Lib/pathlib.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents b5e9d61f6987
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
87348
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1 import fnmatch
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
2 import functools
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
3 import io
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
4 import ntpath
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
5 import os
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
6 import posixpath
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
7 import re
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
8 import sys
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
9 import weakref
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
10 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
11 import threading
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
12 except ImportError:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
13 import dummy_threading as threading
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
14
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
15 from collections import Sequence, defaultdict
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
16 from contextlib import contextmanager
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
17 from errno import EINVAL, ENOENT
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
18 from itertools import chain, count
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
19 from operator import attrgetter
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
20 from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
21 from urllib.parse import quote as urlquote, quote_from_bytes as urlquote_from_bytes
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
22
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
23
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
24 supports_symlinks = True
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
25 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
26 import nt
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
27 except ImportError:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
28 nt = None
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
29 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
30 if sys.getwindowsversion()[:2] >= (6, 0):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
31 from nt import _getfinalpathname
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
32 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
33 supports_symlinks = False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
34 _getfinalpathname = None
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
35
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
36
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
37 __all__ = [
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
38 "PurePath", "PurePosixPath", "PureWindowsPath",
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
39 "Path", "PosixPath", "WindowsPath",
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
40 ]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
41
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
42 #
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
43 # Internals
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
44 #
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
45
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
46 def _is_wildcard_pattern(pat):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
47 # Whether this pattern needs actual matching using fnmatch, or can
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
48 # be looked up directly as a file.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
49 return "*" in pat or "?" in pat or "[" in pat
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
50
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
51
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
52 class _Flavour(object):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
53 """A flavour implements a particular (platform-specific) set of path
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
54 semantics."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
55
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
56 def __init__(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
57 self.join = self.sep.join
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
58
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
59 def parse_parts(self, parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
60 parsed = []
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
61 sep = self.sep
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
62 altsep = self.altsep
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
63 drv = root = ''
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
64 it = reversed(parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
65 for part in it:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
66 if not part:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
67 continue
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
68 if altsep:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
69 part = part.replace(altsep, sep)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
70 drv, root, rel = self.splitroot(part)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
71 if sep in rel:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
72 for x in reversed(rel.split(sep)):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
73 if x and x != '.':
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
74 parsed.append(sys.intern(x))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
75 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
76 if rel and rel != '.':
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
77 parsed.append(sys.intern(rel))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
78 if drv or root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
79 if not drv:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
80 # If no drive is present, try to find one in the previous
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
81 # parts. This makes the result of parsing e.g.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
82 # ("C:", "/", "a") reasonably intuitive.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
83 for part in it:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
84 drv = self.splitroot(part)[0]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
85 if drv:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
86 break
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
87 break
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
88 if drv or root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
89 parsed.append(drv + root)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
90 parsed.reverse()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
91 return drv, root, parsed
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
92
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
93 def join_parsed_parts(self, drv, root, parts, drv2, root2, parts2):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
94 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
95 Join the two paths represented by the respective
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
96 (drive, root, parts) tuples. Return a new (drive, root, parts) tuple.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
97 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
98 if root2:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
99 parts = parts2
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
100 root = root2
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
101 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
102 parts = parts + parts2
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
103 # XXX raise error if drv and drv2 are different?
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
104 return drv2 or drv, root, parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
105
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
106
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
107 class _WindowsFlavour(_Flavour):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
108 # Reference for Windows paths can be found at
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
109 # http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
110
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
111 sep = '\\'
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
112 altsep = '/'
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
113 has_drv = True
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
114 pathmod = ntpath
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
115
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
116 is_supported = (nt is not None)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
117
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
118 drive_letters = (
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
119 set(chr(x) for x in range(ord('a'), ord('z') + 1)) |
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
120 set(chr(x) for x in range(ord('A'), ord('Z') + 1))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
121 )
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
122 ext_namespace_prefix = '\\\\?\\'
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
123
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
124 reserved_names = (
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
125 {'CON', 'PRN', 'AUX', 'NUL'} |
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
126 {'COM%d' % i for i in range(1, 10)} |
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
127 {'LPT%d' % i for i in range(1, 10)}
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
128 )
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
129
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
130 # Interesting findings about extended paths:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
131 # - '\\?\c:\a', '//?/c:\a' and '//?/c:/a' are all supported
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
132 # but '\\?\c:/a' is not
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
133 # - extended paths are always absolute; "relative" extended paths will
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
134 # fail.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
135
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
136 def splitroot(self, part, sep=sep):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
137 first = part[0:1]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
138 second = part[1:2]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
139 if (second == sep and first == sep):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
140 # XXX extended paths should also disable the collapsing of "."
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
141 # components (according to MSDN docs).
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
142 prefix, part = self._split_extended_path(part)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
143 first = part[0:1]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
144 second = part[1:2]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
145 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
146 prefix = ''
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
147 third = part[2:3]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
148 if (second == sep and first == sep and third != sep):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
149 # is a UNC path:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
150 # vvvvvvvvvvvvvvvvvvvvv root
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
151 # \\machine\mountpoint\directory\etc\...
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
152 # directory ^^^^^^^^^^^^^^
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
153 index = part.find(sep, 2)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
154 if index != -1:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
155 index2 = part.find(sep, index + 1)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
156 # a UNC path can't have two slashes in a row
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
157 # (after the initial two)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
158 if index2 != index + 1:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
159 if index2 == -1:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
160 index2 = len(part)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
161 if prefix:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
162 return prefix + part[1:index2], sep, part[index2+1:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
163 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
164 return part[:index2], sep, part[index2+1:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
165 drv = root = ''
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
166 if second == ':' and first in self.drive_letters:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
167 drv = part[:2]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
168 part = part[2:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
169 first = third
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
170 if first == sep:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
171 root = first
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
172 part = part.lstrip(sep)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
173 return prefix + drv, root, part
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
174
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
175 def casefold(self, s):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
176 return s.lower()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
177
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
178 def casefold_parts(self, parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
179 return [p.lower() for p in parts]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
180
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
181 def resolve(self, path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
182 s = str(path)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
183 if not s:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
184 return os.getcwd()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
185 if _getfinalpathname is not None:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
186 return self._ext_to_normal(_getfinalpathname(s))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
187 # Means fallback on absolute
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
188 return None
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
189
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
190 def _split_extended_path(self, s, ext_prefix=ext_namespace_prefix):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
191 prefix = ''
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
192 if s.startswith(ext_prefix):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
193 prefix = s[:4]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
194 s = s[4:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
195 if s.startswith('UNC\\'):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
196 prefix += s[:3]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
197 s = '\\' + s[3:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
198 return prefix, s
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
199
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
200 def _ext_to_normal(self, s):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
201 # Turn back an extended path into a normal DOS-like path
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
202 return self._split_extended_path(s)[1]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
203
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
204 def is_reserved(self, parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
205 # NOTE: the rules for reserved names seem somewhat complicated
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
206 # (e.g. r"..\NUL" is reserved but not r"foo\NUL").
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
207 # We err on the side of caution and return True for paths which are
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
208 # not considered reserved by Windows.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
209 if not parts:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
210 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
211 if parts[0].startswith('\\\\'):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
212 # UNC paths are never reserved
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
213 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
214 return parts[-1].partition('.')[0].upper() in self.reserved_names
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
215
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
216 def make_uri(self, path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
217 # Under Windows, file URIs use the UTF-8 encoding.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
218 drive = path.drive
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
219 if len(drive) == 2 and drive[1] == ':':
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
220 # It's a path on a local drive => 'file:///c:/a/b'
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
221 rest = path.as_posix()[2:].lstrip('/')
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
222 return 'file:///%s/%s' % (
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
223 drive, urlquote_from_bytes(rest.encode('utf-8')))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
224 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
225 # It's a path on a network drive => 'file://host/share/a/b'
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
226 return 'file:' + urlquote_from_bytes(path.as_posix().encode('utf-8'))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
227
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
228
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
229 class _PosixFlavour(_Flavour):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
230 sep = '/'
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
231 altsep = ''
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
232 has_drv = False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
233 pathmod = posixpath
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
234
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
235 is_supported = (os.name != 'nt')
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
236
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
237 def splitroot(self, part, sep=sep):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
238 if part and part[0] == sep:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
239 stripped_part = part.lstrip(sep)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
240 # According to POSIX path resolution:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
241 # http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04_11
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
242 # "A pathname that begins with two successive slashes may be
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
243 # interpreted in an implementation-defined manner, although more
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
244 # than two leading slashes shall be treated as a single slash".
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
245 if len(part) - len(stripped_part) == 2:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
246 return '', sep * 2, stripped_part
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
247 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
248 return '', sep, stripped_part
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
249 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
250 return '', '', part
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
251
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
252 def casefold(self, s):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
253 return s
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
254
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
255 def casefold_parts(self, parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
256 return parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
257
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
258 def resolve(self, path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
259 sep = self.sep
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
260 def split(p):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
261 return [x for x in p.split(sep) if x]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
262 def absparts(p):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
263 # Our own abspath(), since the posixpath one makes
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
264 # the mistake of "normalizing" the path without resolving the
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
265 # symlinks first.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
266 if not p.startswith(sep):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
267 return split(os.getcwd()) + split(p)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
268 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
269 return split(p)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
270 parts = absparts(str(path))[::-1]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
271 accessor = path._accessor
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
272 resolved = cur = ""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
273 symlinks = {}
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
274 while parts:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
275 part = parts.pop()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
276 cur = resolved + sep + part
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
277 if cur in symlinks and symlinks[cur] <= len(parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
278 # We've already seen the symlink and there's not less
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
279 # work to do than the last time.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
280 raise RuntimeError("Symlink loop from %r" % cur)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
281 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
282 target = accessor.readlink(cur)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
283 except OSError as e:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
284 if e.errno != EINVAL:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
285 raise
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
286 # Not a symlink
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
287 resolved = cur
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
288 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
289 # Take note of remaining work from this symlink
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
290 symlinks[cur] = len(parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
291 if target.startswith(sep):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
292 # Symlink points to absolute path
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
293 resolved = ""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
294 parts.extend(split(target)[::-1])
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
295 return resolved or sep
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
296
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
297 def is_reserved(self, parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
298 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
299
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
300 def make_uri(self, path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
301 # We represent the path using the local filesystem encoding,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
302 # for portability to other applications.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
303 bpath = bytes(path)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
304 return 'file://' + urlquote_from_bytes(bpath)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
305
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
306
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
307 _windows_flavour = _WindowsFlavour()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
308 _posix_flavour = _PosixFlavour()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
309
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
310
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
311 class _Accessor:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
312 """An accessor implements a particular (system-specific or not) way of
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
313 accessing paths on the filesystem."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
314
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
315
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
316 class _NormalAccessor(_Accessor):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
317
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
318 def _wrap_strfunc(strfunc):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
319 @functools.wraps(strfunc)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
320 def wrapped(pathobj, *args):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
321 return strfunc(str(pathobj), *args)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
322 return staticmethod(wrapped)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
323
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
324 def _wrap_binary_strfunc(strfunc):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
325 @functools.wraps(strfunc)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
326 def wrapped(pathobjA, pathobjB, *args):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
327 return strfunc(str(pathobjA), str(pathobjB), *args)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
328 return staticmethod(wrapped)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
329
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
330 stat = _wrap_strfunc(os.stat)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
331
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
332 lstat = _wrap_strfunc(os.lstat)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
333
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
334 open = _wrap_strfunc(os.open)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
335
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
336 listdir = _wrap_strfunc(os.listdir)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
337
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
338 chmod = _wrap_strfunc(os.chmod)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
339
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
340 if hasattr(os, "lchmod"):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
341 lchmod = _wrap_strfunc(os.lchmod)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
342 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
343 def lchmod(self, pathobj, mode):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
344 raise NotImplementedError("lchmod() not available on this system")
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
345
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
346 mkdir = _wrap_strfunc(os.mkdir)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
347
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
348 unlink = _wrap_strfunc(os.unlink)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
349
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
350 rmdir = _wrap_strfunc(os.rmdir)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
351
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
352 rename = _wrap_binary_strfunc(os.rename)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
353
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
354 replace = _wrap_binary_strfunc(os.replace)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
355
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
356 if nt:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
357 if supports_symlinks:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
358 symlink = _wrap_binary_strfunc(os.symlink)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
359 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
360 def symlink(a, b, target_is_directory):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
361 raise NotImplementedError("symlink() not available on this system")
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
362 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
363 # Under POSIX, os.symlink() takes two args
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
364 @staticmethod
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
365 def symlink(a, b, target_is_directory):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
366 return os.symlink(str(a), str(b))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
367
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
368 utime = _wrap_strfunc(os.utime)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
369
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
370 # Helper for resolve()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
371 def readlink(self, path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
372 return os.readlink(path)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
373
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
374
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
375 _normal_accessor = _NormalAccessor()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
376
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
377
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
378 #
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
379 # Globbing helpers
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
380 #
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
381
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
382 @contextmanager
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
383 def _cached(func):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
384 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
385 func.__cached__
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
386 yield func
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
387 except AttributeError:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
388 cache = {}
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
389 def wrapper(*args):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
390 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
391 return cache[args]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
392 except KeyError:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
393 value = cache[args] = func(*args)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
394 return value
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
395 wrapper.__cached__ = True
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
396 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
397 yield wrapper
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
398 finally:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
399 cache.clear()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
400
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
401 def _make_selector(pattern_parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
402 pat = pattern_parts[0]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
403 child_parts = pattern_parts[1:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
404 if pat == '**':
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
405 cls = _RecursiveWildcardSelector
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
406 elif '**' in pat:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
407 raise ValueError("Invalid pattern: '**' can only be an entire path component")
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
408 elif _is_wildcard_pattern(pat):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
409 cls = _WildcardSelector
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
410 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
411 cls = _PreciseSelector
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
412 return cls(pat, child_parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
413
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
414 if hasattr(functools, "lru_cache"):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
415 _make_selector = functools.lru_cache()(_make_selector)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
416
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
417
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
418 class _Selector:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
419 """A selector matches a specific glob pattern part against the children
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
420 of a given path."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
421
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
422 def __init__(self, child_parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
423 self.child_parts = child_parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
424 if child_parts:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
425 self.successor = _make_selector(child_parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
426 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
427 self.successor = _TerminatingSelector()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
428
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
429 def select_from(self, parent_path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
430 """Iterate over all child paths of `parent_path` matched by this
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
431 selector. This can contain parent_path itself."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
432 path_cls = type(parent_path)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
433 is_dir = path_cls.is_dir
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
434 exists = path_cls.exists
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
435 listdir = parent_path._accessor.listdir
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
436 return self._select_from(parent_path, is_dir, exists, listdir)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
437
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
438
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
439 class _TerminatingSelector:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
440
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
441 def _select_from(self, parent_path, is_dir, exists, listdir):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
442 yield parent_path
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
443
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
444
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
445 class _PreciseSelector(_Selector):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
446
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
447 def __init__(self, name, child_parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
448 self.name = name
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
449 _Selector.__init__(self, child_parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
450
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
451 def _select_from(self, parent_path, is_dir, exists, listdir):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
452 if not is_dir(parent_path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
453 return
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
454 path = parent_path._make_child_relpath(self.name)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
455 if exists(path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
456 for p in self.successor._select_from(path, is_dir, exists, listdir):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
457 yield p
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
458
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
459
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
460 class _WildcardSelector(_Selector):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
461
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
462 def __init__(self, pat, child_parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
463 self.pat = re.compile(fnmatch.translate(pat))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
464 _Selector.__init__(self, child_parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
465
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
466 def _select_from(self, parent_path, is_dir, exists, listdir):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
467 if not is_dir(parent_path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
468 return
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
469 cf = parent_path._flavour.casefold
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
470 for name in listdir(parent_path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
471 casefolded = cf(name)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
472 if self.pat.match(casefolded):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
473 path = parent_path._make_child_relpath(name)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
474 for p in self.successor._select_from(path, is_dir, exists, listdir):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
475 yield p
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
476
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
477
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
478 class _RecursiveWildcardSelector(_Selector):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
479
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
480 def __init__(self, pat, child_parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
481 _Selector.__init__(self, child_parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
482
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
483 def _iterate_directories(self, parent_path, is_dir, listdir):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
484 yield parent_path
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
485 for name in listdir(parent_path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
486 path = parent_path._make_child_relpath(name)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
487 if is_dir(path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
488 for p in self._iterate_directories(path, is_dir, listdir):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
489 yield p
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
490
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
491 def _select_from(self, parent_path, is_dir, exists, listdir):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
492 if not is_dir(parent_path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
493 return
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
494 with _cached(listdir) as listdir:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
495 yielded = set()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
496 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
497 successor_select = self.successor._select_from
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
498 for starting_point in self._iterate_directories(parent_path, is_dir, listdir):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
499 for p in successor_select(starting_point, is_dir, exists, listdir):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
500 if p not in yielded:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
501 yield p
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
502 yielded.add(p)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
503 finally:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
504 yielded.clear()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
505
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
506
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
507 #
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
508 # Public API
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
509 #
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
510
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
511 class _PathParents(Sequence):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
512 """This object provides sequence-like access to the logical ancestors
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
513 of a path. Don't try to construct it yourself."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
514 __slots__ = ('_pathcls', '_drv', '_root', '_parts')
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
515
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
516 def __init__(self, path):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
517 # We don't store the instance to avoid reference cycles
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
518 self._pathcls = type(path)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
519 self._drv = path._drv
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
520 self._root = path._root
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
521 self._parts = path._parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
522
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
523 def __len__(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
524 if self._drv or self._root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
525 return len(self._parts) - 1
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
526 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
527 return len(self._parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
528
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
529 def __getitem__(self, idx):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
530 if idx < 0 or idx >= len(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
531 raise IndexError(idx)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
532 return self._pathcls._from_parsed_parts(self._drv, self._root,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
533 self._parts[:-idx - 1])
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
534
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
535 def __repr__(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
536 return "<{}.parents>".format(self._pathcls.__name__)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
537
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
538
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
539 class PurePath(object):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
540 """PurePath represents a filesystem path and offers operations which
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
541 don't imply any actual filesystem I/O. Depending on your system,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
542 instantiating a PurePath will return either a PurePosixPath or a
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
543 PureWindowsPath object. You can also instantiate either of these classes
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
544 directly, regardless of your system.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
545 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
546 __slots__ = (
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
547 '_drv', '_root', '_parts',
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
548 '_str', '_hash', '_pparts', '_cached_cparts',
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
549 )
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
550
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
551 def __new__(cls, *args):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
552 """Construct a PurePath from one or several strings and or existing
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
553 PurePath objects. The strings and path objects are combined so as
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
554 to yield a canonicalized path, which is incorporated into the
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
555 new PurePath object.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
556 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
557 if cls is PurePath:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
558 cls = PureWindowsPath if os.name == 'nt' else PurePosixPath
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
559 return cls._from_parts(args)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
560
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
561 def __reduce__(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
562 # Using the parts tuple helps share interned path parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
563 # when pickling related paths.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
564 return (self.__class__, tuple(self._parts))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
565
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
566 @classmethod
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
567 def _parse_args(cls, args):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
568 # This is useful when you don't want to create an instance, just
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
569 # canonicalize some constructor arguments.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
570 parts = []
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
571 for a in args:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
572 if isinstance(a, PurePath):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
573 parts += a._parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
574 elif isinstance(a, str):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
575 # Assuming a str
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
576 parts.append(a)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
577 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
578 raise TypeError(
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
579 "argument should be a path or str object, not %r"
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
580 % type(a))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
581 return cls._flavour.parse_parts(parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
582
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
583 @classmethod
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
584 def _from_parts(cls, args, init=True):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
585 # We need to call _parse_args on the instance, so as to get the
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
586 # right flavour.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
587 self = object.__new__(cls)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
588 drv, root, parts = self._parse_args(args)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
589 self._drv = drv
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
590 self._root = root
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
591 self._parts = parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
592 if init:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
593 self._init()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
594 return self
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
595
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
596 @classmethod
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
597 def _from_parsed_parts(cls, drv, root, parts, init=True):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
598 self = object.__new__(cls)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
599 self._drv = drv
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
600 self._root = root
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
601 self._parts = parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
602 if init:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
603 self._init()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
604 return self
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
605
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
606 @classmethod
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
607 def _format_parsed_parts(cls, drv, root, parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
608 if drv or root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
609 return drv + root + cls._flavour.join(parts[1:])
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
610 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
611 return cls._flavour.join(parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
612
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
613 def _init(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
614 # Overriden in concrete Path
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
615 pass
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
616
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
617 def _make_child(self, args):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
618 drv, root, parts = self._parse_args(args)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
619 drv, root, parts = self._flavour.join_parsed_parts(
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
620 self._drv, self._root, self._parts, drv, root, parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
621 return self._from_parsed_parts(drv, root, parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
622
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
623 def __str__(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
624 """Return the string representation of the path, suitable for
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
625 passing to system calls."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
626 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
627 return self._str
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
628 except AttributeError:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
629 self._str = self._format_parsed_parts(self._drv, self._root,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
630 self._parts) or '.'
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
631 return self._str
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
632
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
633 def as_posix(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
634 """Return the string representation of the path with forward (/)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
635 slashes."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
636 f = self._flavour
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
637 return str(self).replace(f.sep, '/')
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
638
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
639 def __bytes__(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
640 """Return the bytes representation of the path. This is only
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
641 recommended to use under Unix."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
642 return os.fsencode(str(self))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
643
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
644 def __repr__(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
645 return "{}({!r})".format(self.__class__.__name__, self.as_posix())
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
646
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
647 def as_uri(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
648 """Return the path as a 'file' URI."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
649 if not self.is_absolute():
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
650 raise ValueError("relative path can't be expressed as a file URI")
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
651 return self._flavour.make_uri(self)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
652
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
653 @property
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
654 def _cparts(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
655 # Cached casefolded parts, for hashing and comparison
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
656 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
657 return self._cached_cparts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
658 except AttributeError:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
659 self._cached_cparts = self._flavour.casefold_parts(self._parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
660 return self._cached_cparts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
661
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
662 def __eq__(self, other):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
663 if not isinstance(other, PurePath):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
664 return NotImplemented
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
665 return self._cparts == other._cparts and self._flavour is other._flavour
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
666
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
667 def __ne__(self, other):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
668 return not self == other
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
669
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
670 def __hash__(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
671 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
672 return self._hash
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
673 except AttributeError:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
674 self._hash = hash(tuple(self._cparts))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
675 return self._hash
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
676
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
677 def __lt__(self, other):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
678 if not isinstance(other, PurePath) or self._flavour is not other._flavour:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
679 return NotImplemented
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
680 return self._cparts < other._cparts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
681
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
682 def __le__(self, other):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
683 if not isinstance(other, PurePath) or self._flavour is not other._flavour:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
684 return NotImplemented
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
685 return self._cparts <= other._cparts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
686
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
687 def __gt__(self, other):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
688 if not isinstance(other, PurePath) or self._flavour is not other._flavour:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
689 return NotImplemented
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
690 return self._cparts > other._cparts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
691
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
692 def __ge__(self, other):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
693 if not isinstance(other, PurePath) or self._flavour is not other._flavour:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
694 return NotImplemented
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
695 return self._cparts >= other._cparts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
696
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
697 drive = property(attrgetter('_drv'),
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
698 doc="""The drive prefix (letter or UNC path), if any.""")
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
699
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
700 root = property(attrgetter('_root'),
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
701 doc="""The root of the path, if any.""")
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
702
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
703 @property
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
704 def anchor(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
705 """The concatenation of the drive and root, or ''."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
706 anchor = self._drv + self._root
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
707 return anchor
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
708
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
709 @property
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
710 def name(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
711 """The final path component, if any."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
712 parts = self._parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
713 if len(parts) == (1 if (self._drv or self._root) else 0):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
714 return ''
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
715 return parts[-1]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
716
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
717 @property
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
718 def suffix(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
719 """The final component's last suffix, if any."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
720 name = self.name
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
721 i = name.rfind('.')
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
722 if 0 < i < len(name) - 1:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
723 return name[i:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
724 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
725 return ''
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
726
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
727 @property
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
728 def suffixes(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
729 """A list of the final component's suffixes, if any."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
730 name = self.name
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
731 if name.endswith('.'):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
732 return []
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
733 name = name.lstrip('.')
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
734 return ['.' + suffix for suffix in name.split('.')[1:]]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
735
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
736 @property
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
737 def stem(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
738 """The final path component, minus its last suffix."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
739 name = self.name
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
740 i = name.rfind('.')
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
741 if 0 < i < len(name) - 1:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
742 return name[:i]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
743 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
744 return name
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
745
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
746 def with_name(self, name):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
747 """Return a new path with the file name changed."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
748 if not self.name:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
749 raise ValueError("%r has an empty name" % (self,))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
750 return self._from_parsed_parts(self._drv, self._root,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
751 self._parts[:-1] + [name])
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
752
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
753 def with_suffix(self, suffix):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
754 """Return a new path with the file suffix changed (or added, if none)."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
755 # XXX if suffix is None, should the current suffix be removed?
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
756 name = self.name
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
757 if not name:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
758 raise ValueError("%r has an empty name" % (self,))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
759 old_suffix = self.suffix
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
760 if not old_suffix:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
761 name = name + suffix
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
762 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
763 name = name[:-len(old_suffix)] + suffix
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
764 return self._from_parsed_parts(self._drv, self._root,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
765 self._parts[:-1] + [name])
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
766
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
767 def relative_to(self, *other):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
768 """Return the relative path to another path identified by the passed
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
769 arguments. If the operation is not possible (because this is not
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
770 a subpath of the other path), raise ValueError.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
771 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
772 # For the purpose of this method, drive and root are considered
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
773 # separate parts, i.e.:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
774 # Path('c:/').relative_to('c:') gives Path('/')
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
775 # Path('c:/').relative_to('/') raise ValueError
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
776 if not other:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
777 raise TypeError("need at least one argument")
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
778 parts = self._parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
779 drv = self._drv
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
780 root = self._root
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
781 if drv or root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
782 if root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
783 abs_parts = [drv, root] + parts[1:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
784 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
785 abs_parts = [drv] + parts[1:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
786 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
787 abs_parts = parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
788 to_drv, to_root, to_parts = self._parse_args(other)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
789 if to_drv or to_root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
790 if to_root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
791 to_abs_parts = [to_drv, to_root] + to_parts[1:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
792 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
793 to_abs_parts = [to_drv] + to_parts[1:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
794 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
795 to_abs_parts = to_parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
796 n = len(to_abs_parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
797 if n == 0 and (drv or root) or abs_parts[:n] != to_abs_parts:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
798 formatted = self._format_parsed_parts(to_drv, to_root, to_parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
799 raise ValueError("{!r} does not start with {!r}"
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
800 .format(str(self), str(formatted)))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
801 return self._from_parsed_parts('', '', abs_parts[n:])
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
802
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
803 @property
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
804 def parts(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
805 """An object providing sequence-like access to the
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
806 components in the filesystem path."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
807 # We cache the tuple to avoid building a new one each time .parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
808 # is accessed. XXX is this necessary?
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
809 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
810 return self._pparts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
811 except AttributeError:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
812 self._pparts = tuple(self._parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
813 return self._pparts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
814
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
815 def joinpath(self, *args):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
816 """Combine this path with one or several arguments, and return a
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
817 new path representing either a subpath (if all arguments are relative
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
818 paths) or a totally different path (if one of the arguments is
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
819 anchored).
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
820 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
821 return self._make_child(args)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
822
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
823 def __truediv__(self, key):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
824 return self._make_child((key,))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
825
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
826 def __rtruediv__(self, key):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
827 return self._from_parts([key] + self._parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
828
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
829 @property
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
830 def parent(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
831 """The logical parent of the path."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
832 drv = self._drv
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
833 root = self._root
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
834 parts = self._parts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
835 if len(parts) == 1 and (drv or root):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
836 return self
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
837 return self._from_parsed_parts(drv, root, parts[:-1])
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
838
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
839 @property
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
840 def parents(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
841 """A sequence of this path's logical parents."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
842 return _PathParents(self)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
843
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
844 def is_absolute(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
845 """True if the path is absolute (has both a root and, if applicable,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
846 a drive)."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
847 if not self._root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
848 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
849 return not self._flavour.has_drv or bool(self._drv)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
850
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
851 def is_reserved(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
852 """Return True if the path contains one of the special names reserved
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
853 by the system, if any."""
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
854 return self._flavour.is_reserved(self._parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
855
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
856 def match(self, path_pattern):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
857 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
858 Return True if this path matches the given pattern.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
859 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
860 cf = self._flavour.casefold
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
861 path_pattern = cf(path_pattern)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
862 drv, root, pat_parts = self._flavour.parse_parts((path_pattern,))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
863 if not pat_parts:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
864 raise ValueError("empty pattern")
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
865 if drv and drv != cf(self._drv):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
866 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
867 if root and root != cf(self._root):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
868 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
869 parts = self._cparts
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
870 if drv or root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
871 if len(pat_parts) != len(parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
872 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
873 pat_parts = pat_parts[1:]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
874 elif len(pat_parts) > len(parts):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
875 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
876 for part, pat in zip(reversed(parts), reversed(pat_parts)):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
877 if not fnmatch.fnmatchcase(part, pat):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
878 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
879 return True
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
880
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
881
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
882 class PurePosixPath(PurePath):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
883 _flavour = _posix_flavour
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
884 __slots__ = ()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
885
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
886
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
887 class PureWindowsPath(PurePath):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
888 _flavour = _windows_flavour
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
889 __slots__ = ()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
890
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
891
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
892 # Filesystem-accessing classes
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
893
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
894
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
895 class Path(PurePath):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
896 __slots__ = (
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
897 '_accessor',
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
898 '_closed',
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
899 )
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
900
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
901 def __new__(cls, *args, **kwargs):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
902 if cls is Path:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
903 cls = WindowsPath if os.name == 'nt' else PosixPath
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
904 self = cls._from_parts(args, init=False)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
905 if not self._flavour.is_supported:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
906 raise NotImplementedError("cannot instantiate %r on your system"
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
907 % (cls.__name__,))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
908 self._init()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
909 return self
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
910
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
911 def _init(self,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
912 # Private non-constructor arguments
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
913 template=None,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
914 ):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
915 self._closed = False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
916 if template is not None:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
917 self._accessor = template._accessor
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
918 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
919 self._accessor = _normal_accessor
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
920
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
921 def _make_child_relpath(self, part):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
922 # This is an optimization used for dir walking. `part` must be
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
923 # a single part relative to this path.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
924 parts = self._parts + [part]
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
925 return self._from_parsed_parts(self._drv, self._root, parts)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
926
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
927 def __enter__(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
928 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
929 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
930 return self
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
931
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
932 def __exit__(self, t, v, tb):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
933 self._closed = True
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
934
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
935 def _raise_closed(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
936 raise ValueError("I/O operation on closed path")
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
937
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
938 def _opener(self, name, flags, mode=0o666):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
939 # A stub for the opener argument to built-in open()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
940 return self._accessor.open(self, flags, mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
941
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
942 # Public API
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
943
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
944 @classmethod
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
945 def cwd(cls):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
946 """Return a new path pointing to the current working directory
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
947 (as returned by os.getcwd()).
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
948 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
949 return cls(os.getcwd())
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
950
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
951 def iterdir(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
952 """Iterate over the files in this directory. Does not yield any
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
953 result for the special paths '.' and '..'.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
954 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
955 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
956 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
957 for name in self._accessor.listdir(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
958 if name in {'.', '..'}:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
959 # Yielding a path object for these makes little sense
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
960 continue
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
961 yield self._make_child_relpath(name)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
962 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
963 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
964
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
965 def glob(self, pattern):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
966 """Iterate over this subtree and yield all existing files (of any
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
967 kind, including directories) matching the given pattern.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
968 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
969 pattern = self._flavour.casefold(pattern)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
970 drv, root, pattern_parts = self._flavour.parse_parts((pattern,))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
971 if drv or root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
972 raise NotImplementedError("Non-relative patterns are unsupported")
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
973 selector = _make_selector(tuple(pattern_parts))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
974 for p in selector.select_from(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
975 yield p
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
976
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
977 def rglob(self, pattern):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
978 """Recursively yield all existing files (of any kind, including
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
979 directories) matching the given pattern, anywhere in this subtree.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
980 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
981 pattern = self._flavour.casefold(pattern)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
982 drv, root, pattern_parts = self._flavour.parse_parts((pattern,))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
983 if drv or root:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
984 raise NotImplementedError("Non-relative patterns are unsupported")
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
985 selector = _make_selector(("**",) + tuple(pattern_parts))
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
986 for p in selector.select_from(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
987 yield p
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
988
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
989 def absolute(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
990 """Return an absolute version of this path. This function works
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
991 even if the path doesn't point to anything.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
992
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
993 No normalization is done, i.e. all '.' and '..' will be kept along.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
994 Use resolve() to get the canonical path to a file.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
995 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
996 # XXX untested yet!
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
997 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
998 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
999 if self.is_absolute():
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1000 return self
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1001 # FIXME this must defer to the specific flavour (and, under Windows,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1002 # use nt._getfullpathname())
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1003 obj = self._from_parts([os.getcwd()] + self._parts, init=False)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1004 obj._init(template=self)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1005 return obj
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1006
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1007 def resolve(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1008 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1009 Make the path absolute, resolving all symlinks on the way and also
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1010 normalizing it (for example turning slashes into backslashes under
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1011 Windows).
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1012 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1013 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1014 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1015 s = self._flavour.resolve(self)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1016 if s is None:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1017 # No symlink resolution => for consistency, raise an error if
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1018 # the path doesn't exist or is forbidden
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1019 self.stat()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1020 s = str(self.absolute())
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1021 # Now we have no symlinks in the path, it's safe to normalize it.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1022 normed = self._flavour.pathmod.normpath(s)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1023 obj = self._from_parts((normed,), init=False)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1024 obj._init(template=self)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1025 return obj
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1026
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1027 def stat(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1028 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1029 Return the result of the stat() system call on this path, like
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1030 os.stat() does.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1031 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1032 return self._accessor.stat(self)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1033
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1034 def owner(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1035 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1036 Return the login name of the file owner.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1037 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1038 import pwd
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1039 return pwd.getpwuid(self.stat().st_uid).pw_name
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1040
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1041 def group(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1042 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1043 Return the group name of the file gid.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1044 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1045 import grp
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1046 return grp.getgrgid(self.stat().st_gid).gr_name
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1047
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1048 def _raw_open(self, flags, mode=0o777):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1049 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1050 Open the file pointed by this path and return a file descriptor,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1051 as os.open() does.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1052 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1053 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1054 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1055 return self._accessor.open(self, flags, mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1056
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1057 def open(self, mode='r', buffering=-1, encoding=None,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1058 errors=None, newline=None):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1059 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1060 Open the file pointed by this path and return a file object, as
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1061 the built-in open() function does.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1062 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1063 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1064 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1065 return io.open(str(self), mode, buffering, encoding, errors, newline,
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1066 opener=self._opener)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1067
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1068 def touch(self, mode=0o666, exist_ok=True):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1069 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1070 Create this file with the given access mode, if it doesn't exist.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1071 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1072 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1073 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1074 if exist_ok:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1075 # First try to bump modification time
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1076 # Implementation note: GNU touch uses the UTIME_NOW option of
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1077 # the utimensat() / futimens() functions.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1078 try:
87420
b5e9d61f6987 Issue #19715: try the utime(..., None) approach again, now that it should be more precise under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 87387
diff changeset
1079 self._accessor.utime(self, None)
87348
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1080 except OSError:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1081 # Avoid exception chaining
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1082 pass
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1083 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1084 return
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1085 flags = os.O_CREAT | os.O_WRONLY
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1086 if not exist_ok:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1087 flags |= os.O_EXCL
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1088 fd = self._raw_open(flags, mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1089 os.close(fd)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1090
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1091 def mkdir(self, mode=0o777, parents=False):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1092 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1093 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1094 if not parents:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1095 self._accessor.mkdir(self, mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1096 else:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1097 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1098 self._accessor.mkdir(self, mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1099 except OSError as e:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1100 if e.errno != ENOENT:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1101 raise
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1102 self.parent.mkdir(mode, True)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1103 self._accessor.mkdir(self, mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1104
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1105 def chmod(self, mode):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1106 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1107 Change the permissions of the path, like os.chmod().
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1108 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1109 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1110 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1111 self._accessor.chmod(self, mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1112
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1113 def lchmod(self, mode):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1114 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1115 Like chmod(), except if the path points to a symlink, the symlink's
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1116 permissions are changed, rather than its target's.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1117 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1118 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1119 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1120 self._accessor.lchmod(self, mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1121
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1122 def unlink(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1123 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1124 Remove this file or link.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1125 If the path is a directory, use rmdir() instead.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1126 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1127 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1128 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1129 self._accessor.unlink(self)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1130
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1131 def rmdir(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1132 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1133 Remove this directory. The directory must be empty.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1134 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1135 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1136 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1137 self._accessor.rmdir(self)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1138
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1139 def lstat(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1140 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1141 Like stat(), except if the path points to a symlink, the symlink's
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1142 status information is returned, rather than its target's.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1143 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1144 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1145 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1146 return self._accessor.lstat(self)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1147
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1148 def rename(self, target):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1149 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1150 Rename this path to the given path.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1151 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1152 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1153 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1154 self._accessor.rename(self, target)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1155
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1156 def replace(self, target):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1157 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1158 Rename this path to the given path, clobbering the existing
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1159 destination if it exists.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1160 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1161 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1162 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1163 self._accessor.replace(self, target)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1164
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1165 def symlink_to(self, target, target_is_directory=False):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1166 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1167 Make this path a symlink pointing to the given path.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1168 Note the order of arguments (self, target) is the reverse of os.symlink's.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1169 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1170 if self._closed:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1171 self._raise_closed()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1172 self._accessor.symlink(target, self, target_is_directory)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1173
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1174 # Convenience functions for querying the stat results
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1175
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1176 def exists(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1177 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1178 Whether this path exists.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1179 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1180 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1181 self.stat()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1182 except OSError as e:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1183 if e.errno != ENOENT:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1184 raise
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1185 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1186 return True
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1187
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1188 def is_dir(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1189 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1190 Whether this path is a directory.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1191 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1192 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1193 return S_ISDIR(self.stat().st_mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1194 except OSError as e:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1195 if e.errno != ENOENT:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1196 raise
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1197 # Path doesn't exist or is a broken symlink
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1198 # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1199 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1200
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1201 def is_file(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1202 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1203 Whether this path is a regular file (also True for symlinks pointing
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1204 to regular files).
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1205 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1206 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1207 return S_ISREG(self.stat().st_mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1208 except OSError as e:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1209 if e.errno != ENOENT:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1210 raise
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1211 # Path doesn't exist or is a broken symlink
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1212 # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1213 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1214
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1215 def is_symlink(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1216 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1217 Whether this path is a symbolic link.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1218 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1219 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1220 return S_ISLNK(self.lstat().st_mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1221 except OSError as e:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1222 if e.errno != ENOENT:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1223 raise
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1224 # Path doesn't exist
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1225 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1226
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1227 def is_block_device(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1228 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1229 Whether this path is a block device.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1230 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1231 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1232 return S_ISBLK(self.stat().st_mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1233 except OSError as e:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1234 if e.errno != ENOENT:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1235 raise
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1236 # Path doesn't exist or is a broken symlink
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1237 # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1238 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1239
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1240 def is_char_device(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1241 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1242 Whether this path is a character device.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1243 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1244 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1245 return S_ISCHR(self.stat().st_mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1246 except OSError as e:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1247 if e.errno != ENOENT:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1248 raise
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1249 # Path doesn't exist or is a broken symlink
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1250 # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1251 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1252
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1253 def is_fifo(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1254 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1255 Whether this path is a FIFO.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1256 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1257 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1258 return S_ISFIFO(self.stat().st_mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1259 except OSError as e:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1260 if e.errno != ENOENT:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1261 raise
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1262 # Path doesn't exist or is a broken symlink
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1263 # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1264 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1265
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1266 def is_socket(self):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1267 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1268 Whether this path is a socket.
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1269 """
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1270 try:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1271 return S_ISSOCK(self.stat().st_mode)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1272 except OSError as e:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1273 if e.errno != ENOENT:
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1274 raise
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1275 # Path doesn't exist or is a broken symlink
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1276 # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1277 return False
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1278
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1279
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1280 class PosixPath(Path, PurePosixPath):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1281 __slots__ = ()
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1282
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1283 class WindowsPath(Path, PureWindowsPath):
43377dcfb801 Issue #19673: Add pathlib to the stdlib as a provisional module (PEP 428).
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1284 __slots__ = ()