Objexplore is an interactive Python object explorer for the terminal.

Related tags

CLI Tools objexplore
Overview

logo

Objexplore is an interactive Python object explorer for the terminal. Use it while debugging, or exploring a new library, or whatever!

cibuild pypi downloads

9D1FAC73-B2A5-4B6F-99DF-0D393E3DEAC2.mov

Install

pip install objexplore

or

pip install git+https://github.com/kylepollina/objexplore

Usage

from objexplore import explore
import rich
explore(rich)

Features

Exploring

F30E6C7B-A5F9-4E81-B777-B6C1FDDC6245.mov

Type Filters

BE95B2B8-A3CA-49E9-B415-DDD8783501FB.mov

Search Filters

7F15E1B1-C368-49DA-A89C-394C1A5F1B44.mov

Stack view

6F09C23D-E7AB-49FF-BA42-DDED7AEA6F08.mov

Exploring and returning

94FA8872-AE91-483F-AFBC-5A023E2D2FFE.mov

Built with the amazing rich and blessed packages. Check them out!

Contributing

Read CONTRIBUTING.md


LICENSE

Comments
  • Unable to explore a pandas DataFrame

    Unable to explore a pandas DataFrame

    Describe the bug

    A ValueError is raised when exploring a pandas DataFrame, which is related to objexplore.utils.is_selectable.

    In [1]: import objexplore                                                      
    In [2]: import pandas as pd                                                    
    In [3]: df = pd.DataFrame()                                                    
    In [4]: objexplore.utils.is_selectable(df)      
    

    Traceback

    ValueError                                Traceback (most recent call last)
    <ipython-input-4-b894c6ec269f> in <module>
    ----> 1 objexplore.utils.is_selectable(df)
    
    <...>/lib/python3.7/site-packages/objexplore/utils.py in is_selectable(obj)
          1 def is_selectable(obj):
    ----> 2     return obj not in (None, [], (), {}, set())
    
    <...>/lib/python3.7/site-packages/pandas-1.0.5-py3.7-linux-x86_64.egg/pandas/core/generic.py in __nonzero__(self)
       1477     def __nonzero__(self):
       1478         raise ValueError(
    -> 1479             f"The truth value of a {type(self).__name__} is ambiguous. "
       1480             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
       1481         )
    
    ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
    
    
    opened by lodagro 2
  • AttributeError: module 'signal' has no attribute 'SIGWINCH'

    AttributeError: module 'signal' has no attribute 'SIGWINCH'

    I attempted to use the basic code in the tutorial:

    """ from objexplore import explore import pandas explore(pandas) """

    And received the following error:

    ╭──────────────────────────── Traceback (most recent call last) ────────────────────────────╮ │ C:\ProgramData\Anaconda3\envs\Fast_AI\lib\site-packages\objexplore\objexplore.py:334 in │ │ explore │ │ │ │ 331 def explore(obj: Any) -> Any: │ │ 332 │ """ Run the explorer on the given object """ │ │ 333 │ try: │ │ ❱ 334 │ │ e = Explorer(obj) │ │ 335 │ │ return e.explore() │ │ 336 │ except Exception as e: │ │ 337 │ │ console.print_exception(show_locals=True) │ │ │ │ ╭─────────────────────────────────────── locals ────────────────────────────────────────╮ │ │ │ e = AttributeError("module 'signal' has no attribute 'SIGWINCH'") │ │ │ │ obj = <module 'numpy' from │ │ │ │ 'C:\ProgramData\Anaconda3\envs\Fast_AI\lib\site-packages\numpy\_init… │ │ │ ╰───────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ C:\ProgramData\Anaconda3\envs\Fast_AI\lib\site-packages\objexplore\objexplore.py:57 in │ │ init │ │ │ │ 54 │ │ ) │ │ 55 │ │ │ │ 56 │ │ # Run self.draw() whenever the win change signal is caught │ │ ❱ 57 │ │ signal.signal(signal.SIGWINCH, self.draw) │ │ 58 │ │ │ 59 │ def explore(self) -> Optional[Any]: │ │ 60 │ │ """ Open the interactive explorer """ │ │ │ │ ╭─────────────────────────────────────── locals ────────────────────────────────────────╮ │ │ │ cached_obj = <objexplore.cached_object.CachedObject object at 0x000002B7BF0595E0> │ │ │ │ obj = <module 'numpy' from │ │ │ │ 'C:\ProgramData\Anaconda3\envs\Fast_AI\lib\site-packages\numpy\… │ │ │ │ self = <objexplore.objexplore.Explorer object at 0x000002B7BF0593D0> │ │ │ ╰───────────────────────────────────────────────────────────────────────────────────────╯ │ ╰───────────────────────────────────────────────────────────────────────────────────────────╯ AttributeError: module 'signal' has no attribute 'SIGWINCH'

    I also tried to use explore(numpy) and received the same error.

    opened by Buckeyes2019 2
  • Add LICENSE

    Add LICENSE

    Is your feature request related to a problem? Please describe. No license is specified which will prevent some authors (including me) from using objexplore in our own code.

    Describe the solution you'd like Include a permissive open source license. My preference is MIT License which is the same license rich uses (which is used in objexplore).

    Describe alternatives you've considered N/A -- code without a license is a potential legal liability for any project.

    Additional context N/A

    opened by RhetTbull 2
  • Might be helpful to require rich version a bit more loosely

    Might be helpful to require rich version a bit more loosely

    In no way a real blocker - especially as objexplore used primarily/solely in a local dev environment.

    Rich has become really popular, and I use it in a lot of my own code, especially in django management commands. I then choose to use objexplore sometimes in debugging.

    It would be helpful for me if objexplore defined a range of (prior) rich releases that were compatible (if that were possible), so that the (pinned) rich requirement in my app was not so likely to conflict.

    Not a big deal, just means I may sometimes have to reinstall objexplore to use it, as subsequent installs of my apps requirements.txt will have defined a different version of rich, and required me to uninstall objexplore if it conflicts.

    If this makes testing/maintenance/development difficult please ignore/close, happy to install when I need/want it.

    opened by tombola 1
  • Be able to index through any iterable object

    Be able to index through any iterable object

    Some custom objects can be iterated through using iter() but currently this only supports indexing lists, dicts, sets, and tuples. I want to be able to support indexing any object that can be itereated through

    enhancement 
    opened by kylepollina 1
  • Show submodules that are not initialized within __init__.py

    Show submodules that are not initialized within __init__.py

    Is your feature request related to a problem? Please describe. Some packages don't import all of the submodules that are located within it. These can only be accessed using the pkgutil module. This should be built in

    opened by kylepollina 1
  • Pinned install dependencies

    Pinned install dependencies

    Fixes issue #3 by pinning dependencies in setup.py. Also, note that your requirements.txt doesn't include flake8 so make check fails until flake8 is installed. I did not fix this as wasn't sure which version you're using.

    [I] ➜ make check
    mypy objexplore
    Success: no issues found in 8 source files
    flake8 .
    (objexplore)
    objexplore on fix_dependencies [!?] via objexplore via 🐍 objexplore took 2s
    [I] ➜ make format
    black .
    All done! ✨ 🍰 ✨
    9 files left unchanged.
    
    opened by RhetTbull 1
  • __init__() got an unexpected keyword argument 'subtitle'

    __init__() got an unexpected keyword argument 'subtitle'

    Describe the bug Using explore() with rich < 10.8.0 installed causes "unexpected keyword argument 'subtitle'" error. requirements.txt specifies rich==10.9.0 but because setup.py does not, pip happily installs objexplore if an older rich version is already installed.

    pip install objexplore
    Collecting objexplore
      Downloading objexplore-1.2.3-py3-none-any.whl (14 kB)
    Requirement already satisfied: rich in /Users/rhet/.pyenv/versions/osxphotos-3.9.5/lib/python3.9/site-packages (from objexplore) (10.6.0)
    ...
    

    Traceback

    ╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
    │ /Users/rhet/.pyenv/versions/osxphotos-3.9.5/lib/python3.9/site-packages/objexplore/objexplore.py │
    │ :326 in explore                                                                                  │
    │                                                                                                  │
    │   323 │   """ Run the explorer on the given object """                                           │
    │   324 │   try:                                                                                   │
    │   325 │   │   e = Explorer(obj)                                                                  │
    │ ❱ 326 │   │   return e.explore()                                                                 │
    │   327 │   except Exception as e:                                                                 │
    │   328 │   │   console.print_exception(show_locals=True)                                          │
    │   329 │   │   print()                                                                            │
    │                                                                                                  │
    │ ╭────────────────────────────────── locals ───────────────────────────────────╮                  │
    │ │   e = TypeError("__init__() got an unexpected keyword argument 'subtitle'") │                  │
    │ │ obj = <class 'osxphotos.photoinfo.photoinfo.PhotoInfo'>                     │                  │
    │ ╰─────────────────────────────────────────────────────────────────────────────╯                  │
    │                                                                                                  │
    │ /Users/rhet/.pyenv/versions/osxphotos-3.9.5/lib/python3.9/site-packages/objexplore/objexplore.py │
    │ :74 in explore                                                                                   │
    │                                                                                                  │
    │    71 │   │   with self.term.cbreak(), self.term.hidden_cursor():                                │
    │    72 │   │   │   while key not in ("q", "Q"):                                                   │
    │    73 │   │   │   │   try:                                                                       │
    │ ❱  74 │   │   │   │   │   self.draw()                                                            │
    │    75 │   │   │   │   │   key = self.term.inkey()                                                │
    │    76 │   │   │   │   │   res = self.process_key_event(key)                                      │
    │    77                                                                                            │
    │                                                                                                  │
    │ ╭───────────────────────────── locals ─────────────────────────────╮                             │
    │ │  key = None                                                      │                             │
    │ │  res = None                                                      │                             │
    │ │ self = <objexplore.objexplore.Explorer object at 0x7fe59d3d93d0> │                             │
    │ ╰──────────────────────────────────────────────────────────────────╯                             │
    │                                                                                                  │
    │ /Users/rhet/.pyenv/versions/osxphotos-3.9.5/lib/python3.9/site-packages/objexplore/objexplore.py │
    │ :295 in draw                                                                                     │
    │                                                                                                  │
    │   292 │   │   print(self.term.home, end="")                                                      │
    │   293 │   │   layout = Layout()                                                                  │
    │   294 │   │                                                                                      │
    │ ❱ 295 │   │   layout.split_row(self.get_explorer_layout(), self.get_overview_layout())           │
    │   296 │   │                                                                                      │
    │   297 │   │   title = self.cached_obj.title                                                      │
    │   298                                                                                            │
    │                                                                                                  │
    │ ╭────────────────────────────── locals ──────────────────────────────╮                           │
    │ │   args = ()                                                        │                           │
    │ │ layout = Layout()                                                  │                           │
    │ │   self = <objexplore.objexplore.Explorer object at 0x7fe59d3d93d0> │                           │
    │ ╰────────────────────────────────────────────────────────────────────╯                           │
    │                                                                                                  │
    │ /Users/rhet/.pyenv/versions/osxphotos-3.9.5/lib/python3.9/site-packages/objexplore/objexplore.py │
    │ :276 in get_explorer_layout                                                                      │
    │                                                                                                  │
    │   273 │   │   │   )                                                                              │
    │   274 │   │   │   return layout                                                                  │
    │   275 │   │   else:                                                                              │
    │ ❱ 276 │   │   │   return self.explorer_layout(                                                   │
    │   277 │   │   │   │   term_width=self.term.width, term_height=self.term.height                   │
    │   278 │   │   │   )                                                                              │
    │   279                                                                                            │
    │                                                                                                  │
    │ ╭───────────────────────────── locals ─────────────────────────────╮                             │
    │ │ self = <objexplore.objexplore.Explorer object at 0x7fe59d3d93d0> │                             │
    │ ╰──────────────────────────────────────────────────────────────────╯                             │
    │                                                                                                  │
    │ /Users/rhet/.pyenv/versions/osxphotos-3.9.5/lib/python3.9/site-packages/objexplore/explorer_layo │
    │ ut.py:188 in __call__                                                                            │
    │                                                                                                  │
    │   185 │   │   │   return self.list_layout(term_width, term_height)                               │
    │   186 │   │                                                                                      │
    │   187 │   │   else:                                                                              │
    │ ❱ 188 │   │   │   return self.dir_layout(term_width)                                             │
    │   189 │                                                                                          │
    │   190 │   def dir_layout(self, term_width: int) -> Layout:                                       │
    │   191 │   │   lines = []                                                                         │
    │                                                                                                  │
    │ ╭──────────── locals ────────────╮                                                               │
    │ │        self = ExplorerLayout() │                                                               │
    │ │ term_height = 36               │                                                               │
    │ │  term_width = 120              │                                                               │
    │ ╰────────────────────────────────╯                                                               │
    │                                                                                                  │
    │ /Users/rhet/.pyenv/versions/osxphotos-3.9.5/lib/python3.9/site-packages/objexplore/explorer_layo │
    │ ut.py:228 in dir_layout                                                                          │
    │                                                                                                  │
    │   225 │   │   │   title = title.split("|")[-1].strip()                                           │
    │   226 │   │                                                                                      │
    │   227 │   │   self.update(                                                                       │
    │ ❱ 228 │   │   │   Panel(                                                                         │
    │   229 │   │   │   │   renderable,                                                                │
    │   230 │   │   │   │   title=title,                                                               │
    │   231 │   │   │   │   title_align="right",                                                       │
    │                                                                                                  │
    │ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
    │ │      _line = <text 'width' []>                                                               │ │
    │ │      index = 87                                                                              │ │
    │ │       line = <text 'width' []>                                                               │ │
    │ │      lines = [                                                                               │ │
    │ │              │   <text 'ExifInfo' []>,                                                       │ │
    │ │              │   <text 'ExportResults' []>,                                                  │ │
    │ │              │   <text 'ScoreInfo' []>,                                                      │ │
    │ │              │   <text 'SearchInfo' []>,                                                     │ │
    │ │              │   <text 'adjustments' []>,                                                    │ │
    │ │              │   <text 'album_info' []>,                                                     │ │
    │ │              │   <text 'albums' []>,                                                         │ │
    │ │              │   <text 'asdict' []>,                                                         │ │
    │ │              │   <text 'burst' []>,                                                          │ │
    │ │              │   <text 'burst_album_info' []>,                                               │ │
    │ │              │   ... +78                                                                     │ │
    │ │              ]                                                                               │ │
    │ │ renderable = <text                                                                           │ │
    │ │              'ExifInfo\nExportResults\nScoreInfo\nSearchInfo\nadjustments\nalbum_info\nalbu… │ │
    │ │              [Span(0, 8, 'dim italic reverse'), Span(9, 22, 'dim italic'), Span(23, 32, 'dim │ │
    │ │              italic'), Span(33, 43, 'dim italic'), Span(74, 80, 'dim italic'), Span(238,     │ │
    │ │              251, 'dim italic'), Span(282, 288, 'dim italic'), Span(289, 296, 'dim italic'), │ │
    │ │              Span(465, 469, 'dim italic'), Span(769, 784, 'dim italic')]>                    │ │
    │ │       self = ExplorerLayout()                                                                │ │
    │ │   subtitle = '[dim][u][][/u]:switch pane                                                     │ │
    │ │              [/dim][white]([/white][magenta]1[/magenta][white]/[/w'+34                       │ │
    │ │ term_width = 120                                                                             │ │
    │ │      title = '[i][cyan]dir[/cyan]()[/i] | [u]public[/u] [dim]private[/dim]'                  │ │
    │ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
    ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
    TypeError: __init__() got an unexpected keyword argument 'subtitle'
    
    Uh oh... Foiled again!
    Please report the issue here:
       https://github.com/kylepollina/objexplore/issues/new?assignees=&labels=&template=bug_report.md&title=__init__()+got+a
    n+unexpected+keyword+argument+'subtitle'
    Make sure to copy/paste the above traceback to the issue to make the issue quicker to solve!
    

    Expected behavior setup.py would specify the correct version of rich so that pip will fetch it.

    Additional context Add any other context about the problem here.

    opened by RhetTbull 0
  • Dictionary/list/set/tuple explorer

    Dictionary/list/set/tuple explorer

    Eventually I would like to have a built in explorer for built in types like dicts, lists, sets, tuples so I can go through each element in them and explore those as well.

    enhancement 
    opened by kylepollina 0
  • __init__() got an unexpected keyword argument 'subtitle'

    __init__() got an unexpected keyword argument 'subtitle'

    Describe the bug

    Newly installed through conda-forge, opened in python to check out features... Immediately got exception.

    >>> import objexplore as obex
    >>> obex.inspect(obex)
    TypeError: __init__() got an unexpected keyword argument 'subtitle'
    >>> import objexplore as obex2
    >>> obex.inspect(obex2)
    TypeError: __init__() got an unexpected keyword argument 'subtitle'
    >>> quit()
    

    New instance:

    >>> import objexplore as obex
    >>> obex.inspect(int)
    TypeError: __init__() got an unexpected keyword argument 'subtitle'
    

    Traceback

    ╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
    │ /home/tristan/micromamba/envs/psychScraper/lib/python3.9/site-packages/objexplore/objexplore.py: │
    │ 446 in explore                                                                                   │
    │                                                                                                  │
    │   443 │   name = frame.f_back.f_code.co_names[1]  # type: ignore                                 │
    │   444 │   app = ObjExploreApp(obj, name=name)                                                    │
    │   445 │   try:                                                                                   │
    │ ❱ 446 │   │   return app.explore()                                                               │
    │   447 │                                                                                          │
    │   448 │   except Exception as err:                                                               │
    │   449 │   │   print(app.term.move_down(app.term.height))                                         │
    │                                                                                                  │
    │ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
    │ │   app = <objexplore.objexplore.ObjExploreApp object at 0x7fa5025d0f40>                       │ │
    │ │   err = TypeError("__init__() got an unexpected keyword argument 'subtitle'")                │ │
    │ │ frame = <frame at 0x7fa501913040, file                                                       │ │
    │ │         '/home/tristan/micromamba/envs/psychScraper/lib/python3.9/site-packages/objexplore/… │ │
    │ │         line 450, code explore>                                                              │ │
    │ │  name = 'explore'                                                                            │ │
    │ │   obj = <class 'int'>                                                                        │ │
    │ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
    │                                                                                                  │
    │ /home/tristan/micromamba/envs/psychScraper/lib/python3.9/site-packages/objexplore/objexplore.py: │
    │ 71 in explore                                                                                    │
    │                                                                                                  │
    │    68 │   │   with self.term.cbreak(), self.term.hidden_cursor():                                │
    │    69 │   │   │   while True:                                                                    │
    │    70 │   │   │   │   try:                                                                       │
    │ ❱  71 │   │   │   │   │   self.draw()                                                            │
    │    72 │   │   │   │   │   key = self.term.inkey()                                                │
    │    73 │   │   │   │   │   self.process_key_event(key)                                            │
    │    74                                                                                            │
    │                                                                                                  │
    │ ╭─────────────────────────────── locals ────────────────────────────────╮                        │
    │ │  key = None                                                           │                        │
    │ │  res = None                                                           │                        │
    │ │ self = <objexplore.objexplore.ObjExploreApp object at 0x7fa5025d0f40> │                        │
    │ ╰───────────────────────────────────────────────────────────────────────╯                        │
    │                                                                                                  │
    │ /home/tristan/micromamba/envs/psychScraper/lib/python3.9/site-packages/objexplore/objexplore.py: │
    │ 386 in draw                                                                                      │
    │                                                                                                  │
    │   383 │   │   print(self.term.home, end="")                                                      │
    │   384 │   │   layout = Layout()                                                                  │
    │   385 │   │   layout.split_row(                                                                  │
    │ ❱ 386 │   │   │   self.explorer.get_layout(),                                                    │
    │   387 │   │   │   self.overview.get_layout(self.explorer.selected_object),                       │
    │   388 │   │   )                                                                                  │
    │   389                                                                                            │
    │                                                                                                  │
    │ ╭──────────────────────────────── locals ─────────────────────────────────╮                      │
    │ │      _ = ()                                                             │                      │
    │ │ layout = Layout()                                                       │                      │
    │ │   self = <objexplore.objexplore.ObjExploreApp object at 0x7fa5025d0f40> │                      │
    │ ╰─────────────────────────────────────────────────────────────────────────╯                      │
    │                                                                                                  │
    │ /home/tristan/micromamba/envs/psychScraper/lib/python3.9/site-packages/objexplore/explorer.py:10 │
    │ 3 in get_layout                                                                                  │
    │                                                                                                  │
    │   100 │   │   │   top_panel = self.list_panel                                                    │
    │   101 │   │                                                                                      │
    │   102 │   │   else:                                                                              │
    │ ❱ 103 │   │   │   top_panel = self.dir_panel                                                     │
    │   104 │   │                                                                                      │
    │   105 │   │   if self.filter.layout.visible:                                                     │
    │   106 │   │   │   combined_layout = Layout()                                                     │
    │                                                                                                  │
    │ ╭───────────────────────────────── locals ──────────────────────────────────╮                    │
    │ │ explorer_layout = Layout(size=34)                                         │                    │
    │ │            self = <objexplore.explorer.Explorer object at 0x7fa5019128b0> │                    │
    │ ╰───────────────────────────────────────────────────────────────────────────╯                    │
    │                                                                                                  │
    │ /home/tristan/micromamba/envs/psychScraper/lib/python3.9/site-packages/objexplore/explorer.py:24 │
    │ 3 in dir_panel                                                                                   │
    │                                                                                                  │
    │   240 │   │   │   elif self.state == ExplorerState.private:                                      │
    │   241 │   │   │   │   title = "[u]private"                                                       │
    │   242 │   │                                                                                      │
    │ ❱ 243 │   │   return Panel(                                                                      │
    │   244 │   │   │   renderable,                                                                    │
    │   245 │   │   │   title=title,                                                                   │
    │   246 │   │   │   title_align="right",                                                           │
    │                                                                                                  │
    │ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
    │ │           attr = 'to_bytes'                                                                  │ │
    │ │     cached_obj = <objexplore.cached_object.CachedObject object at 0x7fa501912280>            │ │
    │ │          index = 8                                                                           │ │
    │ │           line = <text 'to_bytes()' [Span(8, 10, 'white')]>                                  │ │
    │ │          lines = [                                                                           │ │
    │ │                  │   <text 'as_integer_ratio()' [Span(16, 18, 'white')]>,                    │ │
    │ │                  │   <text 'bit_length()' [Span(10, 12, 'white')]>,                          │ │
    │ │                  │   <text 'conjugate()' [Span(9, 11, 'white')]>,                            │ │
    │ │                  │   <text 'denominator' []>,                                                │ │
    │ │                  │   <text 'from_bytes()' [Span(10, 12, 'white')]>,                          │ │
    │ │                  │   <text 'imag' []>,                                                       │ │
    │ │                  │   <text 'numerator' []>,                                                  │ │
    │ │                  │   <text 'real' []>,                                                       │ │
    │ │                  │   <text 'to_bytes()' [Span(8, 10, 'white')]>                              │ │
    │ │                  ]                                                                           │ │
    │ │     renderable = <text                                                                       │ │
    │ │                  'as_integer_ratio()\nbit_length()\nconjugate()\ndenominator\nfrom_bytes()\… │ │
    │ │                  [Span(0, 18, 'italic reverse cyan'), Span(16, 18, 'white'), Span(19, 31,    │ │
    │ │                  'italic cyan'), Span(29, 31, 'white'), Span(32, 43, 'italic cyan'),         │ │
    │ │                  Span(41, 43, 'white'), Span(56, 68, 'italic cyan'), Span(66, 68, 'white'),  │ │
    │ │                  Span(89, 99, 'italic cyan'), Span(97, 99, 'white')]>                        │ │
    │ │           self = <objexplore.explorer.Explorer object at 0x7fa5019128b0>                     │ │
    │ │       subtitle = '[dim][u][][/u]:switch pane                                                 │ │
    │ │                  [/dim][white]([/white][magenta]1[/magenta][white]/[/w'+33                   │ │
    │ │  subtitle_help = '[dim][u][][/u]:switch pane [/dim]'                                         │ │
    │ │ subtitle_index = '[white]([/white][magenta]1[/magenta][white]/[/white][magenta]9[/magenta][… │ │
    │ │          title = '[i][cyan]dir[/cyan]()[/i] | [u]public[/u] [dim]private[/dim]'              │ │
    │ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
    ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
    

    Expected behavior

    Beautifully formatted module contents

    Additional context

    Python 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:58:50)
    [GCC 10.3.0] on linux
    

    Running under WSL

    >>> objexplore.version
    '1.6.3'
    
    $> micromamba list objexplore
    List of packages in environment: "/home/tristan/micromamba/envs/psychScraper"
    
      Name        Version  Build         Channel
    ──────────────────────────────────────────────────
      objexplore  1.6.3    pyhd8ed1ab_0  conda-forge
    
    opened by volkswagenfeature 1
  • Scrollable search filter

    Scrollable search filter

    Currently when the search filter gets too long it cuts off any part of the filter it can not see. I would like the filter to scroll to the right when the filter gets longer than the panel so you can see where the cursor is.

    Screen Shot 2021-10-09 at 10 08 02 AM Screen Shot 2021-10-09 at 10 08 17 AM

    enhancement 
    opened by kylepollina 0
  • Support readline keybindings in the search filter

    Support readline keybindings in the search filter

    I want to be able to use the commands listed here: https://www.gnu.org/software/bash/manual/html_node/Commands-For-Moving.html for moving around in the search filter.

    enhancement 
    opened by kylepollina 0
  • Highlighted object on stack view should be shown on the overview panel

    Highlighted object on stack view should be shown on the overview panel

    When I have the stack view open, I would like the preview layout on the right side to update with the dir/preview/type/docstring of the highlighted object on the stack.

    Currently, the explorer and preview windows only explore the object last on the stack.

    Screen Shot 2021-10-09 at 10 00 20 AM

    Basically I want everything to update based on what's currently highlighted on the stack.

    enhancement 
    opened by kylepollina 0
Owner
kylepollina
Birdwatcher
kylepollina
An interactive aquarium for your terminal.

sipedon An interactive aquarium for your terminal, written using pytermgui. The project got its name from the Common Watersnake, also known as Nerodia

null 17 Nov 7, 2022
Gamestonk Terminal is an awesome stock and crypto market terminal

Gamestonk Terminal is an awesome stock and crypto market terminal. A FOSS alternative to Bloomberg Terminal.

Gamestonk Terminal 18.6k Jan 3, 2023
Simple Python Library to display text with color in Python Terminal

pyTextColor v1.0 Introduction pyTextColor is a simple Python Library to display colorful outputs in Terminal, etc. Note: Your Terminal or any software

Siddhesh Chavan 1 Jan 23, 2022
Interactive Python interpreter for executing commands within Node.js

Python Interactive Interactive Python interpreter for executing commands within Node.js. This module provides a means of using the Python interactive

Louis Lefevre 2 Sep 21, 2022
Python commandline tool for remembering linux/terminal commands

ehh Remember linux commands Commandline tool for remembering linux/terminal commands. It stores your favorite commands in ~/ehh.json in your homedir a

null 56 Nov 10, 2022
Rich is a Python library for rich text and beautiful formatting in the terminal.

The Rich API makes it easy to add color and style to terminal output. Rich can also render pretty tables, progress bars, markdown, syntax highlighted source code, tracebacks, and more — out of the box.

Will McGugan 41.4k Jan 3, 2023
Module for converting 2D Python lists to fancy ASCII tables. Table2Ascii lets you display pretty tables in the terminal and on Discord.

table2ascii Module for converting 2D Python lists to a fancy ASCII/Unicode tables table2ascii ?? Installation ??‍?? Usage Convert lists to ASCII table

Jonah Lawrence 40 Jan 3, 2023
Display Images in your terminal with python

A python library to display images in the terminal

Pranav Baburaj 57 Dec 30, 2022
Features terminal for python

Features Terminal V1.0 (23/10/2021) Um programa para linux com diferentes ferramentas! Recursos: Criador de QR code Gerador de senhas Teste de velocid

null 1 Oct 26, 2021
A simple terminal-based localhost chat application written in python

Chat House A simple terminal-based localhost chat application written in python How to Use? Clone the repo git clone https://github.com/heksadecimal/c

Heks 10 Nov 9, 2021
Voidlx is a terminal cli apps launcher made in python

Voidlx is a terminal cli apps launcher made in python

null 2 Nov 13, 2021
Display Images in your terminal with python

Term-Img Display Images in your terminal with python NOTE: This project is a work in progress and not everything on here has actually been implemented

My avatar ;D 118 Jan 5, 2023
A useful and easy to use Terminal Timer made with Python.

Terminal SpeedCubeTimer Installation ¡No requirements! Just Download and play Usage Starts timer.py and you will see this. python timer.py Scramble

Achalogy 5 Dec 22, 2022
An open source terminal project made in python

Calamity-Terminal An open source terminal project made in python. Calamity Terminal is a free and open source lightweight terminal. Its made 100% off

null 1 Mar 8, 2022
A dashboard for your Terminal written in the Python 3 language,

termDash is a handy little program, written in the Python 3 language, and is a small little dashboard for your terminal, designed to be a utility to help people, as well as helping new users get used to the terminal.

Rebecca White 2 Dec 3, 2021
Colors in Terminal - Python Lang

?? Colorate - Python ?? About Colorate is an Open Source project that makes it easy to use Python color coding in your projects. After downloading the

0110 Henrique 1 Dec 1, 2021
A terminal written in Python.

PyDOS Read the title and then you'll figure out what this actually is. Running First, download or clone this repo. Next, run run.py. After this, you c

TechStudent10 2 Mar 1, 2022
Terminal Colored Text for Python

Terminal Colored Text for Python

R3CKhi-**75 3 Sep 10, 2022
A python-based terminal application that displays current cryptocurrency prices

CryptoAssetPrices A python-based terminal application that displays current cryptocurrency prices. Covered Cryptocurrencies Bitcoin (BTC) Ethereum (ET

null 3 Apr 21, 2022