Skip to content

Commit f9f31bd

Browse files
Merge branch 'pr-1576' into setups-mig
2 parents 0364bff + bfb2d3e commit f9f31bd

46 files changed

Lines changed: 983 additions & 454 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/test.yml

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ concurrency:
2222

2323
jobs:
2424
test:
25-
name: (${{ matrix.os }},Py${{ matrix.python-version }},sk${{ matrix.scikit-learn }},sk-only:${{ matrix.sklearn-only }})
25+
name: (${{ matrix.os }},Py${{ matrix.python-version }},sk${{ matrix.scikit-learn }}${{ matrix.pandas-version != '' && format(',pd:{0}', matrix.pandas-version) || '' }},sk-only:${{ matrix.sklearn-only }})
2626
runs-on: ${{ matrix.os }}
2727

2828
strategy:
@@ -64,6 +64,14 @@ jobs:
6464
sklearn-only: "false"
6565
code-cov: true
6666

67+
# Pandas 2 run
68+
- os: ubuntu-latest
69+
python-version: "3.12"
70+
scikit-learn: "1.5.*"
71+
sklearn-only: "false"
72+
pandas-version: "2.*"
73+
code-cov: false
74+
6775
steps:
6876
- uses: actions/checkout@v6
6977
with:
@@ -74,10 +82,16 @@ jobs:
7482
with:
7583
python-version: ${{ matrix.python-version }}
7684

77-
- name: Install test dependencies and scikit-learn
85+
- name: Install test dependencies, scikit-learn, and optional pandas
86+
shell: bash
7887
run: |
7988
python -m pip install --upgrade pip
8089
pip install -e .[test] scikit-learn==${{ matrix.scikit-learn }}
90+
91+
if [ "${{ matrix.pandas-version }}" != "" ]; then
92+
echo "Installing specific pandas version: ${{ matrix.pandas-version }}"
93+
pip install "pandas==${{ matrix.pandas-version }}"
94+
fi
8195
8296
- name: Store repository status
8397
id: status-before

