Mercurial > cpython-lru_cache-weakref
annotate Lib/pathlib.py @ 87488:124e51c19e4f
Issue #19734: Also run pip version check in isolated mode
| author | Nick Coghlan <ncoghlan@gmail.com> |
|---|---|
| date | Sun, 24 Nov 2013 16:49:20 +1000 |
| 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__ = () |
