Skip to content

Commit 8968b13

Browse files
committed
Merge branch 'main' of github.com:pinecone-io/pinecone-python-client-internal into ch9770
2 parents 9e711da + 647b831 commit 8968b13

File tree

10 files changed

+158
-30
lines changed

10 files changed

+158
-30
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: (alpha) Pypi
2+
# upload package to test Pypi
3+
4+
on:
5+
push:
6+
tags:
7+
- '**-alpha'
8+
9+
env:
10+
TEST_PYPI_URL: https://test.pypi.org/legacy/
11+
TEST_PYPI_PASSWORD: ${{ secrets.TEST_PYPI_PASSWORD }}
12+
13+
jobs:
14+
pypi:
15+
timeout-minutes: 30
16+
name: pypi
17+
runs-on: self-hosted
18+
19+
steps:
20+
- uses: actions/checkout@v2
21+
- uses: actions/setup-python@v2
22+
with:
23+
python-version: 3.7
24+
25+
- name: Build Python client
26+
run: make package
27+
28+
- name: Upload Python client to Pypi
29+
run: export TWINE_REPOSITORY_URL=${{ env.TEST_PYPI_URL }} && make upload PYPI_PASSWORD=${{ env.TEST_PYPI_PASSWORD }}

.github/workflows/release.yaml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: Pypi
2+
# upload package to Pypi
3+
on:
4+
push:
5+
tags:
6+
- '**-release'
7+
8+
env:
9+
PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
10+
11+
jobs:
12+
13+
pypi:
14+
timeout-minutes: 30
15+
name: pypi
16+
runs-on: ubuntu-latest
17+
18+
steps:
19+
- uses: actions/checkout@v2
20+
- uses: actions/setup-python@v1
21+
with:
22+
python-version: 3.7
23+
24+
- uses: actions/checkout@v2
25+
with:
26+
repository: pinecone-io/pinecone-python-client
27+
ref: ''
28+
token: ${{ secrets.PAT }}
29+
path: pinecone-python-client
30+
31+
- name: Set Python client production environment
32+
run: make set-production
33+
34+
- name: Build Python client
35+
run: make package
36+
37+
- name: Upload Python client to Pypi
38+
run: make upload PYPI_PASSWORD=${{ env.PYPI_PASSWORD }}

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@
66
- `pinecone.init()` can now be used to set the pinecone logger's log level.
77
- The python client `pinecone.config.OpenApiConfiguration` object now uses the certifi package's SSL CA bundle by default. This should fix HTTPS connection errors in certain environments depending on their default CA bundle, including some Google Colab notebooks.
88

9+
## [2.0.1] - 2021-10-06
10+
### Added
11+
- New `timeout` parameter to the `pinecone.create_index()` and the `pinecone.delete_index()` call.
12+
- `timeout` allows you to set how many seconds you want to wait for `create_index()` and `delete_index()` to complete. If `None`, wait indefinitely; if `>=0`, time out after this many seconds; if `-1`, return immediately and do not wait. Defaults to `None`.
13+
14+
### Changed
15+
- Updates the default openapi_config object to use the certifice ssl_ca_cert bundle.
16+
917
## [2.0.0] - 2020-10-04
1018
### Added
1119
- New major release!

pinecone/__version__

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.0.0
1+
2.0.1

pinecone/config.py

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,11 @@
2323

2424

2525
def _set_sentry_tags(config: dict):
26-
if config['disable_error_reporting']:
27-
sentry_sdk.init()
28-
else:
29-
sentry_sdk.set_tag("package_version", CLIENT_VERSION)
30-
sentry_tag_names = ('environment', 'project_name', 'controller_host', 'username', 'user_label')
31-
for key, val in config.items():
32-
if key in sentry_tag_names:
33-
sentry_sdk.set_tag(key, val)
26+
sentry_sdk.set_tag("package_version", CLIENT_VERSION)
27+
sentry_tag_names = ('environment', 'project_name', 'controller_host', 'username', 'user_label')
28+
for key, val in config.items():
29+
if key in sentry_tag_names:
30+
sentry_sdk.set_tag(key, val)
3431

3532

3633
class ConfigBase(NamedTuple):
@@ -39,7 +36,6 @@ class ConfigBase(NamedTuple):
3936
project_name: str = ""
4037
controller_host: str = ""
4138
log_level: str = ""
42-
disable_error_reporting: bool = False
4339
openapi_config: OpenApiConfiguration = None
4440

4541

