Skip to content

Commit

Permalink
fs: path: don't overuse parts
Browse files Browse the repository at this point in the history
These days we have `self.flavour` that is more efficient and more simple.
  • Loading branch information
efiop committed May 17, 2022
1 parent 01cc97f commit 71a4b48
Showing 1 changed file with 22 additions and 17 deletions.
39 changes: 22 additions & 17 deletions dvc/objects/fs/path.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ def join(self, *parts):
def split(self, path):
return self.flavour.split(path)

def splitext(self, path):
return self.flavour.splitext(path)

def normpath(self, path):
return self.flavour.normpath(path)

Expand All @@ -43,6 +46,9 @@ def abspath(self, path):
def commonprefix(self, path):
return self.flavour.commonprefix(path)

def commonpath(self, paths):
return self.flavour.commonpath(paths)

def parts(self, path):
drive, path = self.flavour.splitdrive(path.rstrip(self.flavour.sep))

Expand Down Expand Up @@ -73,11 +79,12 @@ def dirname(self, path):
return self.parent(path)

def parents(self, path):
parts = self.parts(path)
return tuple(
self.join(*parts[:length])
for length in range(len(parts) - 1, 0, -1)
)
while True:
parent = self.flavour.dirname(path)
if parent == path:
break
yield parent
path = parent

def name(self, path):
return self.flavour.basename(path)
Expand All @@ -88,22 +95,20 @@ def suffix(self, path):
return dot + suffix

def with_name(self, path, name):
parts = list(self.parts(path))
parts[-1] = name
return self.join(*parts)
return self.join(self.parent(path), name)

def with_suffix(self, path, suffix):
parts = list(self.parts(path))
real_path, _, _ = parts[-1].partition(".")
parts[-1] = real_path + suffix
return self.join(*parts)
return self.splitext(path)[0] + suffix

def isin(self, left, right):
left_parts = self.parts(left)
right_parts = self.parts(right)
left_len = len(left_parts)
right_len = len(right_parts)
return left_len > right_len and left_parts[:right_len] == right_parts
if left == right:
return False
try:
common = self.commonpath([left, right])
except ValueError:
# Paths don't have the same drive
return False
return common == right

def isin_or_eq(self, left, right):
return left == right or self.isin(left, right)
Expand Down

0 comments on commit 71a4b48

Please sign in to comment.