Parallels / artifactory

A Python client for Artifactory
MIT License
82 stars 54 forks source link

Python 3.6 compatibility; Path.glob() #49

Open mikewaters opened 7 years ago

mikewaters commented 7 years ago

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.

Xcelled commented 6 years ago

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
allburov commented 5 years ago

Fixed in https://github.com/devopshq/artifactory

https://github.com/devopshq/artifactory/issues/11

Nicholas-Autio-Mitchell commented 5 years ago

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().