Skip to content

Commit

Permalink
feat: add initial component browser
Browse files Browse the repository at this point in the history
  • Loading branch information
sanjayankur31 committed Aug 15, 2024
1 parent 8f00b4d commit 296d91e
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 42 deletions.
91 changes: 50 additions & 41 deletions neuroml_widgets/component.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,71 +6,80 @@
Copyright 2024 NeuroML contributors
"""

import logging

import ipywidgets
import neuroml

logger = logging.getLogger(__name__)
logger.setLevel(logging.ERROR)

logger.debug(f"Logger setup for {__name__}")

def component2widget(component: neuroml.nml.nml.GeneratedsSuperSuper, recursing=False):

def component2widget(component: neuroml.nml.nml.GeneratedsSuperSuper, member_limit=10):
"""Create a widget from a NeuroML component object
:param component: TODO
:returns: TODO
"""
logger.debug(f"Processing {component.__class__.__name__}")
members = component.info(show_contents=True, return_format="dict")
widgets = []

try:
if members["id"] is not None:
widgets.append(
ipywidgets.HTML(
value=f"<h2>{component.__class__.__name__}: {members.pop('id')['members']}</h2><br>"
)
)
title = f"{component.__class__.__name__}: {members.pop('id')['members']}"
else:
title = f"{component.__class__.__name__}"
except KeyError:
widgets.append(
ipywidgets.HTML(value=f"<h2>{component.__class__.__name__}</h2><br>")
)
title = f"{component.__class__.__name__}"
logger.debug(f"Got title: {title}")

field_members = []
container_members = {}
container_widgets = []
for m, contents in members.items():
# can either be a string, or an object, or a list of objects
cont = contents["members"]
if cont:
if not isinstance(cont, list):
if isinstance(cont, str):
field_members.append(f"<li>{m}: {contents['members']}</li>")
if isinstance(cont, (str, float, int)):
logger.debug(f"Got a string/float member: {m}")
field_members.append(f"<li><b>{m}</b>: {contents['members']}</li>")
elif isinstance(cont, object):
# TODO: figure out how to handle these
continue
container_members[m] = component2widget(
contents["members"], recursing=True
)
logger.debug(f"Got an object member: {m}")
container_widgets.append(component2widget(contents["members"]))
else:
logger.error(f"What did we get? {m}")
else:
# TODO: figure out how to handle these
continue
container_widgets = []
for x in cont:
container_widgets.append(component2widget(x, recursing=True))
container_members[m] = container_widgets
logger.debug(f"Got list member: {m} ({len(cont)} members)")
if len(cont) > member_limit:
field_members.append(
f"<li><b>{m}</b>: {len(cont)} members (not shown)</li>"
)
else:
for x in cont:
logger.debug(f"Processing list member: {m}")
container_widgets.append(component2widget(x))

widgets = []
if len(field_members) > 0:
widgets.append(ipywidgets.HTML(value="<ul>"))
fields_html_string = ""
fields_html_string += "<ul>"
for m in field_members:
widgets.append(ipywidgets.HTML(value=m))
widgets.append(ipywidgets.HTML(value="</ul>"))
widgets.append(ipywidgets.HTML(value="</br>"))

print(container_members)
widgets.append(
ipywidgets.Accordion(
children=tuple(container_members.values()),
titles=tuple(container_members.keys()),
)
)
fields_html_string += m
fields_html_string += "</ul></br>"

widgets.append(ipywidgets.HTML(value=fields_html_string))

if not recursing:
return ipywidgets.HBox(widgets)
else:
return widgets
widgets.extend(container_widgets)
widgets = [x for x in widgets if x is not None]

if len(widgets) > 0:
logger.debug(widgets)
logger.debug(f"There are {len(widgets)} widgets")

return (
ipywidgets.Accordion(children=[ipywidgets.VBox(widgets)], titles=[title])
if len(widgets) > 0
else None
)
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[metadata]
name = neuroml-widgets
name = neuroml_widgets
version = 0.0.1
author = Ankur Sinha
author_email = ankursinha@ucl.ac.uk
Expand Down

0 comments on commit 296d91e

Please sign in to comment.