fitoprincipe / ipygee

A set of tools for working with Google Earth Engine Python API in Jupyter notebooks
MIT License
63 stars 19 forks source link

Task Manager: 'ipywidgets.widgets.utils' has no attribute 'format_elapsed' #13

Open tutuca opened 1 year ago

tutuca commented 1 year ago

Hi!. Thanks for the great library!

I happen to have an issue when using the task manager. Maybe it's a known issue.

It triggers in every tab of the task manager with non zero items (screenshot below).

Captura de Pantalla 2023-01-04 a la(s) 14 48 04

It's possible version mismatch for some api that was deprecated on ipywidgets.

Full traceback:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
File ~/.venv/lib/python3.9/site-packages/ipywidgets/widgets/widget.py:766, in Widget._handle_msg(self, msg)
    764         if 'buffer_paths' in data:
    765             _put_buffers(state, data['buffer_paths'], msg['buffers'])
--> 766         self.set_state(state)
    768 # Handle a state request.
    769 elif method == 'request_state':

File ~/.venv/lib/python3.9/site-packages/ipywidgets/widgets/widget.py:648, in Widget.set_state(self, sync_data)
    645 if name in self.keys:
    646     from_json = self.trait_metadata(name, 'from_json',
    647                                     self._trait_from_json)
--> 648     self.set_trait(name, from_json(sync_data[name], self))

File ~/.pyenv/versions/3.9.11/lib/python3.9/contextlib.py:126, in _GeneratorContextManager.__exit__(self, typ, value, traceback)
    124 if typ is None:
    125     try:
--> 126         next(self.gen)
    127     except StopIteration:
    128         return False

File ~/.venv/lib/python3.9/site-packages/traitlets/traitlets.py:1492, in HasTraits.hold_trait_notifications(self)
   1490 for changes in cache.values():
   1491     for change in changes:
-> 1492         self.notify_change(change)

File ~/.venv/lib/python3.9/site-packages/ipywidgets/widgets/widget.py:694, in Widget.notify_change(self, change)
    691     if name in self.keys and self._should_send_property(name, getattr(self, name)):
    692         # Send new state to front-end
    693         self.send_state(key=name)
--> 694 super().notify_change(change)

File ~/.venv/lib/python3.9/site-packages/traitlets/traitlets.py:1507, in HasTraits.notify_change(self, change)
   1505 def notify_change(self, change):
   1506     """Notify observers of a change event"""
-> 1507     return self._notify_observers(change)

File ~/.venv/lib/python3.9/site-packages/traitlets/traitlets.py:1554, in HasTraits._notify_observers(self, event)
   1551 elif isinstance(c, EventHandler) and c.name is not None:
   1552     c = getattr(self, c.name)
-> 1554 c(event)

File ~/.venv/lib/python3.9/site-packages/ipygee/tasks.py:497, in TaskTab.__init__.<locals>.on_select(change)
    495 if i not in self.rendered:
    496     self.show_loading(i)
--> 497     self.make(i)
    498     self.rendered.append(i)

File ~/.venv/lib/python3.9/site-packages/ipygee/tasks.py:514, in TaskTab.make(self, i)
    512 if self.limit:
    513     TL.limit = self.limit
--> 514 TL.make()
    515 vbox.children = [TL]

File ~/.venv/lib/python3.9/site-packages/ipygee/tasks.py:346, in TaskList.make(self)
    344     t = Task(task=task)
    345     tasklist.append(t)
--> 346     taskwid.append(HTML(t.html()))
    347     titles.append(t.title)
    349 self.tasks = tasklist

File ~/.venv/lib/python3.9/site-packages/ipygee/tasks.py:305, in Task.html(self)
    301 def html(self):
    302     template = self.templates.get(self.state)
    303     return template.format(
    304         creation = self.created.str,
--> 305         elapsed = self.since_creation.str,
    306         start = self.started.str,
    307         running = self.running.str,
    308         finish = self.finished.str,
    309         url = '</br>'.join(self.urls()) if self.urls() else '',
    310         error = self.error,
    311         failed = self.failed.str,
    312         cancel = self.cancelled.str,
    313         waiting = self.waiting.str,
    314         state = self.state
    315     )

File ~/.venv/lib/python3.9/site-packages/ipygee/tasks.py:261, in Task.since_creation(self)
    258 @property
    259 def since_creation(self):
    260     td = datetime.now().astimezone(tz.tzlocal()) - self.created.local
--> 261     return self._create_tuple_timedelta('SinceCreation', td)

File ~/.venv/lib/python3.9/site-packages/ipygee/tasks.py:132, in Task._create_tuple_timedelta(name, delta)
    129     return nt(delta=None, str='0s')
    131 seconds = delta.total_seconds()
--> 132 string = utils.format_elapsed(seconds)
    133 return nt(delta=delta, str=string)

AttributeError: module 'ipywidgets.widgets.utils' has no attribute 'format_elapsed'
tutuca commented 1 year ago

I could get it to work by making explicit imports instead of from traitles import *.

There are a couple of modules to review but I can get a PR in a couple more days. May be a bunch of test if I get some time.

Regards.

fitoprincipe commented 1 year ago

Hola @tutuca!

yes, probably that's the issue. I haven't used it for a while now, so I haven't had the change to get the same error. A PR would be great! Thank you