Skip to content

Commit

Permalink
Improve output from list/describe actions on indexes and collections (#…
Browse files Browse the repository at this point in the history
…387)

## Problem

When running in notebooks, output from the `list_indexes` and
`list_collections` commands created confusion because the `__repr__`
representation for these objects showed an object with a top-level key
that implied the response should be interacted with like a dictionary.
This expectation contradicts with the way the `__iter__` implementations
on these results objects are set up to enable iterating over results
without drilling down.

The origin of the complexity here is that the backing APIs used to
return simple arrays of names that could be easily iterated over, and
earlier this year they become more fleshed out responses. Returning more
data is useful in some situations, but in trying to smooth out the
impact of the API change and maintain a similar way of interacting with
the results, we accidentally opened up this inconsistency in the
experience.

## Solution

- For these actions, migrate from output by `pprint.pformat` to
`json.dumps`. For deeply nested objects, this produces a result that is
easier to read.
- Stop sorting keys alphabetically. The way they are returned from the
API makes the most sense (name first).
- Remove top-level keys from the printed output, which created wrong
expectations about how to interact with the results object. Now
list_indexes looks like an array, and you index into it like an array.
Ditto for collections.

### Before

<img alt="Screenshot 2024-08-28 at 1 38 27 PM"
src="https://github.com/user-attachments/assets/a7931ebe-ffd9-4197-be26-aa030592e62d">

![Collections
output](https://github.com/user-attachments/assets/466d7a75-69c6-41d9-b75c-bbcc797ef315)

### After

<img width="706" alt="Screenshot 2024-08-28 at 1 29 00 PM"
src="https://github.com/user-attachments/assets/5c47e1db-19d3-44e7-bed9-bed27f823d02">

![Screenshot 2024-08-28 at 1 42 05
PM](https://github.com/user-attachments/assets/fb8eee8e-6b7c-442e-878e-ddaad635d317)

![Screenshot 2024-08-28 at 3 28 44
PM](https://github.com/user-attachments/assets/e33b1858-0718-4e36-8e7d-af41b6457784)



## Type of Change

- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] This change requires a documentation update
- [ ] Infrastructure change (CI configs, etc)
- [ ] Non-code change (docs, etc)
- [X] None of the above: UX improvement, but should be no functional
change
  • Loading branch information
jhamon authored Aug 28, 2024
1 parent 1d0b686 commit 2ea7e1d
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 6 deletions.
4 changes: 4 additions & 0 deletions pinecone/control/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
from .pinecone import Pinecone

from .repr_overrides import install_repr_overrides

install_repr_overrides()
17 changes: 17 additions & 0 deletions pinecone/control/repr_overrides.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from pinecone.models.index_model import IndexModel
from pinecone.core.openapi.control.models import CollectionModel

import json


def install_repr_overrides():
"""
The generator code uses pprint.pformat to format the repr output
which looks really poor when printing a list of large objects
in a notebook setting. We override it here for a few select models
instead of modifying the generator code because the more compact output
from pprint.pformat seems better for data plane objects such as lists of
query results.
"""
for model in [IndexModel, CollectionModel]:
model.__repr__ = lambda self: json.dumps(self.to_dict(), indent=4, sort_keys=False)
3 changes: 2 additions & 1 deletion pinecone/models/collection_list.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import json
from pinecone.core.openapi.control.models import (
CollectionList as OpenAPICollectionList,
)
Expand Down Expand Up @@ -28,7 +29,7 @@ def __str__(self):
return str(self.collection_list)

def __repr__(self):
return repr(self.collection_list)
return json.dumps([c.to_dict() for c in self.collection_list.collections], indent=4)

def __getattr__(self, attr):
return getattr(self.collection_list, attr)
5 changes: 3 additions & 2 deletions pinecone/models/index_list.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import json
from pinecone.core.openapi.control.models import IndexList as OpenAPIIndexList
from .index_model import IndexModel

Expand All @@ -21,10 +22,10 @@ def __iter__(self):
return iter(self.indexes)

def __str__(self):
return str(self.index_list)
return str(self.indexes)

def __repr__(self):
return repr(self.index_list)
return json.dumps([i.to_dict() for i in self.indexes], indent=4)

def __getattr__(self, attr):
return getattr(self.index_list, attr)
6 changes: 3 additions & 3 deletions pinecone/models/index_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ def __init__(self, index: OpenAPIIndexModel):
def __str__(self):
return str(self.index)

def __repr__(self):
return repr(self.index)

def __getattr__(self, attr):
return getattr(self.index, attr)

def __getitem__(self, key):
return self.__getattr__(key)

def to_dict(self):
return self.index.to_dict()

0 comments on commit 2ea7e1d

Please sign in to comment.