Skip to content

Commit cbe2b3b

Browse files
committed
Merge branch '93-occasional-crashes-due-to-undefined-variable-dt-in-get_csv-hapiclient-version-028'
2 parents 03aec7d + 2c5982c commit cbe2b3b

5 files changed

Lines changed: 47 additions & 10 deletions

File tree

CHANGES.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,7 @@ v0.2.8b2:
120120
2026-05-20 -- Refactor
121121
v0.2.8:
122122
2026-06-04 -- Compat. fixes for hapiplot package.
123+
v0.2.8b0
124+
2026-06-08 -- Show time parsing error message
125+
v0.2.9
126+
2026-06-08 -- 93-occasional-crashes-due-to-undefined-variable-dt-in-get_csv-hapiclient-version-028

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
# 1. make release
2323
# 2. Manually create a release at https://github.com/hapi-server/client-python/releases
2424
# (could do this automatically using https://stackoverflow.com/questions/21214562/how-to-release-versions-on-github-through-the-command-line)
25+
# To test: gh release create <tagname> --target <branchname>
2526
# 3. Wait ~5 minutes and execute
2627
# 4. make release-test-all
2728
# (Will fail until new version is available at pypi.org for pip install.

hapiclient/cache.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def data_cache_read_metax(SERVER, DATASET, PARAMETERS, START, STOP, opts):
171171
from hapiclient.log import log
172172

173173
if not opts["usecache"]:
174-
log('Not checking data cache because usecache is False.')
174+
log('Not checking subsetted metadata cache because usecache is False.')
175175
return None
176176

177177
fnamepklx = data_cache_paths(SERVER, DATASET, PARAMETERS, START, STOP, opts['cachedir'])['pkl']

hapiclient/get.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,9 @@ def get_csv(meta, SERVER, DATASET, PARAMETERS, START, STOP, opts):
174174
if opts["cache"]:
175175
tic0 = time.time()
176176
urlretrieve(urlcsv, fnamecsv)
177-
toc0 = time.time() - tic0
178177
log('Reading and parsing %s' % os.path.basename(fnamecsv))
179-
tic = time.time()
180178
if os.path.getsize(fnamecsv) == 0:
181179
file_empty = True
182-
data = np.array([], dtype=dt)
183180
else:
184181
from io import StringIO
185182
log('Writing %s to buffer' % urlcsv)
@@ -188,22 +185,27 @@ def get_csv(meta, SERVER, DATASET, PARAMETERS, START, STOP, opts):
188185
fnamecsv.seek(0, os.SEEK_END)
189186
if fnamecsv.tell() == 0:
190187
file_empty = True
191-
data = np.array([], dtype=dt)
192188
else:
193189
fnamecsv.seek(0)
194-
toc0 = time.time() - tic0
195190
log('Parsing StringIO buffer.')
196-
tic = time.time()
197191

198-
if not file_empty:
192+
toc0 = time.time() - tic0
193+
194+
tic1 = time.time()
195+
196+
if file_empty:
197+
log("Response is empty. Returning empty data array.")
198+
dt, _, _, _, _ = _compute_dt(meta, opts)
199+
data = np.array([], dtype=dt)
200+
else:
199201
if missing_length(meta, opts):
200202
data = _parse_csv_missing_length(fnamecsv, meta, opts, urlcsv)
201203
else:
202204
data = _parse_csv(fnamecsv, meta, opts, urlcsv)
203205

204-
toc = time.time() - tic
206+
toc1 = time.time() - tic1
205207

206-
return data, toc0, toc
208+
return data, toc0, toc1
207209

208210

209211
def _parse_csv(fnamecsv, meta, opts, urlcsv):

test/test_hapi_data_requests.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,38 @@ def test_unicode():
212212
assert compare.read(server, dataset, parameter, run, opts.copy(), logger=logger)
213213
assert compare.cache(server, dataset, parameter, opts.copy(), logger=logger)
214214

215+
def test_empty_response():
216+
from hapiclient import hapi
217+
218+
server = 'http://hapi-server.org/servers/TestData2.0/hapi'
219+
dataset = 'dataset1'
220+
221+
# Time range with no data.
222+
start = '1970-01-01T00:00:00.1Z'
223+
stop = '1970-01-01T00:00:00.2Z'
224+
225+
_kwargs = kwargs.copy()
226+
_kwargs['cache'] = False
227+
_kwargs['usecache'] = False
228+
data_csv, meta = hapi(server, dataset, '', start, stop, format='csv', **_kwargs)
229+
data_bin, meta = hapi(server, dataset, '', start, stop, format='binary', **_kwargs)
230+
231+
assert len(data_csv) == 0
232+
assert compare.equal(data_csv, data_bin)
233+
234+
for i in range(2):
235+
_kwargs = kwargs.copy()
236+
_kwargs['cache'] = True
237+
_kwargs['usecache'] = True
238+
data_csv, meta = hapi(server, dataset, '', start, stop, format='csv', **_kwargs)
239+
data_bin, meta = hapi(server, dataset, '', start, stop, format='binary', **_kwargs)
240+
241+
assert len(data_csv) == 0
242+
assert compare.equal(data_csv, data_bin)
243+
215244

216245
if __name__ == '__main__':
246+
test_empty_response()
217247
test_subset_short()
218248
test_reader_timing_short()
219249
test_reader_timing_long()

0 commit comments

Comments
 (0)