Skip to content

Commit

Permalink
Improve AttributeError warnings when using deprecated methods (#291)
Browse files Browse the repository at this point in the history
## Problem

In v3.0, many methods have moved from the top-level namespace onto a
class instance. We can throw more informative errors to help people
migrate.

## Solution

Add back stub implementations of methods that were removed. When called,
they throw errors with useful documentation.

I simplified the expected args for all methods to `*args, **kwargs`
which should match no matter what combination of arguments the user has
provided.

## Type of Change

- [x] New feature (non-breaking change which adds functionality)

## Test Plan

`poetry run python3` and then try it:

```
poetry run python3
Python 3.9.16 (main, May  2 2023, 18:16:09)
[Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pinecone
>>> pinecone.list_indexes()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jhamon/workspace/pinecone-python-client/pinecone/deprecation_warnings.py", line 21, in list_indexes
    raise AttributeError(_build_class_migration_message('list_indexes', example))
AttributeError: list_indexes is no longer top-level attribute of the pinecone package.

To use list_indexes, please create a client instance and call the method there instead.

Example:

    from pinecone import Pinecone

    pc = Pinecone(api_key='YOUR_API_KEY')

    index_name = "quickstart" # or your index name

    if index_name not in pc.list_indexes().names():
        # do something


>>> pinecone.create_index('quickstart', dimension=8, metric='cosine')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jhamon/workspace/pinecone-python-client/pinecone/deprecation_warnings.py", line 48, in create_index
    raise AttributeError(_build_class_migration_message('create_index', example))
AttributeError: create_index is no longer top-level attribute of the pinecone package.

To use create_index, please create a client instance and call the method there instead.

Example:

    from pinecone import Pinecone, ServerlessSpec

    pc = Pinecone(api_key='YOUR_API_KEY')
    pc.create_index(
        name='my-index',
        dimension=1536,
        metric='euclidean',
        spec=ServerlessSpec(
            cloud='aws',
            region='us-west-2'
        )
    )


>>> pinecone.describe_index('asdf')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jhamon/workspace/pinecone-python-client/pinecone/deprecation_warnings.py", line 30, in describe_index
    raise AttributeError(_build_class_migration_message('describe_index', example))
AttributeError: describe_index is no longer top-level attribute of the pinecone package.

To use describe_index, please create a client instance and call the method there instead.

Example:

    from pinecone import Pinecone

    pc = Pinecone(api_key='YOUR_API_KEY')
    pc.describe_index('my_index')

```

And `pinecone.init()`

```
>>> pinecone.init()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jhamon/workspace/pinecone-python-client/pinecone/deprecation_warnings.py", line 38, in init
    raise AttributeError(msg)
AttributeError: init is no longer a top-level attribute of the pinecone package.

Please create an instance of the Pinecone class instead.

Example:

    import os
    from pinecone import Pinecone, ServerlessSpec

    pc = Pinecone(
        api_key=os.environ.get("PINECONE_API_KEY")
    )

    # Now do stuff
    if 'my_index' not in pc.list_indexes().names():
        pc.create_index(
            name='my_index',
            dimension=1536,
            metric='euclidean',
            spec=ServerlessSpec(
                cloud='aws',
                region='us-west-2'
            )
        )
```
  • Loading branch information
jhamon committed Jan 19, 2024
1 parent c84ea97 commit e770c5a
Show file tree
Hide file tree
Showing 2 changed files with 152 additions and 0 deletions.
1 change: 1 addition & 0 deletions pinecone/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

warnings.filterwarnings("ignore", category=TqdmExperimentalWarning)

from .deprecation_warnings import *
from .config import *
from .exceptions import *
from .control import *
Expand Down
151 changes: 151 additions & 0 deletions pinecone/deprecation_warnings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
def _build_class_migration_message(method_name: str, example: str):
return f"""{method_name} is no longer a top-level attribute of the pinecone package.
To use {method_name}, please create a client instance and call the method there instead.
Example:
{example}
"""

def init(*args, **kwargs):
example = """
import os
from pinecone import Pinecone, ServerlessSpec
pc = Pinecone(
api_key=os.environ.get("PINECONE_API_KEY")
)
# Now do stuff
if 'my_index' not in pc.list_indexes().names():
pc.create_index(
name='my_index',
dimension=1536,
metric='euclidean',
spec=ServerlessSpec(
cloud='aws',
region='us-west-2'
)
)
"""
msg = f"""init is no longer a top-level attribute of the pinecone package.
Please create an instance of the Pinecone class instead.
Example:
{example}
"""
raise AttributeError(msg)

def list_indexes(*args, **kwargs):
example = """
from pinecone import Pinecone
pc = Pinecone(api_key='YOUR_API_KEY')
index_name = "quickstart" # or your index name
if index_name not in pc.list_indexes().names():
# do something
"""
raise AttributeError(_build_class_migration_message('list_indexes', example))

def describe_index(*args, **kwargs):
example = """
from pinecone import Pinecone
pc = Pinecone(api_key='YOUR_API_KEY')
pc.describe_index('my_index')
"""
raise AttributeError(_build_class_migration_message('describe_index', example))


def create_index(*args, **kwargs):
example = """
from pinecone import Pinecone, ServerlessSpec
pc = Pinecone(api_key='YOUR_API_KEY')
pc.create_index(
name='my-index',
dimension=1536,
metric='euclidean',
spec=ServerlessSpec(
cloud='aws',
region='us-west-2'
)
)
"""
raise AttributeError(_build_class_migration_message('create_index', example))

def delete_index(*args, **kwargs):
example = """
from pinecone import Pinecone
pc = Pinecone(api_key='YOUR_API_KEY')
pc.delete_index('my_index')
"""
raise AttributeError(_build_class_migration_message('delete_index', example))

def scale_index(*args, **kwargs):
example = """
from pinecone import Pinecone
pc = Pinecone(api_key='YOUR_API_KEY')
pc.configure_index('my_index', replicas=2)
"""

msg = f"""scale_index is no longer a top-level attribute of the pinecone package.
Please create a client instance and call the configure_index method instead.
Example:
{example}
"""
raise AttributeError(msg)


def create_collection(*args, **kwargs):
example = """
from pinecone import Pinecone
pc = Pinecone(api_key='YOUR_API_KEY')
pc.create_collection(name='my_collection', source='my_index')
"""
raise AttributeError(_build_class_migration_message('create_collection', example))

def list_collections(*args, **kwargs):
example = """
from pinecone import Pinecone
pc = Pinecone(api_key='YOUR_API_KEY')
pc.list_collections()
"""
raise AttributeError(_build_class_migration_message('list_collections', example))

def delete_collection(*args, **kwargs):
example = """
from pinecone import Pinecone
pc = Pinecone(api_key='YOUR_API_KEY')
pc.delete_collection('my_collection')
"""
raise AttributeError(_build_class_migration_message('delete_collection', example))

def describe_collection(*args, **kwargs):
example = """
from pinecone import Pinecone
pc = Pinecone(api_key='YOUR_API_KEY')
pc.describe_collection('my_collection')
"""
raise AttributeError(_build_class_migration_message('describe_collection', example))


def configure_index(*args, **kwargs):
example = """
from pinecone import Pinecone
pc = Pinecone(api_key='YOUR_API_KEY')
pc.configure_index('my_index', replicas=2)
"""
raise AttributeError(_build_class_migration_message('configure_index', example))

0 comments on commit e770c5a

Please sign in to comment.