openml/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
utils,
3434
)
3535
from .__version__ import __version__
36+
from ._api import _backend
3637
from .datasets import OpenMLDataFeature, OpenMLDataset
3738
from .evaluations import OpenMLEvaluation
3839
from .flows import OpenMLFlow
@@ -109,6 +110,7 @@ def populate_cache(
109110
"OpenMLTask",
110111
"__version__",
111112
"_api_calls",
113+
"_backend",
112114
"config",
113115
"datasets",
114116
"evaluations",

openml/_api/__init__.py

Lines changed: 94 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,95 @@
1-
from openml._api.runtime.core import APIContext
1+
from .clients import (
2+
HTTPCache,
3+
HTTPClient,
4+
MinIOClient,
5+
)
6+
from .resources import (
7+
API_REGISTRY,
8+
DatasetAPI,
9+
DatasetV1API,
10+
DatasetV2API,
11+
EstimationProcedureAPI,
12+
EstimationProcedureV1API,
13+
EstimationProcedureV2API,
14+
EvaluationAPI,
15+
EvaluationMeasureAPI,
16+
EvaluationMeasureV1API,
17+
EvaluationMeasureV2API,
18+
EvaluationV1API,
19+
EvaluationV2API,
20+
FallbackProxy,
21+
FlowAPI,
22+
FlowV1API,
23+
FlowV2API,
24+
ResourceAPI,
25+
ResourceV1API,
26+
ResourceV2API,
27+
RunAPI,
28+
RunV1API,
29+
RunV2API,
30+
SetupAPI,
31+
SetupV1API,
32+
SetupV2API,
33+
StudyAPI,
34+
StudyV1API,
35+
StudyV2API,
36+
TaskAPI,
37+
TaskV1API,
38+
TaskV2API,
39+
)
40+
from .setup import (
41+
APIBackend,
42+
APIBackendBuilder,
43+
APIConfig,
44+
CacheConfig,
45+
Config,
46+
ConnectionConfig,
47+
_backend,
48+
)
249

3-
4-
def set_api_version(version: str, *, strict: bool = False) -> None:
5-
api_context.set_version(version=version, strict=strict)
6-
7-
8-
api_context = APIContext()
50+
__all__ = [
51+
"API_REGISTRY",
52+
"APIBackend",
53+
"APIBackendBuilder",
54+
"APIConfig",
55+
"CacheConfig",
56+
"Config",
57+
"ConnectionConfig",
58+
"DatasetAPI",
59+
"DatasetV1API",
60+
"DatasetV2API",
61+
"EstimationProcedureAPI",
62+
"EstimationProcedureV1API",
63+
"EstimationProcedureV2API",
64+
"EvaluationAPI",
65+
"EvaluationMeasureAPI",
66+
"EvaluationMeasureV1API",
67+
"EvaluationMeasureV2API",
68+
"EvaluationV1API",
69+
"EvaluationV2API",
70+
"FallbackProxy",
71+
"FallbackProxy",
72+
"FlowAPI",
73+
"FlowV1API",
74+
"FlowV2API",
75+
"HTTPCache",
76+
"HTTPClient",
77+
"MinIOClient",
78+
"ResourceAPI",
79+
"ResourceAPI",
80+
"ResourceV1API",
81+
"ResourceV2API",
82+
"RunAPI",
83+
"RunV1API",
84+
"RunV2API",
85+
"SetupAPI",
86+
"SetupV1API",
87+
"SetupV2API",
88+
"StudyAPI",
89+
"StudyV1API",
90+
"StudyV2API",
91+
"TaskAPI",
92+
"TaskV1API",
93+
"TaskV2API",
94+
"_backend",
95+
]

openml/_api/clients/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from .http import HTTPCache, HTTPClient
2+
from .minio import MinIOClient
23

34
__all__ = [
45
"HTTPCache",
56
"HTTPClient",
7+
"MinIOClient",
68
]

openml/_api/clients/http.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from requests import Response
1717

1818
from openml.__version__ import __version__
19-
from openml._api.config import RetryPolicy
19+
from openml.enums import RetryPolicy
2020
from openml.exceptions import (
2121
OpenMLNotAuthorizedError,
2222
OpenMLServerError,
@@ -116,15 +116,15 @@ def __init__( # noqa: PLR0913
116116
server: str,
117117
base_url: str,
118118
api_key: str,
119-
timeout: int,
119+
timeout_seconds: int,
120120
retries: int,
121121
retry_policy: RetryPolicy,
122122
cache: HTTPCache | None = None,
123123
) -> None:
124124
self.server = server
125125
self.base_url = base_url
126126
self.api_key = api_key
127-
self.timeout = timeout
127+
self.timeout_seconds = timeout_seconds
128128
self.retries = retries
129129
self.retry_policy = retry_policy
130130
self.cache = cache
@@ -322,6 +322,7 @@ def request(
322322
path: str,
323323
*,
324324
use_cache: bool = False,
325+
reset_cache: bool = False,
325326
use_api_key: bool = False,
326327
**request_kwargs: Any,
327328
) -> Response:
@@ -342,10 +343,10 @@ def request(
342343
headers = request_kwargs.pop("headers", {}).copy()
343344
headers.update(self.headers)
344345

345-
timeout = request_kwargs.pop("timeout", self.timeout)
346+
timeout = request_kwargs.pop("timeout", self.timeout_seconds)
346347
files = request_kwargs.pop("files", None)
347348

348-
if use_cache and self.cache is not None:
349+
if use_cache and not reset_cache and self.cache is not None:
349350
cache_key = self.cache.get_key(url, params)
350351
try:
351352
return self.cache.load(cache_key)
@@ -379,6 +380,7 @@ def request(
379380
assert response is not None
380381

381382
if use_cache and self.cache is not None:
383+
cache_key = self.cache.get_key(url, params)
382384
self.cache.save(cache_key, response)
383385

384386
return response
@@ -388,13 +390,15 @@ def get(
388390
path: str,
389391
*,
390392
use_cache: bool = False,
393+
reset_cache: bool = False,
391394
use_api_key: bool = False,
392395
**request_kwargs: Any,
393396
) -> Response:
394397
return self.request(
395398
method="GET",
396399
path=path,
397400
use_cache=use_cache,
401+
reset_cache=reset_cache,
398402
use_api_key=use_api_key,
399403
**request_kwargs,
400404
)

openml/_api/clients/minio.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from __future__ import annotations
2+
3+
from pathlib import Path
4+
5+
from openml.__version__ import __version__
6+
7+
8+
class MinIOClient:
9+
def __init__(self, path: Path | None = None) -> None:
10+
self.path = path
11+
self.headers: dict[str, str] = {"user-agent": f"openml-python/{__version__}"}

openml/_api/config.py

Lines changed: 0 additions & 60 deletions
This file was deleted.

openml/_api/resources/__init__.py

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,65 @@
1-
from openml._api.resources.base.fallback import FallbackProxy
2-
from openml._api.resources.datasets import DatasetsV1, DatasetsV2
3-
from openml._api.resources.setups import SetupsV1, SetupsV2
4-
from openml._api.resources.tasks import TasksV1, TasksV2
1+
from ._registry import API_REGISTRY
2+
from .base import (
3+
DatasetAPI,
4+
EstimationProcedureAPI,
5+
EvaluationAPI,
6+
EvaluationMeasureAPI,
7+
FallbackProxy,
8+
FlowAPI,
9+
ResourceAPI,
10+
ResourceV1API,
11+
ResourceV2API,
12+
RunAPI,
13+
SetupAPI,
14+
StudyAPI,
15+
TaskAPI,
16+
)
17+
from .dataset import DatasetV1API, DatasetV2API
18+
from .estimation_procedure import (
19+
EstimationProcedureV1API,
20+
EstimationProcedureV2API,
21+
)
22+
from .evaluation import EvaluationV1API, EvaluationV2API
23+
from .evaluation_measure import EvaluationMeasureV1API, EvaluationMeasureV2API
24+
from .flow import FlowV1API, FlowV2API
25+
from .run import RunV1API, RunV2API
26+
from .setup import SetupV1API, SetupV2API
27+
from .study import StudyV1API, StudyV2API
28+
from .task import TaskV1API, TaskV2API
529

630
__all__ = [
7-
"DatasetsV1",
8-
"DatasetsV2",
31+
"API_REGISTRY",
32+
"DatasetAPI",
33+
"DatasetV1API",
34+
"DatasetV2API",
35+
"EstimationProcedureAPI",
36+
"EstimationProcedureV1API",
37+
"EstimationProcedureV2API",
38+
"EvaluationAPI",
39+
"EvaluationMeasureAPI",
40+
"EvaluationMeasureV1API",
41+
"EvaluationMeasureV2API",
42+
"EvaluationV1API",
43+
"EvaluationV2API",
944
"FallbackProxy",
10-
"SetupsV1",
11-
"SetupsV2",
12-
"TasksV1",
13-
"TasksV2",
45+
"FallbackProxy",
46+
"FlowAPI",
47+
"FlowV1API",
48+
"FlowV2API",
49+
"ResourceAPI",
50+
"ResourceAPI",
51+
"ResourceV1API",
52+
"ResourceV2API",
53+
"RunAPI",
54+
"RunV1API",
55+
"RunV2API",
56+
"SetupAPI",
57+
"SetupV1API",
58+
"SetupV2API",
59+
"StudyAPI",
60+
"StudyV1API",
61+
"StudyV2API",
62+
"TaskAPI",
63+
"TaskV1API",
64+
"TaskV2API",
1465
]

0 commit comments

Comments
 (0)