in jupyter-gcs-contents-manager/gcs_contents_manager.py [0:0]
def _list_dir(self, normalized_path, content=True):
dir_obj = self._empty_dir_model(normalized_path, content=content)
if not content:
return dir_obj
# We have to convert a list of GCS blobs, which may include multiple
# entries corresponding to a single sub-directory, into a list of immediate
# directory contents with no duplicates.
#
# To do that, we keep a dictionary of immediate children, and then convert
# that dictionary into a list once it is fully populated.
children = {}
def add_child(name, model, override_existing=False):
"""Add the given child model (for either a regular file or directory), to
the list of children for the current directory model being built.
It is possible that we will encounter a GCS blob corresponding to a
regular file after we encounter blobs indicating that name should be a
directory. For example, if we have the following blobs:
some/dir/path/
some/dir/path/with/child
some/dir/path
... then the first two entries tell us that 'path' is a subdirectory of
'dir', but the third one tells us that it is a regular file.
In this case, we treat the regular file as shadowing the directory. The
'override_existing' keyword argument handles that by letting the caller
specify that the child being added should override (i.e. hide) any
pre-existing children with the same name.
"""
if self.is_hidden(model['path']) and not self.allow_hidden:
return
if (name in children) and not override_existing:
return
children[name] = model
dir_gcs_path = self._gcs_path(normalized_path)
for b in self.bucket.list_blobs(prefix=dir_gcs_path):
# For each nested blob, identify the corresponding immediate child
# of the directory, and then add that child to the directory model.
prefix_len = len(dir_gcs_path) + 1 if dir_gcs_path else 0
suffix = b.name[prefix_len:]
if suffix: # Ignore the place-holder blob for the directory itself
first_slash = suffix.find('/')
if first_slash < 0:
child_path = posixpath.join(normalized_path, suffix)
add_child(suffix,
self._blob_model(child_path, b, content=False),
override_existing=True)
else:
subdir = suffix[0:first_slash]
if subdir:
child_path = posixpath.join(normalized_path, subdir)
add_child(subdir, self._empty_dir_model(child_path, content=False))
for child in children:
dir_obj['content'].append(children[child])
return dir_obj