33from typing import Any
44
55import pandas as pd
6- import requests
76import xmltodict
87
98from openml ._api .resources .base import FlowsAPI
10- from openml .exceptions import OpenMLServerException
9+ from openml .exceptions import OpenMLServerError , OpenMLServerException
1110from openml .flows .flow import OpenMLFlow
1211
1312
@@ -55,17 +54,7 @@ def exists(self, name: str, external_version: str) -> int | bool:
5554 raise ValueError ("Argument 'version' should be a non-empty string" )
5655
5756 data = {"name" : name , "external_version" : external_version , "api_key" : self ._http .api_key }
58- # Avoid duplicating base_url when server already contains the API path
59- server = self ._http .server
60- base = self ._http .base_url
61- if base and base .strip ("/" ) in server :
62- url = server .rstrip ("/" ) + "/flow/exists"
63- response = requests .post (
64- url , data = data , headers = self ._http .headers , timeout = self ._http .timeout
65- )
66- xml_response = response .text
67- else :
68- xml_response = self ._http .post ("flow/exists" , data = data ).text
57+ xml_response = self ._http .post ("flow/exists" , data = data ).text
6958 result_dict = xmltodict .parse (xml_response )
7059 # Detect error payloads and raise
7160 if "oml:error" in result_dict :
@@ -116,20 +105,8 @@ def list(
116105 if uploader is not None :
117106 api_call += f"/uploader/{ uploader } "
118107
119- server = self ._http .server
120- base = self ._http .base_url
121- if base and base .strip ("/" ) in server :
122- url = server .rstrip ("/" ) + "/" + api_call
123- response = requests .get (
124- url ,
125- headers = self ._http .headers ,
126- params = {"api_key" : self ._http .api_key },
127- timeout = self ._http .timeout ,
128- )
129- xml_string = response .text
130- else :
131- response = self ._http .get (api_call , use_api_key = True )
132- xml_string = response .text
108+ response = self ._http .get (api_call , use_api_key = True )
109+ xml_string = response .text
133110 flows_dict = xmltodict .parse (xml_string , force_list = ("oml:flow" ,))
134111
135112 if "oml:error" in flows_dict :
@@ -158,7 +135,7 @@ def list(
158135
159136 return pd .DataFrame .from_dict (flows , orient = "index" )
160137
161- def create (self , flow : OpenMLFlow ) -> OpenMLFlow :
138+ def publish (self , flow : OpenMLFlow ) -> OpenMLFlow : # type: ignore[override]
162139 """Create a new flow on the OpenML server.
163140
164141 under development , not fully functional yet
@@ -187,16 +164,7 @@ def create(self, flow: OpenMLFlow) -> OpenMLFlow:
187164 # POST to server (multipart/files). Ensure api_key is sent in the form data.
188165 files = file_elements
189166 data = {"api_key" : self ._http .api_key }
190- # If server already contains base path, post directly with requests to avoid double base_url
191- server = self ._http .server
192- base = self ._http .base_url
193- if base and base .strip ("/" ) in server :
194- url = server .rstrip ("/" ) + "/flow"
195- response = requests .post (
196- url , files = files , data = data , headers = self ._http .headers , timeout = self ._http .timeout
197- )
198- else :
199- response = self ._http .post ("flow" , files = files , data = data )
167+ response = self ._http .post ("flow" , files = files , data = data )
200168
201169 parsed = xmltodict .parse (response .text )
202170 if "oml:error" in parsed :
@@ -222,9 +190,6 @@ def delete(self, flow_id: int) -> bool:
222190 self ._http .delete (f"flow/{ flow_id } " )
223191 return True
224192
225- def publish (self ) -> None :
226- pass
227-
228193
229194class FlowsV2 (FlowsAPI ):
230195 def get (
@@ -277,8 +242,8 @@ def exists(self, name: str, external_version: str) -> int | bool:
277242 result = response .json ()
278243 flow_id : int | bool = result .get ("flow_id" , False )
279244 return flow_id
280- except (requests . exceptions . HTTPError , KeyError ):
281- # v2 returns 404 when flow doesn't exist
245+ except (OpenMLServerError , KeyError ):
246+ # v2 returns 404 when flow doesn't exist, which raises OpenMLServerError
282247 return False
283248
284249 def list (
@@ -291,15 +256,12 @@ def list(
291256 ) -> pd .DataFrame :
292257 raise NotImplementedError ("flows (list) not yet implemented in v2 server" )
293258
294- def create (self , flow : OpenMLFlow ) -> OpenMLFlow :
259+ def publish (self , flow : OpenMLFlow ) -> OpenMLFlow : # type: ignore[override]
295260 raise NotImplementedError ("POST /flows (create) not yet implemented in v2 server" )
296261
297262 def delete (self , flow_id : int ) -> bool :
298263 raise NotImplementedError ("DELETE /flows/{id} not yet implemented in v2 server" )
299264
300- def publish (self ) -> None :
301- raise NotImplementedError ("publish not implemented in v2 server" )
302-
303265 @staticmethod
304266 def _convert_v2_to_v1_format (v2_json : dict [str , Any ]) -> dict [str , dict ]:
305267 """Convert v2 JSON response to v1 XML-dict format for OpenMLFlow._from_dict().
0 commit comments