Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 34k
gh-84538: add strict argument to pathlib.PurePath.relative_to#19813
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
miss-islington merged 17 commits into python:main from domragusa:relative_to_strict_paramOct 28, 2022
Uh oh!
There was an error while loading. Please reload this page.
Merged
Changes from all commits
Commits
Show all changes
17 commits Select commit Hold shift + click to select a range
ec64368 bpo-40358: add strict param to pathlib.PurePath.relative_to
domragusa 6d721a0 resolve conflicts with GH-19611
domragusa 09422e7 Merge branch 'python:main' into relative_to_strict_param
domragusa d9c07c2 Update Doc/library/pathlib.rst
domragusa 029c3d5 fix wording in documentation as requested
domragusa 01e789b fix typo
domragusa 39b24f3 change strict argument to walk_up in pathlib.PurePath.relative_to
domragusa ad9c0dd Merge branch 'main' into relative_to_strict_param
domragusa 8401974 make the documentation clearer
domragusa e255f99 Apply suggestions from code review
domragusa b781356 Update Lib/pathlib.py
domragusa 7974ee9 fix doc warning
domragusa 8a4edb5 improve variable names
domragusa e6cf222 remove trailing spaces
domragusa b8b218c Merge branch 'main' into relative_to_strict_param
domragusa a4c77c2 Update Doc/library/pathlib.rst
brettcannon 97a5e22 Merge branch 'main' into relative_to_strict_param
brettcannon File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -626,10 +626,13 @@ def with_suffix(self, suffix): | ||
| return self._from_parsed_parts(self._drv, self._root, | ||
| self._parts[:-1] + [name]) | ||
| def relative_to(self, *other): | ||
| def relative_to(self, *other, walk_up=False): | ||
| """Return the relative path to another path identified by the passed | ||
| arguments. If the operation is not possible (because this is not | ||
| a subpath of the other path), raise ValueError. | ||
| related to the other path), raise ValueError. | ||
| The *walk_up* parameter controls whether `..` may be used to resolve | ||
| the path. | ||
| """ | ||
| # For the purpose of this method, drive and root are considered | ||
| # separate parts, i.e.: | ||
| @@ -644,20 +647,35 @@ def relative_to(self, *other): | ||
| abs_parts = [drv, root] + parts[1:] | ||
| else: | ||
| abs_parts = parts | ||
| to_drv, to_root, to_parts = self._parse_args(other) | ||
| if to_root: | ||
| to_abs_parts = [to_drv, to_root] + to_parts[1:] | ||
| other_drv, other_root, other_parts = self._parse_args(other) | ||
| if other_root: | ||
| other_abs_parts = [other_drv, other_root] + other_parts[1:] | ||
| else: | ||
| other_abs_parts = other_parts | ||
| num_parts = len(other_abs_parts) | ||
| casefold = self._flavour.casefold_parts | ||
| num_common_parts = 0 | ||
| for part, other_part in zip(casefold(abs_parts), casefold(other_abs_parts)): | ||
| if part != other_part: | ||
| break | ||
| num_common_parts += 1 | ||
| if walk_up: | ||
| failure = root != other_root | ||
| if drv or other_drv: | ||
| failure = casefold([drv]) != casefold([other_drv]) or (failure and num_parts > 1) | ||
| error_message = "{!r} is not on the same drive as{!r}" | ||
| up_parts = (num_parts-num_common_parts)*['..'] | ||
| else: | ||
| to_abs_parts = to_parts | ||
| n = len(to_abs_parts) | ||
| cf = self._flavour.casefold_parts | ||
| if (root or drv) if n == 0 else cf(abs_parts[:n]) != cf(to_abs_parts): | ||
| formatted = self._format_parsed_parts(to_drv, to_root, to_parts) | ||
| raise ValueError("{!r} is not in the subpath of{!r}" | ||
| " OR one path is relative and the other is absolute." | ||
| .format(str(self), str(formatted))) | ||
| return self._from_parsed_parts('', root if n == 1 else '', | ||
| abs_parts[n:]) | ||
| failure = (root or drv) if num_parts == 0 else num_common_parts != num_parts | ||
| error_message = "{!r} is not in the subpath of{!r}" | ||
| up_parts = [] | ||
| error_message += " OR one path is relative and the other is absolute." | ||
| if failure: | ||
| formatted = self._format_parsed_parts(other_drv, other_root, other_parts) | ||
| raise ValueError(error_message.format(str(self), str(formatted))) | ||
brettcannon marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading. Please reload this page. | ||
| path_parts = up_parts + abs_parts[num_common_parts:] | ||
| new_root = root if num_common_parts == 1 else '' | ||
| return self._from_parsed_parts('', new_root, path_parts) | ||
| def is_relative_to(self, *other): | ||
| """Return True if the path is relative to another path or False. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
1 change: 1 addition & 0 deletions 1 Misc/NEWS.d/next/Library/2020-04-30-02-15-08.bpo-40358.A4ygqe.rst
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| Add walk_up argument in :meth:`pathlib.PurePath.relative_to`. |
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.