@@ -55,7 +51,6 @@ class _CONFIG:
5551
"""
5652

5753
def __init__(self):
58-
self._loguru_handler_id = None
5954
self.reset()
6055

6156
def validate(self):
@@ -131,21 +126,13 @@ def reset(self, config_file=None, **kwargs):
131126
or os.getenv("PINECONE_LOGGING")
132127
or file_config.pop("log_level", None)
133128
)
134-
if log_level or not self._loguru_handler_id:
135-
logger.remove(self._loguru_handler_id)
136-
self._loguru_handler_id = logger.add(sys.stdout, enqueue=True, level=(log_level or "ERROR"))
129+
if log_level:
130+
logger.remove()
131+
logger.add(sys.stdout, enqueue=True, level=(log_level or "ERROR"))
137132
config = config._replace(log_level=log_level)
138133
self._config = config
139134

140135
# Sentry
141-
disable_error_reporting = (
142-
kwargs.pop("disable_error_reporting", False)
143-
or os.getenv("PINECONE_ERROR_REPORTING")
144-
or file_config.pop("disable_error_reporting", False)
145-
or False
146-
)
147-
config = config._replace(disable_error_reporting=disable_error_reporting)
148-
self._config = config
149136
_set_sentry_tags({**whoami_response._asdict(), **self._config._asdict()})
150137

151138
def _preprocess_and_validate_config(self, config: dict) -> dict:
@@ -203,14 +190,10 @@ def OPENAPI_CONFIG(self):
203190
def LOG_LEVEL(self):
204191
return self._config.log_level
205192

206-
@property
207-
def DISABLE_ERROR_REPORTING(self):
208-
return self._config.disable_error_reporting
209-
210193

211194
@sentry
212195
def init(api_key: str = None, host: str = None, environment: str = None, project_name: str = None,
213-
log_level: str = None, openapi_config: OpenApiConfiguration = None, disable_error_reporting: bool = None,
196+
log_level: str = None, openapi_config: OpenApiConfiguration = None,
214197
config: str = "~/.pinecone", **kwargs):
215198
"""Initializes the Pinecone client.
216199
@@ -219,17 +202,20 @@ def init(api_key: str = None, host: str = None, environment: str = None, project
219202
:param environment: Optional. Deployment environment.
220203
:param project_name: Optional. Pinecone project name. Overrides the value that is otherwise looked up and used from the Pinecone backend.
221204
:param log_level: Optional. Set Pinecone log level.
222-
:param disable_error_reporting: Optional. Don't sent client errors to Pinecone.
223205
:param openapi_config: Optional. Set OpenAPI client configuration.
224206
:param config: Optional. An INI configuration file.
225207
"""
226208
Config.reset(project_name=project_name, api_key=api_key, controller_host=host, environment=environment,
227-
log_level=log_level, openapi_config=openapi_config, disable_error_reporting=disable_error_reporting,
209+
log_level=log_level, openapi_config=openapi_config,
228210
config_file=config, **kwargs)
229211
if not bool(Config.API_KEY):
230212
logger.warning("API key is required.")
231213

232214

215+
logger.remove()
216+
logger.add(sys.stdout, enqueue=True, level=(
217+
os.getenv("PINECONE_LOG_LEVEL") or os.getenv("PINECONE_LOGGING") or "ERROR"))
218+
233219
Config = _CONFIG()
234220

235221
# Init

pinecone/index.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Copyright (c) 2020-2021 Pinecone Systems Inc. All right reserved.
33
#
44

5-
from collections import Iterable
5+
from collections.abc import Iterable
66

77
from pinecone import Config
88
from pinecone.core.client import ApiClient, Configuration

test-requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ pytest-cov==2.10.1
44
pytest-mock==3.6.1
55
tox==3.20.1
66
pytest-timeout==1.4.2
7+
urllib3_mock==0.3.3

tests/integ/__init__.py

Whitespace-only changes.

tests/integ/test_index.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import pytest
2+
from urllib3_mock import Responses
3+
4+
import pinecone
5+
from pinecone import ApiTypeError
6+
7+
responses = Responses('requests.packages.urllib3')
8+
9+
10+
@responses.activate
11+
def test_unrecognized_response_field():
12+
# unrecognized response fields are okay, shouldn't raise an exception
13+
pinecone.init('example-api-key', environment='example-environment')
14+
15+
# responses.add('GET', '/actions/whoami', # fixme: requests-based, so mock fails?
16+
# body='{"project_name": "example-project", "user_label": "example-label", "user_name": "test"}',
17+
# status=200, content_type='application/json')
18+
responses.add('DELETE', '/vectors/delete',
19+
body='{"deleted_count": 2, "unexpected_key": "xyzzy"}',
20+
status=200, content_type='application/json')
21+
22+
index = pinecone.Index('example-index')
23+
resp = index.delete(ids=['vec1', 'vec2'])
24+
25+
# assert len(responses.calls) == 1
26+
# assert responses.calls[0].request.url == '/vectors/delete?ids=vec1&ids=vec2'
27+
# assert responses.calls[0].request.host == 'example-index-unknown.svc.example-environment.pinecone.io'
28+
# assert responses.calls[0].request.scheme == 'https'
29+
30+
assert resp.deleted_count == 2
31+
32+
33+
@responses.activate
34+
def test_missing_response_field():
35+
# unrecognized response fields are okay, shouldn't raise an exception
36+
pinecone.init('example-api-key', environment='example-environment')
37+
responses.add('DELETE', '/vectors/delete',
38+
body='{}',
39+
status=200, content_type='application/json')
40+
index = pinecone.Index('example-index')
41+
# this should not raise
42+
index.delete(ids=['vec1', 'vec2'])
43+
44+
45+
46+
@responses.activate
47+
def test_malformed_response_wrong_type():
48+
# unrecognized response fields are okay, shouldn't raise an exception
49+
pinecone.init('example-api-key', environment='example-environment')
50+
51+
responses.add('DELETE', '/vectors/delete',
52+
body='{"deleted_count": "foobar"}',
53+
status=200, content_type='application/json')
54+
55+
index = pinecone.Index('example-index')
56+
57+
with pytest.raises(ApiTypeError) as exc_info:
58+
resp = index.delete(ids=['vec1', 'vec2'])
59+
assert resp.deleted_count == 2

tox.ini

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ deps=
1919
commands =
2020
pytest --cov=pinecone --timeout=120 tests/unit {posargs}
2121

22+
[gh-actions]
23+
python =
24+
3.6: py36
25+
3.7: py37
26+
3.8: py38
27+
3.9: py39
28+
2229
[flake8]
2330
max-line-length = 120
2431
extend-ignore = E203

0 commit comments

Comments
 (0)