| # Copyright 2020 The Meson development team |
| |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| import sys |
| import typing as T |
| |
| # Python 3.5 does not have the strict kwarg for resolve and always |
| # behaves like calling resolve with strict=True in Python 3.6+ |
| # |
| # This module emulates the behavior of Python 3.6+ by in Python 3.5 by |
| # overriding the resolve method with a bit of custom logic |
| # |
| # TODO: Drop this module as soon as Python 3.5 support is dropped |
| |
| if T.TYPE_CHECKING: |
| from pathlib import Path |
| else: |
| if sys.version_info.major <= 3 and sys.version_info.minor <= 5: |
| |
| # Inspired by https://codereview.stackexchange.com/questions/162426/subclassing-pathlib-path |
| import pathlib |
| import os |
| |
| # Can not directly inherit from pathlib.Path because the __new__ |
| # operator of pathlib.Path() returns a {Posix,Windows}Path object. |
| class Path(type(pathlib.Path())): |
| def resolve(self, strict: bool = False) -> 'Path': |
| try: |
| return super().resolve() |
| except FileNotFoundError: |
| if strict: |
| raise |
| return Path(os.path.normpath(str(self))) |
| |
| else: |
| from pathlib import Path |
| |
| from pathlib import PurePath, PureWindowsPath, PurePosixPath |