Skip to content

Commit a1daf9d

Browse files
committed
fix(indexes): add schema param to create_index backcompat shim
## Purpose The `Pinecone.create_index` backcompat shim was missing the `schema` parameter, silently dropping it even though the canonical `Indexes.create` already accepts and forwards it. Users calling the legacy flat API could not pass metadata indexing schemas for serverless or BYOC indexes. ## Solution Added `schema: dict[str, Any] | None = None` to `Pinecone.create_index` signature and forwarded it to `self.indexes.create(schema=schema)`. Added unit tests that mock `_indexes.create` and verify the kwarg is forwarded, and an integration test using respx that verifies `schema` appears in the constructed request body under `spec.serverless.schema`.
1 parent 4b617ea commit a1daf9d

3 files changed

Lines changed: 71 additions & 0 deletions

File tree

‎pinecone/_client.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,7 @@ def create_index(
524524
deletion_protection: DeletionProtection | str | None = "disabled",
525525
vector_type: VectorType | str = "dense",
526526
tags: Mapping[str, str] | None = None,
527+
schema: dict[str, Any] | None = None,
527528
) -> IndexModel:
528529
"""Backwards-compatibility shim for :meth:`Pinecone.indexes.create`.
529530
@@ -539,6 +540,7 @@ def create_index(
539540
vector_type=vector_type,
540541
deletion_protection=resolved_dp,
541542
tags=tags,
543+
schema=schema,
542544
timeout=timeout,
543545
)
544546

‎tests/integration/test_client.py‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from __future__ import annotations
44

5+
import json
56
import os
67

78
import httpx
@@ -10,6 +11,7 @@
1011

1112
from pinecone import Pinecone
1213
from pinecone.models.backups.model import CreateIndexFromBackupResponse
14+
from tests.factories import make_index_response
1315

1416

1517
@pytest.mark.integration
@@ -103,3 +105,26 @@ def test_client_init_with_api_key() -> None:
103105

104106
assert isinstance(__version__, str)
105107
assert len(__version__) > 0
108+
109+
110+
@respx.mock
111+
def test_create_index_schema_parameter_forwarded() -> None:
112+
"""Verify schema param is forwarded through the create_index backcompat shim."""
113+
response_body = make_index_response(name="test-schema-shim")
114+
route = respx.post("https://api.pinecone.io/indexes").mock(
115+
return_value=httpx.Response(201, json=response_body),
116+
)
117+
118+
pc = Pinecone(api_key="test-key")
119+
result = pc.create_index(
120+
name="test-schema-shim",
121+
spec={"serverless": {"cloud": "aws", "region": "us-east-1"}},
122+
dimension=1536,
123+
schema={"text_field": {"type": "str"}},
124+
timeout=-1,
125+
)
126+
127+
assert result.name == "test-schema-shim"
128+
sent_body = json.loads(route.calls[0].request.content)
129+
# schema is forwarded into spec.serverless.schema by build_create_body
130+
assert sent_body["spec"]["serverless"]["schema"] == {"text_field": {"type": "str"}}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""Unit tests for Pinecone.create_index backcompat shim — schema parameter forwarding."""
2+
3+
from __future__ import annotations
4+
5+
from unittest.mock import MagicMock
6+
7+
from pinecone import Pinecone, ServerlessSpec
8+
9+
10+
def _make_pc_with_mock_indexes() -> tuple[Pinecone, MagicMock]:
11+
pc = Pinecone(api_key="test-key")
12+
mock_indexes = MagicMock()
13+
mock_indexes.create = MagicMock(return_value=MagicMock())
14+
pc._indexes = mock_indexes
15+
return pc, mock_indexes
16+
17+
18+
def test_create_index_shim_forwards_schema() -> None:
19+
"""Shim must forward schema kwarg to Indexes.create."""
20+
pc, mock_indexes = _make_pc_with_mock_indexes()
21+
pc.create_index(
22+
name="test",
23+
spec=ServerlessSpec(cloud="aws", region="us-east-1"),
24+
dimension=1536,
25+
schema={"field": {"type": "str"}},
26+
)
27+
28+
mock_indexes.create.assert_called_once()
29+
_, kwargs = mock_indexes.create.call_args
30+
assert kwargs["schema"] == {"field": {"type": "str"}}
31+
32+
33+
def test_create_index_shim_schema_defaults_to_none() -> None:
34+
"""schema defaults to None when not passed, and None is forwarded to Indexes.create."""
35+
pc, mock_indexes = _make_pc_with_mock_indexes()
36+
pc.create_index(
37+
name="test",
38+
spec=ServerlessSpec(cloud="aws", region="us-east-1"),
39+
dimension=1536,
40+
)
41+
42+
mock_indexes.create.assert_called_once()
43+
_, kwargs = mock_indexes.create.call_args
44+
assert kwargs["schema"] is None

0 commit comments

Comments
 (0)