Skip to content

Commit

Permalink
Merge 11231db into 090d1c4
Browse files Browse the repository at this point in the history
  • Loading branch information
maximlt committed Oct 8, 2021
2 parents 090d1c4 + 11231db commit 124dde6
Show file tree
Hide file tree
Showing 3 changed files with 203 additions and 13 deletions.
26 changes: 13 additions & 13 deletions param/__init__.py
Expand Up @@ -1275,7 +1275,7 @@ def _validate(self, val):
limiter = ', ...]'
break
items = '[' + ', '.join(items) + limiter
raise ValueError("%s not in parameter%s's list of possible objects, "
raise ValueError("%r not in parameter%s's list of possible objects, "
"valid options include %s" % (val, attrib_name, items))

def _ensure_value_is_in_objects(self,val):
Expand Down Expand Up @@ -1823,20 +1823,20 @@ class FileSelector(Selector):
def __init__(self, default=None, path="", **kwargs):
self.default = default
self.path = path
self.update()
self.update(path)
super(FileSelector, self).__init__(default=default, objects=self.objects,
empty_default=True, **kwargs)

def _on_set(self, attribute, old, new):
super(FileSelector, self)._on_set(attribute, new, old)
super(FileSelector, self)._on_set(attribute, old, new)
if attribute == 'path':
self.update()
self.update(new)

def update(self):
self.objects = sorted(glob.glob(self.path))
def update(self, path):
self.objects = sorted(glob.glob(path))
if self.default in self.objects:
return
self.default = self.objects[0] if self.objects else None
self.default = None

def get_range(self):
return abbreviate_paths(self.path,super(FileSelector, self).get_range())
Expand Down Expand Up @@ -1876,19 +1876,19 @@ class MultiFileSelector(ListSelector):
def __init__(self, default=None, path="", **kwargs):
self.default = default
self.path = path
self.update()
self.update(path)
super(MultiFileSelector, self).__init__(default=default, objects=self.objects, **kwargs)

def _on_set(self, attribute, old, new):
super(MultiFileSelector, self)._on_set(attribute, new, old)
super(MultiFileSelector, self)._on_set(attribute, old, new)
if attribute == 'path':
self.update()
self.update(new)

def update(self):
self.objects = sorted(glob.glob(self.path))
def update(self, path):
self.objects = sorted(glob.glob(path))
if self.default and all([o in self.objects for o in self.default]):
return
self.default = self.objects
self.default = None

def get_range(self):
return abbreviate_paths(self.path,super(MultiFileSelector, self).get_range())
Expand Down
95 changes: 95 additions & 0 deletions tests/API1/testfileselector.py
@@ -0,0 +1,95 @@
import os
import shutil
import tempfile

import param

from . import API1TestCase


class TestFileSelectorParameters(API1TestCase):

def setUp(self):
super(TestFileSelectorParameters, self).setUp()

tmpdir1 = tempfile.mkdtemp()
fa = os.path.join(tmpdir1, 'a.txt')
fb = os.path.join(tmpdir1, 'b.txt')
glob1 = os.path.join(tmpdir1, '*')
open(fa, 'w').close()
open(fb, 'w').close()
tmpdir2 = tempfile.mkdtemp()
fc = os.path.join(tmpdir2, 'c.txt')
fd = os.path.join(tmpdir2, 'd.txt')
glob2 = os.path.join(tmpdir2, '*')
open(fc, 'w').close()
open(fd, 'w').close()

self.tmpdir1 = tmpdir1
self.tmpdir2 = tmpdir2
self.fa = fa
self.fb = fb
self.fc = fc
self.fd = fd
self.glob1 = glob1
self.glob2 = glob2

class P(param.Parameterized):
a = param.FileSelector(path=glob1)
b = param.FileSelector(default=fa, path=glob1)

self.P = P

def tearDown(self):
shutil.rmtree(self.tmpdir1)
shutil.rmtree(self.tmpdir2)

def test_default_is_None(self):
p = self.P()
assert p.a is None

def test_objects_auto_set(self):
p = self.P()
assert p.param.a.objects == [self.fa, self.fb]

def test_default_None(self):
class P(param.Parameterized):
a = param.FileSelector(default=None)

def test_default_not_in_glob(self):
with self.assertRaises(ValueError):
class P(param.Parameterized):
a = param.FileSelector(default='not/in/glob', path=self.glob1)

def test_set_object_constructor(self):
p = self.P(a=self.fb)
assert p.a == self.fb

def test_set_object_outside_bounds(self):
p = self.P()
with self.assertRaises(ValueError):
p.a = '/not/in/glob'

def test_update_path(self):
p = self.P()
p.param.a.path = self.glob2
assert p.param.a.objects == [self.fc, self.fd]

def test_update_path_reset_default(self):
p = self.P()
assert p.b == self.fa
assert p.param.b.default == self.fa
p.param.b.path = self.glob2
assert p.param.b.default is None
# 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()
assert r['a.txt'] == self.fa
assert r['b.txt'] == self.fb
p.param.a.path = self.glob2
r = p.param.a.get_range()
assert r['c.txt'] == self.fc
assert r['d.txt'] == self.fd
95 changes: 95 additions & 0 deletions tests/API1/testmultifileselector.py
@@ -0,0 +1,95 @@
import os
import shutil
import tempfile

import param

from . import API1TestCase


class TestFileSelectorParameters(API1TestCase):

def setUp(self):
super(TestFileSelectorParameters, self).setUp()

tmpdir1 = tempfile.mkdtemp()
fa = os.path.join(tmpdir1, 'a.txt')
fb = os.path.join(tmpdir1, 'b.txt')
glob1 = os.path.join(tmpdir1, '*')
open(fa, 'w').close()
open(fb, 'w').close()
tmpdir2 = tempfile.mkdtemp()
fc = os.path.join(tmpdir2, 'c.txt')
fd = os.path.join(tmpdir2, 'd.txt')
glob2 = os.path.join(tmpdir2, '*')
open(fc, 'w').close()
open(fd, 'w').close()

self.tmpdir1 = tmpdir1
self.tmpdir2 = tmpdir2
self.fa = fa
self.fb = fb
self.fc = fc
self.fd = fd
self.glob1 = glob1
self.glob2 = glob2

class P(param.Parameterized):
a = param.MultiFileSelector(path=glob1)
b = param.MultiFileSelector(default=[fa], path=glob1)

self.P = P

def tearDown(self):
shutil.rmtree(self.tmpdir1)
shutil.rmtree(self.tmpdir2)

def test_default_is_None(self):
p = self.P()
assert p.a is None

def test_objects_auto_set(self):
p = self.P()
assert p.param.a.objects == [self.fa, self.fb]

def test_default_None(self):
class P(param.Parameterized):
a = param.FileSelector(default=None)

def test_default_not_in_glob(self):
with self.assertRaises(ValueError):
class P(param.Parameterized):
a = param.FileSelector(default=['not/in/glob'], path=self.glob1)

def test_set_object_constructor(self):
p = self.P(a=[self.fb])
assert p.a == [self.fb]

def test_set_object_outside_bounds(self):
p = self.P()
with self.assertRaises(ValueError):
p.a = ['/not/in/glob']

def test_update_path(self):
p = self.P()
p.param.a.path = self.glob2
assert p.param.a.objects == [self.fc, self.fd]

def test_update_path_reset_default(self):
p = self.P()
assert p.b == [self.fa]
assert p.param.b.default == [self.fa]
p.param.b.path = self.glob2
assert p.param.b.default is None
# 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()
assert r['a.txt'] == self.fa
assert r['b.txt'] == self.fb
p.param.a.path = self.glob2
r = p.param.a.get_range()
assert r['c.txt'] == self.fc
assert r['d.txt'] == self.fd

0 comments on commit 124dde6

Please sign in to comment.