artifactory
artifactory copied to clipboard
Python 3.6 compatibility; Path.glob()
Hi,
It appears that globbing behavior in Pathlib has changed/optimized to use scandir
in 3.6: https://bugs.python.org/issue26032
File "/usr/lib/python3.6/pathlib.py", line 1081, in glob
for p in selector.select_from(self):
File "/usr/lib/python3.6/pathlib.py", line 489, in select_from
scandir = parent_path._accessor.scandir
AttributeError: '_ArtifactoryAccessor' object has no attribute 'scandir'
Trivially implementing scandir
on _ArtifactoryAccessor
results in a second failure, so this may be more than just adding a new method that wraps listdir
.
scandir()
is supposed to return a list of DirEntry. listdir()
returns strings. I was able to hack around it with this, though I have no idea if this is the best way to convert the strings to DirEntry-ish things:
from artifactory import _ArtifactoryAccessor
def scandir(self, pathobj):
for x in _ArtifactoryAccessor.listdir(self, pathobj):
yield pathobj.joinpath(x)
_ArtifactoryAccessor.scandir = scandir
Fixed in https://github.com/devopshq/artifactory
https://github.com/devopshq/artifactory/issues/11
Perhaps worth noting, in case it is used elsewhere:
the DirEntry
objects hold both the filenames as well as the full path - as two separate attributes. This version obviously doesn't provide both, only yielding the full paths, as that is the output of os.listdir()
.