11import io
22import os
33import requests
4- import arff
54import warnings
65
6+ import arff
7+ import xmltodict
8+
79from . import config
8- from .exceptions import OpenMLServerError
10+ from .exceptions import OpenMLServerError , OpenMLServerException
911
1012
1113def _perform_api_call (call , data = None , file_dictionary = None ,
@@ -50,6 +52,18 @@ def _read_url(self, url, add_authentication=False, data=None, filePath=None):
5052 return _read_url (url , data )
5153
5254
55+ def _file_id_to_url (file_id , filename = None ):
56+ '''
57+ Presents the URL how to download a given file id
58+ filename is optional
59+ '''
60+ openml_url = config .server .split ('/api/' )
61+ url = openml_url [0 ] + '/data/download/%s' % file_id
62+ if filename is not None :
63+ url += '/' + filename
64+ return url
65+
66+
5367def _read_url_files (url , data = None , file_dictionary = None , file_elements = None ):
5468 """do a post request to url with data, file content of
5569 file_dictionary and sending file_elements as files"""
@@ -80,7 +94,7 @@ def _read_url_files(url, data=None, file_dictionary=None, file_elements=None):
8094 # 'gzip,deflate'
8195 response = requests .post (url , data = data , files = file_elements )
8296 if response .status_code != 200 :
83- raise OpenMLServerError (( 'Status code: %d \n ' % response . status_code ) + response . text )
97+ raise _parse_server_exception ( response )
8498 if 'Content-Encoding' not in response .headers or \
8599 response .headers ['Content-Encoding' ] != 'gzip' :
86100 warnings .warn ('Received uncompressed content from OpenML for %s.' % url )
@@ -97,8 +111,25 @@ def _read_url(url, data=None):
97111 response = requests .post (url , data = data )
98112
99113 if response .status_code != 200 :
100- raise OpenMLServerError (( 'Status code: %d \n ' % response . status_code ) + response . text )
114+ raise _parse_server_exception ( response )
101115 if 'Content-Encoding' not in response .headers or \
102116 response .headers ['Content-Encoding' ] != 'gzip' :
103117 warnings .warn ('Received uncompressed content from OpenML for %s.' % url )
104118 return response .text
119+
120+ def _parse_server_exception (response ):
121+ # OpenML has a sopisticated error system
122+ # where information about failures is provided. try to parse this
123+ try :
124+ server_exception = xmltodict .parse (response .text )
125+ except :
126+ raise OpenMLServerError (('Unexpected server error. Please '
127+ 'contact the developers!\n Status code: '
128+ '%d\n ' % response .status_code ) + response .text )
129+
130+ code = int (server_exception ['oml:error' ]['oml:code' ])
131+ message = server_exception ['oml:error' ]['oml:message' ]
132+ additional = None
133+ if 'oml:additional_information' in server_exception ['oml:error' ]:
134+ additional = server_exception ['oml:error' ]['oml:additional_information' ]
135+ return OpenMLServerException (code , message , additional )
0 commit comments