Skip to content

Commit e561c57

Browse files
author
Val Brodsky
committed
Allow to inject sdk method
1 parent 5179dab commit e561c57

File tree

3 files changed

+71
-59
lines changed

3 files changed

+71
-59
lines changed

libs/labelbox/src/labelbox/pagination.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
_PAGE_SIZE = 100
2222

23+
2324
class PaginatedCollection:
2425
"""An iterable collection of database objects (Projects, Labels, etc...).
2526
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import inspect
2+
import re
3+
import sys
4+
from typing import TypedDict
5+
6+
7+
def python_version_info():
8+
version_info = sys.version_info
9+
10+
return f"{version_info.major}.{version_info.minor}.{version_info.micro}-{version_info.releaselevel}"
11+
12+
13+
LABELBOX_CALL_PATTERN = re.compile(r"/labelbox/")
14+
TEST_FILE_PATTERN = re.compile(r".*test.*\.py$")
15+
16+
17+
class _RequestInfo(TypedDict):
18+
prefix: str
19+
class_name: str
20+
method_name: str
21+
22+
23+
def call_info():
24+
method_name = "Unknown"
25+
prefix = ""
26+
class_name = ""
27+
skip_methods = ["wrapper", "__init__", "execute"]
28+
skip_classes = ["PaginatedCollection", "_CursorPagination", "_OffsetPagination"]
29+
30+
try:
31+
call_info = None
32+
for stack in reversed(inspect.stack()):
33+
if LABELBOX_CALL_PATTERN.search(stack.filename):
34+
call_info = stack
35+
method_name = call_info.function
36+
class_name = call_info.frame.f_locals.get(
37+
"self", None
38+
).__class__.__name__
39+
if method_name not in skip_methods:
40+
if class_name not in skip_classes:
41+
if TEST_FILE_PATTERN.search(call_info.filename):
42+
prefix = "test:"
43+
else:
44+
if class_name == "NoneType":
45+
class_name = ""
46+
break
47+
48+
except Exception:
49+
pass
50+
return _RequestInfo(prefix=prefix, class_name=class_name, method_name=method_name)
51+
52+
53+
def call_info_as_str():
54+
info = call_info()
55+
return f"{info['prefix']}{info['class_name']}:{info['method_name']}"

libs/lbox-clients/src/lbox/request_client.py

Lines changed: 15 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,22 @@
11
# for the Labelbox Python SDK
2-
import inspect
32
import json
43
import logging
54
import os
6-
import re
7-
import sys
85
from datetime import datetime, timezone
96
from types import MappingProxyType
10-
from typing import Callable, Dict, Optional, TypedDict
7+
from typing import Callable, Dict, Optional
118

129
import requests
1310
import requests.exceptions
1411
from google.api_core import retry
15-
from lbox import exceptions # type: ignore
12+
from lbox import exceptions
13+
from lbox.call_info import call_info_as_str, python_version_info # type: ignore
1614

1715
logger = logging.getLogger(__name__)
1816

1917
_LABELBOX_API_KEY = "LABELBOX_API_KEY"
2018

2119

22-
def python_version_info():
23-
version_info = sys.version_info
24-
25-
return f"{version_info.major}.{version_info.minor}.{version_info.micro}-{version_info.releaselevel}"
26-
27-
28-
LABELBOX_CALL_PATTERN = re.compile(r"/labelbox/")
29-
TEST_FILE_PATTERN = re.compile(r".*test.*\.py$")
30-
31-
32-
class _RequestInfo(TypedDict):
33-
prefix: str
34-
class_name: str
35-
method_name: str
36-
37-
38-
def call_info():
39-
method_name = "Unknown"
40-
prefix = ""
41-
class_name = ""
42-
skip_methods = ["wrapper", "__init__", "execute"]
43-
skip_classes = ["PaginatedCollection", "_CursorPagination", "_OffsetPagination"]
44-
45-
try:
46-
call_info = None
47-
for stack in reversed(inspect.stack()):
48-
if LABELBOX_CALL_PATTERN.search(stack.filename):
49-
call_info = stack
50-
method_name = call_info.function
51-
class_name = call_info.frame.f_locals.get(
52-
"self", None
53-
).__class__.__name__
54-
print(call_info.frame.f_locals)
55-
import pdb; pdb.set_trace()
56-
if method_name not in skip_methods:
57-
if class_name not in skip_classes:
58-
if TEST_FILE_PATTERN.search(call_info.filename):
59-
prefix = "test:"
60-
else:
61-
if class_name == "NoneType":
62-
class_name = ""
63-
break
64-
65-
except Exception:
66-
pass
67-
return _RequestInfo(prefix=prefix, class_name=class_name, method_name=method_name)
68-
69-
70-
def call_info_as_str():
71-
info = call_info()
72-
return f"{info['prefix']}{info['class_name']}:{info['method_name']}"
73-
74-
7520
class RequestClient:
7621
"""A Labelbox request client.
7722
@@ -116,6 +61,7 @@ def __init__(
11661
self.endpoint = endpoint
11762
self.rest_endpoint = rest_endpoint
11863
self.sdk_version = sdk_version
64+
self._sdk_method = None
11965
self._connection: requests.Session = self._init_connection()
12066

12167
def _init_connection(self) -> requests.Session:
@@ -128,6 +74,14 @@ def _init_connection(self) -> requests.Session:
12874
def headers(self) -> MappingProxyType:
12975
return self._connection.headers
13076

77+
@property
78+
def sdk_method(self):
79+
return self._sdk_method
80+
81+
@sdk_method.setter
82+
def sdk_method(self, value):
83+
self._sdk_method = value
84+
13185
def _default_headers(self):
13286
return {
13387
"Authorization": "Bearer %s" % self.api_key,
@@ -236,7 +190,9 @@ def convert_value(value):
236190
if files:
237191
del headers["Content-Type"]
238192
del headers["Accept"]
239-
headers["X-SDK-Method"] = call_info_as_str()
193+
headers["X-SDK-Method"] = (
194+
self.sdk_method if self.sdk_method else call_info_as_str()
195+
)
240196

241197
request = requests.Request(
242198
"POST",

0 commit comments

Comments
 (0)