Mercurial > cpython-lru_cache-weakref
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 |
| 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__ = () |
