pinecone-io / pinecone-python-client

The Pinecone Python client
https://www.pinecone.io/docs
Apache License 2.0
304 stars 79 forks source link

Improve `AttributeError` warnings when using deprecated methods #291

Closed jhamon closed 9 months ago

jhamon commented 9 months ago

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

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'
            )
        )