4
4
"""OhsomeClient classes to build and handle requests to ohsome API"""
5
5
import datetime as dt
6
6
import json
7
+ from functools import cached_property
7
8
from pathlib import Path
8
9
from typing import Union , Optional , List
9
10
from urllib .parse import urljoin
@@ -129,8 +130,7 @@ def __init__(
129
130
base_api_url , log , log_dir , cache , user_agent , retry
130
131
)
131
132
self ._parameters = None
132
- self ._metadata = None
133
- self ._url = None
133
+ self ._metadata_url = f"{ self .base_api_url } metadata"
134
134
135
135
@property
136
136
def base_api_url (self ):
@@ -142,12 +142,8 @@ def start_timestamp(self):
142
142
Returns the temporal extent of the current ohsome API
143
143
:return:
144
144
"""
145
- if self ._metadata is None :
146
- self ._query_metadata ()
147
145
return dt .datetime .fromisoformat (
148
- self ._metadata ["extractRegion" ]["temporalExtent" ]["fromTimestamp" ].strip (
149
- "Z"
150
- )
146
+ self .metadata ["extractRegion" ]["temporalExtent" ]["fromTimestamp" ].strip ("Z" )
151
147
)
152
148
153
149
@property
@@ -156,10 +152,8 @@ def end_timestamp(self):
156
152
Returns the temporal extent of the current ohsome API
157
153
:return:
158
154
"""
159
- if self ._metadata is None :
160
- self ._query_metadata ()
161
155
return dt .datetime .fromisoformat (
162
- self ._metadata ["extractRegion" ]["temporalExtent" ]["toTimestamp" ].strip ("Z" )
156
+ self .metadata ["extractRegion" ]["temporalExtent" ]["toTimestamp" ].strip ("Z" )
163
157
)
164
158
165
159
@property
@@ -168,41 +162,33 @@ def api_version(self):
168
162
Returns the version of the ohsome API
169
163
:return:
170
164
"""
171
- if self ._metadata is None :
172
- self ._query_metadata ()
173
- return self ._metadata ["apiVersion" ]
165
+ return self .metadata ["apiVersion" ]
174
166
175
- @property
167
+ @cached_property
176
168
def metadata (self ):
177
- if self ._metadata is None :
178
- self ._query_metadata ()
179
- return self ._metadata
180
-
181
- def _query_metadata (self ):
182
169
"""
183
170
Send ohsome GET request
184
171
:return:
185
172
"""
186
- self ._url = self ._base_api_url + "metadata"
187
173
try :
188
- response = self ._session ().get (self ._url )
174
+ response = self ._session ().get (self ._metadata_url )
189
175
response .raise_for_status ()
190
176
except requests .exceptions .ConnectionError :
191
177
raise OhsomeException (
192
178
message = "Connection Error: Query could not be sent. Make sure there are no network "
193
- f"problems and that the ohsome API URL { self ._url } is valid." ,
194
- url = self ._url ,
179
+ f"problems and that the ohsome API URL { self ._metadata_url } is valid." ,
180
+ url = self ._metadata_url ,
195
181
params = self ._parameters ,
196
182
)
197
183
except requests .exceptions .HTTPError as e :
198
184
raise OhsomeException (
199
185
message = e .response .json ()["message" ],
200
- url = self ._url ,
186
+ url = self ._metadata_url ,
201
187
params = self ._parameters ,
202
188
error_code = e .response .status_code ,
203
189
)
204
190
else :
205
- self . _metadata = response .json ()
191
+ return response .json ()
206
192
207
193
208
194
class _OhsomePostClient (_OhsomeBaseClient ):
@@ -232,7 +218,6 @@ def __init__(
232
218
base_api_url , log , log_dir , cache , user_agent , retry
233
219
)
234
220
self ._parameters = None
235
- self ._metadata = None
236
221
self ._url = None
237
222
238
223
def post (
0 commit comments