Skip to content

Commit

Permalink
[WB-4221] CLI now has ability to preprocess settings and uses this to…
Browse files Browse the repository at this point in the history
… strip slashes from URL (#1692)

* Added preprocess behavior
  • Loading branch information
tssweeney committed Jan 15, 2021
1 parent 7696137 commit c29463b
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 32 deletions.
12 changes: 12 additions & 0 deletions tests/wandb_settings_test.py
Expand Up @@ -224,3 +224,15 @@ def test_prio_context_over_ignore():
with s._as_source(s.Source.PROJECT, override=True) as s2:
s2.project = "pizza2"
assert s.project == "pizza"


def test_preprocess_base_url():
s = Settings()
s.update(base_url="http://host.com")
assert s.base_url == "http://host.com"
s.update(base_url="http://host.com/")
assert s.base_url == "http://host.com"
s.update(base_url="http://host.com///")
assert s.base_url == "http://host.com"
s.update(base_url="//http://host.com//")
assert s.base_url == "//http://host.com"
47 changes: 31 additions & 16 deletions wandb/sdk/wandb_settings.py
Expand Up @@ -560,6 +560,11 @@ def _validate_show_errors(self, value):
if val is None:
return "{} is not a boolean".format(value)

def _preprocess_base_url(self, value):
if value is not None:
value = value.rstrip("/")
return value

def _start_run(self):
datetime_now: datetime = datetime.now()
time_now: float = time.time()
Expand Down Expand Up @@ -676,30 +681,39 @@ def _check_invalid(self, k, v):
if invalid:
raise TypeError("Settings field {}: {}".format(k, invalid))

def _perform_preprocess(self, k, v):
f = getattr(self, "_preprocess_" + k, None)
if not f or not callable(f):
return v
else:
return f(v)

def _update(self, __d=None, _source=None, _override=None, **kwargs):
if self.__frozen and (__d or kwargs):
raise TypeError("Settings object is frozen")
d = __d or dict()
data = {}
for check in d, kwargs:
for k in six.viewkeys(check):
if k not in self.__dict__:
raise KeyError(k)
self._check_invalid(k, check[k])
for data in d, kwargs:
for k, v in six.iteritems(data):
if v is None:
continue
if self._priority_failed(k, source=_source, override=_override):
continue
if isinstance(v, list):
v = tuple(v)
self.__dict__[k] = v
if _source:
self.__defaults_dict[k] = _source
self.__defaults_dict_set.setdefault(k, set()).add(_source)
if _override:
self.__override_dict[k] = _override
self.__override_dict_set.setdefault(k, set()).add(_override)
v = self._perform_preprocess(k, check[k])
self._check_invalid(k, v)
data[k] = v
for k, v in six.iteritems(data):
if v is None:
continue
if self._priority_failed(k, source=_source, override=_override):
continue
if isinstance(v, list):
v = tuple(v)
self.__dict__[k] = v
if _source:
self.__defaults_dict[k] = _source
self.__defaults_dict_set.setdefault(k, set()).add(_source)
if _override:
self.__override_dict[k] = _override
self.__override_dict_set.setdefault(k, set()).add(_override)

def update(self, __d=None, **kwargs):
self._update(__d, **kwargs)
Expand Down Expand Up @@ -812,6 +826,7 @@ def __setattr__(self, name, value):
raise AttributeError(name)
if self.__frozen:
raise TypeError("Settings object is frozen")
value = self._perform_preprocess(name, value)
self._check_invalid(name, value)
object.__setattr__(self, name, value)

Expand Down
47 changes: 31 additions & 16 deletions wandb/sdk_py27/wandb_settings.py
Expand Up @@ -560,6 +560,11 @@ def _validate_show_errors(self, value):
if val is None:
return "{} is not a boolean".format(value)

def _preprocess_base_url(self, value):
if value is not None:
value = value.rstrip("/")
return value

def _start_run(self):
datetime_now = datetime.now()
time_now = time.time()
Expand Down Expand Up @@ -676,30 +681,39 @@ def _check_invalid(self, k, v):
if invalid:
raise TypeError("Settings field {}: {}".format(k, invalid))

def _perform_preprocess(self, k, v):
f = getattr(self, "_preprocess_" + k, None)
if not f or not callable(f):
return v
else:
return f(v)

def _update(self, __d=None, _source=None, _override=None, **kwargs):
if self.__frozen and (__d or kwargs):
raise TypeError("Settings object is frozen")
d = __d or dict()
data = {}
for check in d, kwargs:
for k in six.viewkeys(check):
if k not in self.__dict__:
raise KeyError(k)
self._check_invalid(k, check[k])
for data in d, kwargs:
for k, v in six.iteritems(data):
if v is None:
continue
if self._priority_failed(k, source=_source, override=_override):
continue
if isinstance(v, list):
v = tuple(v)
self.__dict__[k] = v
if _source:
self.__defaults_dict[k] = _source
self.__defaults_dict_set.setdefault(k, set()).add(_source)
if _override:
self.__override_dict[k] = _override
self.__override_dict_set.setdefault(k, set()).add(_override)
v = self._perform_preprocess(k, check[k])
self._check_invalid(k, v)
data[k] = v
for k, v in six.iteritems(data):
if v is None:
continue
if self._priority_failed(k, source=_source, override=_override):
continue
if isinstance(v, list):
v = tuple(v)
self.__dict__[k] = v
if _source:
self.__defaults_dict[k] = _source
self.__defaults_dict_set.setdefault(k, set()).add(_source)
if _override:
self.__override_dict[k] = _override
self.__override_dict_set.setdefault(k, set()).add(_override)

def update(self, __d=None, **kwargs):
self._update(__d, **kwargs)
Expand Down Expand Up @@ -812,6 +826,7 @@ def __setattr__(self, name, value):
raise AttributeError(name)
if self.__frozen:
raise TypeError("Settings object is frozen")
value = self._perform_preprocess(name, value)
self._check_invalid(name, value)
object.__setattr__(self, name, value)

Expand Down

0 comments on commit c29463b

Please sign in to comment.