Skip to content

Commit c7a3fe7

Browse files
authored
2025-11-20 release: Version 0.1.13 (#24)
- Add missing dependency on `protobuf` in `pyproject.toml`. - Fix type for KaggleClient#http_client method - Allow overriding the user-agent at KaggleClient initialization - Add a new "TEST" KaggleEnv pointing to a special port on localhost to avoid conflict between the mock server and kaggleazure server in unit tests. http://b/307576378
1 parent dde09b3 commit c7a3fe7

8 files changed

Lines changed: 22 additions & 13 deletions

File tree

kagglesdk/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "0.1.12"
1+
__version__ = "0.1.13"
22

33
from kagglesdk.kaggle_client import KaggleClient
44
from kagglesdk.kaggle_creds import KaggleCredentials

kagglesdk/benchmarks/types/benchmark_types.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ class NumericResult(KaggleObject):
182182
as a +- value.
183183
uneven_confidence_interval (UnevenConfidenceInterval)
184184
For asymmetric confidence intervals in which the +/- values differ
185-
If set, prioritized over confidence_interval
185+
If set, prioritized over confidence_interval (if both are set)
186186
"""
187187

188188
def __init__(self):
@@ -226,7 +226,7 @@ def confidence_interval(self, confidence_interval: Optional[float]):
226226
def uneven_confidence_interval(self) -> Optional['UnevenConfidenceInterval']:
227227
r"""
228228
For asymmetric confidence intervals in which the +/- values differ
229-
If set, prioritized over confidence_interval
229+
If set, prioritized over confidence_interval (if both are set)
230230
"""
231231
return self._uneven_confidence_interval or None
232232

kagglesdk/competitions/types/competition_api_service.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1570,7 +1570,7 @@ class ApiListDataFilesResponse(KaggleObject):
15701570

15711571
def __init__(self):
15721572
self._files = []
1573-
self._next_page_token = ""
1573+
self._next_page_token = None
15741574
self._children_fetch_time_ms = 0
15751575
self._freeze()
15761576

@@ -1591,10 +1591,10 @@ def files(self, files: Optional[List[Optional['ApiDataFile']]]):
15911591

15921592
@property
15931593
def next_page_token(self) -> str:
1594-
return self._next_page_token
1594+
return self._next_page_token or ""
15951595

15961596
@next_page_token.setter
1597-
def next_page_token(self, next_page_token: str):
1597+
def next_page_token(self, next_page_token: Optional[str]):
15981598
if next_page_token is None:
15991599
del self.next_page_token
16001600
return
@@ -2338,7 +2338,7 @@ def url(self, url: Optional[str]):
23382338

23392339
ApiListDataFilesResponse._fields = [
23402340
FieldMetadata("files", "files", "_files", ApiDataFile, [], ListSerializer(KaggleObjectSerializer())),
2341-
FieldMetadata("nextPageToken", "next_page_token", "_next_page_token", str, "", PredefinedSerializer()),
2341+
FieldMetadata("nextPageToken", "next_page_token", "_next_page_token", str, None, PredefinedSerializer(), optional=True),
23422342
FieldMetadata("childrenFetchTimeMs", "children_fetch_time_ms", "_children_fetch_time_ms", int, 0, PredefinedSerializer()),
23432343
]
23442344

kagglesdk/discussions/types/search_discussions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ class SearchDiscussionsSourceType(enum.Enum):
2020
SEARCH_DISCUSSIONS_SOURCE_TYPE_MODEL = 7
2121
SEARCH_DISCUSSIONS_SOURCE_TYPE_WRITE_UP = 8
2222
SEARCH_DISCUSSIONS_SOURCE_TYPE_LEARN_TRACK = 9
23+
SEARCH_DISCUSSIONS_SOURCE_TYPE_BENCHMARK = 10
24+
SEARCH_DISCUSSIONS_SOURCE_TYPE_BENCHMARK_TASK = 11
2325

2426
class SearchDiscussionsTopicType(enum.Enum):
2527
SEARCH_DISCUSSIONS_TOPIC_TYPE_UNSPECIFIED = 0

kagglesdk/kaggle_client.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ def __init__(self, http_client: KaggleHttpClient):
6969
self.account_client = AccountClient(http_client)
7070
self.group_api_client = GroupApiClient(http_client)
7171

72-
def __init__(self, env: KaggleEnv = None, verbose: bool = False, username: str = None, password: str = None, api_token: str = None):
73-
self._http_client = http_client = KaggleHttpClient(env, verbose, username=username, password=password, api_token=api_token)
72+
def __init__(self, env: KaggleEnv = None, verbose: bool = False, username: str = None, password: str = None, api_token: str = None, user_agent: str = None):
73+
self._http_client = http_client = KaggleHttpClient(env, verbose, username=username, password=password, api_token=api_token, user_agent=user_agent)
7474
self.admin = KaggleClient.Admin(http_client)
7575
self.benchmarks = KaggleClient.Benchmarks(http_client)
7676
self.blobs = KaggleClient.Blobs(http_client)
@@ -87,7 +87,7 @@ def __init__(self, env: KaggleEnv = None, verbose: bool = False, username: str =
8787
self.password = password
8888
self.api_token = api_token
8989

90-
def http_client(self) -> str:
90+
def http_client(self) -> KaggleHttpClient:
9191
return self._http_client
9292

9393
def _renew_iap_token(self) -> str:

kagglesdk/kaggle_env.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class KaggleEnv(Enum):
1818
ADMIN = 2 # admin.kaggle.com
1919
QA = 3 # qa.kaggle.com
2020
PROD = 4 # api.kaggle.com
21+
TEST = 5 # localhost:7777
2122

2223

2324
_env_to_endpoint = {
@@ -26,6 +27,7 @@ class KaggleEnv(Enum):
2627
KaggleEnv.ADMIN: "https://admin.kaggle.com",
2728
KaggleEnv.QA: "https://qa.kaggle.com",
2829
KaggleEnv.PROD: "https://api.kaggle.com",
30+
KaggleEnv.TEST: "http://localhost:7777"
2931
}
3032

3133

@@ -45,6 +47,8 @@ def get_env():
4547
return KaggleEnv.STAGING
4648
if env == "QA":
4749
return KaggleEnv.QA
50+
if env == "TEST":
51+
return KaggleEnv.TEST
4852
raise Exception(f'Unrecognized value in KAGGLE_API_ENVIRONMENT: "{env}"')
4953

5054

kagglesdk/kaggle_http_client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def __init__(
5959
username: str = None,
6060
password: str = None,
6161
api_token: str = None,
62+
user_agent: str = "kaggle-api/v1.7.0", # Was: V2
6263
):
6364
self._env = env or get_env()
6465
self._signed_in = None
@@ -68,6 +69,7 @@ def __init__(
6869
self._username = username
6970
self._password = password
7071
self._api_token = api_token
72+
self._user_agent = user_agent
7173

7274
def call(
7375
self,
@@ -147,7 +149,7 @@ def _init_session(self):
147149
return self._session
148150

149151
self._session = requests.Session()
150-
self._session.headers.update({"User-Agent": "kaggle-api/v1.7.0", "Content-Type": "application/json"}) # Was: V2
152+
self._session.headers.update({"User-Agent": self._user_agent, "Content-Type": "application/json"})
151153

152154
iap_token = self._get_iap_token_if_required()
153155
if iap_token is not None:

pyproject.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@ classifiers = [
2121
keywords = ["Kaggle", "API"]
2222
requires-python = ">=3.9"
2323
dependencies = [
24-
"requests",
24+
"requests",
25+
"protobuf",
2526
]
2627

2728
[project.urls]
2829
"Homepage" = "https://github.com/Kaggle/kagglesdk"
2930
"Bug Tracker" = "https://github.com/Kaggle/kagglesdk/issues"
3031

3132
[tool.hatch.version]
32-
path = "kagglesdk/__init__.py"
33+
path = "kagglesdk/__init__.py"

0 commit comments

Comments
 (0)