FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

GH-116380: Move pathlib-specific code from `glob` to `pathlib._abc`. by barneygale · Pull Request #120011 · python/cpython · GitHub

Repository navigation

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension .py  (3) All 1 file type selected
Viewed files
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Unified
Split
Hide whitespace
Diff view
Unified
Split
Hide whitespace
Next Next commit
GH-116380: Move pathlib-specific code from glob to pathlib._abc.
In `glob._Globber`, move pathlib-specific methods to `pathlib._abc.Globber`
and replace them with abstract methods. Rename `glob._Globber` to
`glob._GlobberBase`, and  `glob._StringGlobber` to `glob._Globber`. As a
result, the `glob` module is no longer befouled by code that can only ever
apply to pathlib.

No change of behaviour.
  • Loading branch information
barneygale committed Jun 4, 2024
commit b74b06174fc0598273cbf536422278ec2d1693be
47 changes: 25 additions & 22 deletions Lib/glob.py
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
Expand Up @@ -328,8 +328,8 @@ def _compile_pattern(pat, sep, case_sensitive, recursive=True):
return re.compile(regex, flags=flags).match


class _Globber:
"""Class providing shell-style pattern matching and globbing.
class _GlobberBase:
"""Abstract class providing shell-style pattern matching and globbing.
"""

def __init__(self, sep, case_sensitive, case_pedantic=False, recursive=False):
Expand All @@ -338,29 +338,32 @@ def __init__(self, sep, case_sensitive, case_pedantic=False, recursive=False):
self.case_pedantic = case_pedantic
self.recursive = recursive

# Low-level methods
# Abstract methods

lexists = operator.methodcaller('exists', follow_symlinks=False)
add_slash = operator.methodcaller('joinpath', '')
def lexists(self, path):
"""Implements os.path.lexists().
"""
raise NotImplementedError

def scandir(self, path):
"""Implements os.scandir().
"""
raise NotImplementedError

@staticmethod
def scandir(path):
"""Emulates os.scandir(), which returns an object that can be used as
a context manager. This method is called by walk() and glob().
def add_slash(self, path):
"""Returns a path with a trailing slash added.
"""
return contextlib.nullcontext(path.iterdir())
raise NotImplementedError

@staticmethod
def concat_path(path, text):
"""Appends text to the given path.
def concat_path(self, path, text):
"""Implements path concatenation.
"""
return path.with_segments(path._raw_path + text)
raise NotImplementedError

@staticmethod
def parse_entry(entry):
def parse_entry(self, entry):
"""Returns the path of an entry yielded from scandir().
"""
return entry
raise NotImplementedError

# High-level methods

Expand Down Expand Up @@ -520,22 +523,22 @@ def select_exists(self, path, exists=False):
yield path


class _StringGlobber(_Globber):
class _Globber(_GlobberBase):
"""Provides shell-style pattern matching and globbing for string paths.
"""
lexists = staticmethod(os.path.lexists)
scandir = staticmethod(os.scandir)
parse_entry = operator.attrgetter('path')
concat_path = operator.add

if os.name == 'nt':
@staticmethod
def add_slash(pathname):
def add_slash(self, pathname):
tail = os.path.splitroot(pathname)[2]
if not tail or tail[-1] in '\\/':
return pathname
return f'{pathname}\\'
else:
@staticmethod
def add_slash(pathname):
def add_slash(self, pathname):
if not pathname or pathname[-1] == '/':
return pathname
return f'{pathname}/'
31 changes: 29 additions & 2 deletions Lib/pathlib/_abc.py
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
Expand Up @@ -12,7 +12,8 @@
"""

import functools
from glob import _Globber, _no_recurse_symlinks
import operator
from glob import _GlobberBase, _no_recurse_symlinks
from errno import ENOTDIR, ELOOP
from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO

Expand Down Expand Up @@ -84,6 +85,32 @@ def isabs(self, path):
raise UnsupportedOperation(self._unsupported_msg('isabs()'))


class Globber(_GlobberBase):
"""
Class providing shell-style globbing for path objects.
"""

lexists = operator.methodcaller('exists', follow_symlinks=False)
add_slash = operator.methodcaller('joinpath', '')

def scandir(self, path):
"""Emulates os.scandir(), which returns an object that can be used as
a context manager. This method is called by walk() and glob().
"""
import contextlib
return contextlib.nullcontext(path.iterdir())

def concat_path(self, path, text):
"""Appends text to the given path.
"""
return path.with_segments(path._raw_path + text)

def parse_entry(self, entry):
"""Returns the path of an entry yielded from scandir().
"""
return entry


class PurePathBase:
"""Base class for pure path objects.

Expand All @@ -104,7 +131,7 @@ class PurePathBase:
'_resolving',
)
parser = ParserBase()
_globber = _Globber
_globber = Globber

def __init__(self, path, *paths):
self._raw_path = self.parser.join(path, *paths) if paths else path
Expand Down
4 changes: 2 additions & 2 deletions Lib/pathlib/_local.py
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
Expand Up @@ -4,7 +4,7 @@
import os
import posixpath
import sys
from glob import _StringGlobber
from glob import _Globber
from itertools import chain
from _collections_abc import Sequence

Expand Down Expand Up @@ -101,7 +101,7 @@ class PurePath(PurePathBase):
'_hash',
)
parser = os.path
_globber = _StringGlobber
_globber = _Globber

def __new__(cls, *args, **kwargs):
"""Construct a PurePath from one or several strings and or existing
Expand Down

Back | FazBrowse Home | New Git URL