diff --git a/param/__init__.py b/param/__init__.py index f925c0ef9..075cf9cba 100644 --- a/param/__init__.py +++ b/param/__init__.py @@ -2486,6 +2486,10 @@ class FileSelector(Selector): """ __slots__ = ['path'] + _slot_defaults = _dict_update( + Selector._slot_defaults, path="", + ) + @typing.overload def __init__( self, @@ -2497,32 +2501,32 @@ def __init__( ... @_deprecate_positional_args - def __init__(self, default=Undefined, *, path="", **kwargs): + def __init__(self, default=Undefined, *, path=Undefined, **kwargs): self.default = default self.path = path - if default is Undefined: - self.update() - else: - self.update(default=False) + self.update(path=path) + if default is not Undefined: + self.default = default super().__init__(default=self.default, objects=self.objects, **kwargs) def _on_set(self, attribute, old, new): super()._on_set(attribute, new, old) if attribute == 'path': - self.update() + self.update(path=new) - def update(self, default=True): - if self.path == "": + def update(self, path=Undefined): + if path is Undefined: + path = self.path + if path == "": self.objects = [] else: # Convert using os.fspath and pathlib.Path to handle ensure # the path separators are consistent (on Windows in particular) - pathpattern = os.fspath(pathlib.Path(self.path)) + pathpattern = os.fspath(pathlib.Path(path)) self.objects = sorted(glob.glob(pathpattern)) if self.default in self.objects: return - if default: - self.default = self.objects[0] if self.objects else None + self.default = self.objects[0] if self.objects else None def get_range(self): return _abbreviate_paths(self.path,super().get_range()) @@ -2573,6 +2577,10 @@ class MultiFileSelector(ListSelector): """ __slots__ = ['path'] + _slot_defaults = _dict_update( + Selector._slot_defaults, path="", + ) + @typing.overload def __init__( self, @@ -2584,21 +2592,25 @@ def __init__( ... @_deprecate_positional_args - def __init__(self, default=Undefined, *, path="", **kwargs): + def __init__(self, default=Undefined, *, path=Undefined, **kwargs): self.default = default self.path = path - self.update() + self.update(path=path) super().__init__(default=default, objects=self.objects, **kwargs) def _on_set(self, attribute, old, new): super()._on_set(attribute, new, old) if attribute == 'path': - self.update() + self.update(path=new) - def update(self): - self.objects = sorted(glob.glob(self.path)) + def update(self, path=Undefined): + if path is Undefined: + path = self.path + self.objects = sorted(glob.glob(path)) if self.default and all([o in self.objects for o in self.default]): return + elif not self.default: + return self.default = self.objects def get_range(self): diff --git a/tests/testfileselector.py b/tests/testfileselector.py index cfad21340..577029380 100644 --- a/tests/testfileselector.py +++ b/tests/testfileselector.py @@ -116,6 +116,14 @@ def test_set_path_and_update(self): # Default updated but not the value itself assert p.b == self.fa + def test_path_autoupdate(self): + p = self.P() + p.param.b.path = self.glob2 + assert p.param.b.objects == [self.fc, self.fd] + assert p.param.b.default in [self.fc, self.fd] + # Default updated but not the value itself + assert p.b == self.fa + def test_get_range(self): p = self.P() r = p.param.a.get_range() diff --git a/tests/testmultifileselector.py b/tests/testmultifileselector.py index b2fa338dc..f8ab71f03 100644 --- a/tests/testmultifileselector.py +++ b/tests/testmultifileselector.py @@ -121,6 +121,14 @@ def test_set_path_and_update(self): # Default updated but not the value itself assert p.b == [self.fa] + def test_path_autoupdate(self): + p = self.P() + p.param.b.path = self.glob2 + assert sorted(p.param.b.objects) == sorted([self.fc, self.fd]) + assert sorted(p.param.b.default) == sorted([self.fc, self.fd]) + # Default updated but not the value itself + assert p.b == [self.fa] + def test_get_range(self): p = self.P() r = p.param.a.get_range()