Skip to content

Commit 54ca5fe

Browse files
authored
Merge pull request #2238 from esdc-esac-esa-int/ejwst_release
eJWST release
2 parents 11c2ddf + 9667831 commit 54ca5fe

File tree

7 files changed

+143
-43
lines changed

7 files changed

+143
-43
lines changed

CHANGES.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ New Tools and Services
77
esa.jwst
88
^^^^^^^^^^
99

10-
- New module to provide access to eJWST Science Archive metadata and datasets. [#2140]
10+
- New module to provide access to eJWST Science Archive metadata and datasets. [#2140, #2238]
1111

1212

1313
Service fixes and enhancements

astroquery/esa/jwst/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ class Conf(_config.ConfigNamespace):
2323
Configuration parameters for `astroquery.esa.jwst`.
2424
"""
2525

26-
JWST_TAP_SERVER = _config.ConfigItem("http://jwstdummytap.com", "eJWST TAP Server")
27-
JWST_DATA_SERVER = _config.ConfigItem("http://jwstdummydata.com", "eJWST Data Server")
26+
JWST_TAP_SERVER = _config.ConfigItem("https://jwst.esac.esa.int/server/tap", "eJWST TAP Server")
27+
JWST_DATA_SERVER = _config.ConfigItem("https://jwst.esac.esa.int/server/data?", "eJWST Data Server")
2828
JWST_TOKEN = _config.ConfigItem("jwstToken", "eJWST token")
2929
JWST_MESSAGES = _config.ConfigItem("notification?action=GetNotifications", "eJWST Messages")
3030

astroquery/esa/jwst/core.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import gzip
1313
import os
1414
import shutil
15+
import sys
1516
import tarfile
1617
import zipfile
1718
from builtins import isinstance
@@ -41,7 +42,6 @@ class JwstClass(BaseQuery):
4142

4243
"""
4344
Proxy class to default TapPlus object (pointing to JWST Archive)
44-
THIS MODULE IS NOT OPERATIVE YET. METHODS WILL NOT WORK UNTIL eJWST ARCHIVE IS OFFICIALLY RELEASED
4545
"""
4646

4747
JWST_DEFAULT_COLUMNS = ['observationid', 'calibrationlevel', 'public',
@@ -58,7 +58,7 @@ class JwstClass(BaseQuery):
5858
CAL_LEVELS = ['ALL', 1, 2, 3, -1]
5959
REQUESTED_OBSERVATION_ID = "Missing required argument: 'observation_id'"
6060

61-
def __init__(self, *, tap_plus_handler=None, data_handler=None):
61+
def __init__(self, *, tap_plus_handler=None, data_handler=None, show_messages=True):
6262
if tap_plus_handler is None:
6363
self.__jwsttap = TapPlus(url=conf.JWST_TAP_SERVER,
6464
data_context='data')
@@ -70,7 +70,9 @@ def __init__(self, *, tap_plus_handler=None, data_handler=None):
7070
base_url=conf.JWST_DATA_SERVER)
7171
else:
7272
self.__jwstdata = data_handler
73-
print("THIS MODULE IS NOT OPERATIVE YET. METHODS WILL NOT WORK UNTIL eJWST ARCHIVE IS OFFICIALLY RELEASED")
73+
74+
if show_messages:
75+
self.get_status_messages()
7476

7577
def load_tables(self, *, only_names=False, include_shared_tables=False,
7678
verbose=False):
@@ -692,13 +694,16 @@ def get_status_messages(self):
692694
the status of JWST TAP
693695
"""
694696

695-
subContext = conf.JWST_MESSAGES
696-
connHandler = self.__jwsttap._TapPlus__getconnhandler()
697-
response = connHandler.execute_tapget(subContext, False)
698-
if response.status == 200:
699-
for line in response:
700-
string_message = line.decode("utf-8")
701-
print(string_message[string_message.index('=')+1:])
697+
try:
698+
subContext = conf.JWST_MESSAGES
699+
connHandler = self.__jwsttap._TapPlus__getconnhandler()
700+
response = connHandler.execute_tapget(subContext, False)
701+
if response.status == 200:
702+
for line in response:
703+
string_message = line.decode("utf-8")
704+
print(string_message[string_message.index('=')+1:])
705+
except OSError as e:
706+
print("Status messages could not be retrieved")
702707

703708
def get_product_list(self, *, observation_id=None,
704709
cal_level="ALL",
@@ -930,7 +935,7 @@ def get_product(self, *, artifact_id=None, file_name=None):
930935
return output_file_name
931936

932937
def _query_get_product(self, *, artifact_id=None, file_name=None):
933-
if(file_name):
938+
if file_name:
934939
query_artifactid = (f"select * from {conf.JWST_ARTIFACT_TABLE} "
935940
f"a where a.filename = "
936941
f"'{file_name}'")

astroquery/esa/jwst/tests/DummyTapHandler.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
European Space Agency (ESA)
99
1010
"""
11+
from astropy.table import Table
12+
import numpy as np
1113

1214
from astroquery.utils.tap.model.job import Job
1315

@@ -17,14 +19,18 @@ class DummyTapHandler:
1719
def __init__(self):
1820
self.__invokedMethod = None
1921
self.__parameters = {}
20-
self.__dummy_results = "dummy_results"
22+
self.__dummy_results = {"filename": ["dummy_filename"],
23+
"artifactid": ["dummy_artifact"],
24+
"observationid": Table({'obs': np.arange(1)})}
2125
self.__job = Job(async_job=False)
2226
self.__job.set_results(self.__dummy_results)
2327

2428
def reset(self):
2529
self.__parameters = {}
2630
self.__invokedMethod = None
27-
self.__dummy_results = "dummy_results"
31+
self.__dummy_results = {"filename": ["dummy_filename"],
32+
"artifactid": ["dummy_artifact"],
33+
"observationid": Table({'a': np.arange(1)})}
2834
self.__job = Job(async_job=False)
2935
self.__job.set_results(self.__dummy_results)
3036

@@ -217,9 +223,9 @@ def save_results(self, job, verbose=False):
217223
def login(self, user=None, password=None, credentials_file=None,
218224
verbose=False):
219225
self.__invokedMethod = 'login'
220-
self.__parameters['user'] = verbose
221-
self.__parameters['password'] = verbose
222-
self.__parameters['credentials_file'] = verbose
226+
self.__parameters['user'] = user
227+
self.__parameters['password'] = password
228+
self.__parameters['credentials_file'] = credentials_file
223229
self.__parameters['verbose'] = verbose
224230
return None
225231

@@ -238,3 +244,7 @@ def load_data(self, params_dict, output_file=None, verbose=False):
238244
self.__parameters['params_dict'] = params_dict
239245
self.__parameters['output_file'] = output_file
240246
self.__parameters['verbose'] = verbose
247+
248+
def set_job_results(self, results):
249+
self.__dummy_results = results
250+
self.__job.set_results(self.__dummy_results)

astroquery/esa/jwst/tests/test_jwstdata.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class TestData:
4040

4141
def test_get_product(self):
4242
dummyTapHandler = DummyTapHandler()
43-
jwst = JwstClass(tap_plus_handler=dummyTapHandler)
43+
jwst = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
4444
# default parameters
4545
parameters = {}
4646
parameters['artifact_id'] = None

astroquery/esa/jwst/tests/test_jwsttap.py

Lines changed: 104 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ def get_product_mock(params, *args, **kwargs):
7373

7474
@pytest.fixture(autouse=True)
7575
def get_product_request(request):
76+
if 'noautofixt' in request.keywords:
77+
return
7678
mp = request.getfixturevalue("monkeypatch")
7779
mp.setattr(JwstClass, '_query_get_product', get_product_mock)
7880
return mp
@@ -85,7 +87,7 @@ class TestTap:
8587

8688
def test_load_tables(self):
8789
dummyTapHandler = DummyTapHandler()
88-
tap = JwstClass(tap_plus_handler=dummyTapHandler)
90+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
8991
# default parameters
9092
parameters = {}
9193
parameters['only_names'] = False
@@ -104,7 +106,7 @@ def test_load_tables(self):
104106

105107
def test_load_table(self):
106108
dummyTapHandler = DummyTapHandler()
107-
tap = JwstClass(tap_plus_handler=dummyTapHandler)
109+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
108110
# default parameters
109111
parameters = {}
110112
parameters['table'] = 'table'
@@ -121,7 +123,7 @@ def test_load_table(self):
121123

122124
def test_launch_sync_job(self):
123125
dummyTapHandler = DummyTapHandler()
124-
tap = JwstClass(tap_plus_handler=dummyTapHandler)
126+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
125127
query = "query"
126128
# default parameters
127129
parameters = {}
@@ -164,7 +166,7 @@ def test_launch_sync_job(self):
164166

165167
def test_launch_async_job(self):
166168
dummyTapHandler = DummyTapHandler()
167-
tap = JwstClass(tap_plus_handler=dummyTapHandler)
169+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
168170
query = "query"
169171
# default parameters
170172
parameters = {}
@@ -212,7 +214,7 @@ def test_launch_async_job(self):
212214

213215
def test_list_async_jobs(self):
214216
dummyTapHandler = DummyTapHandler()
215-
tap = JwstClass(tap_plus_handler=dummyTapHandler)
217+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
216218
# default parameters
217219
parameters = {}
218220
parameters['verbose'] = False
@@ -227,7 +229,7 @@ def test_list_async_jobs(self):
227229
def test_query_region(self):
228230
connHandler = DummyConnHandler()
229231
tapplus = TapPlus("http://test:1111/tap", connhandler=connHandler)
230-
tap = JwstClass(tap_plus_handler=tapplus)
232+
tap = JwstClass(tap_plus_handler=tapplus, show_messages=False)
231233

232234
# Launch response: we use default response because the
233235
# query contains decimals
@@ -367,7 +369,7 @@ def test_query_region(self):
367369
def test_query_region_async(self):
368370
connHandler = DummyConnHandler()
369371
tapplus = TapPlus("http://test:1111/tap", connhandler=connHandler)
370-
tap = JwstClass(tap_plus_handler=tapplus)
372+
tap = JwstClass(tap_plus_handler=tapplus, show_messages=False)
371373
jobid = '12345'
372374
# Launch response
373375
responseLaunchJob = DummyResponse()
@@ -456,7 +458,7 @@ def test_query_region_async(self):
456458
def test_cone_search_sync(self):
457459
connHandler = DummyConnHandler()
458460
tapplus = TapPlus("http://test:1111/tap", connhandler=connHandler)
459-
tap = JwstClass(tap_plus_handler=tapplus)
461+
tap = JwstClass(tap_plus_handler=tapplus, show_messages=False)
460462
# Launch response: we use default response because the
461463
# query contains decimals
462464
responseLaunchJob = DummyResponse()
@@ -548,7 +550,7 @@ def test_cone_search_sync(self):
548550
def test_cone_search_async(self):
549551
connHandler = DummyConnHandler()
550552
tapplus = TapPlus("http://test:1111/tap", connhandler=connHandler)
551-
tap = JwstClass(tap_plus_handler=tapplus)
553+
tap = JwstClass(tap_plus_handler=tapplus, show_messages=False)
552554
jobid = '12345'
553555
# Launch response
554556
responseLaunchJob = DummyResponse()
@@ -618,7 +620,7 @@ def test_cone_search_async(self):
618620

619621
def test_get_product_by_artifactid(self):
620622
dummyTapHandler = DummyTapHandler()
621-
jwst = JwstClass(tap_plus_handler=dummyTapHandler, data_handler=dummyTapHandler)
623+
jwst = JwstClass(tap_plus_handler=dummyTapHandler, data_handler=dummyTapHandler, show_messages=False)
622624
# default parameters
623625
with pytest.raises(ValueError) as err:
624626
jwst.get_product()
@@ -642,7 +644,7 @@ def test_get_product_by_artifactid(self):
642644

643645
def test_get_product_by_filename(self):
644646
dummyTapHandler = DummyTapHandler()
645-
jwst = JwstClass(tap_plus_handler=dummyTapHandler, data_handler=dummyTapHandler)
647+
jwst = JwstClass(tap_plus_handler=dummyTapHandler, data_handler=dummyTapHandler, show_messages=False)
646648
# default parameters
647649
with pytest.raises(ValueError) as err:
648650
jwst.get_product()
@@ -666,7 +668,7 @@ def test_get_product_by_filename(self):
666668

667669
def test_get_products_list(self):
668670
dummyTapHandler = DummyTapHandler()
669-
jwst = JwstClass(tap_plus_handler=dummyTapHandler, data_handler=dummyTapHandler)
671+
jwst = JwstClass(tap_plus_handler=dummyTapHandler, data_handler=dummyTapHandler, show_messages=False)
670672
# default parameters
671673
with pytest.raises(ValueError) as err:
672674
jwst.get_product_list()
@@ -700,7 +702,7 @@ def test_get_products_list(self):
700702

701703
def test_get_obs_products(self):
702704
dummyTapHandler = DummyTapHandler()
703-
jwst = JwstClass(tap_plus_handler=dummyTapHandler, data_handler=dummyTapHandler)
705+
jwst = JwstClass(tap_plus_handler=dummyTapHandler, data_handler=dummyTapHandler, show_messages=False)
704706
# default parameters
705707
with pytest.raises(ValueError) as err:
706708
jwst.get_obs_products()
@@ -925,7 +927,7 @@ def __check_extracted_files(self, files_expected, files_returned):
925927
raise ValueError(f"Not found expected file: {f}")
926928

927929
def test_query_target_error(self):
928-
jwst = JwstClass()
930+
jwst = JwstClass(show_messages=False)
929931
simbad = Simbad()
930932
ned = Ned()
931933
vizier = Vizier()
@@ -955,16 +957,101 @@ def test_query_target_error(self):
955957

956958
# coordinate_error = 'coordinate must be either a string or astropy.coordinates'
957959
with pytest.raises(ValueError) as err:
958-
jwst.query_target(target_name="M1", target_resolver="SIMBAD",
960+
jwst.query_target(target_name="test", target_resolver="SIMBAD",
959961
radius=units.Quantity(5, units.deg))
960962
assert 'This target name cannot be determined with this resolver: SIMBAD' in err.value.args[0]
961963

962964
with pytest.raises(ValueError) as err:
963-
jwst.query_target(target_name="M1", target_resolver="NED",
965+
jwst.query_target(target_name="test", target_resolver="NED",
964966
radius=units.Quantity(5, units.deg))
965967
assert 'This target name cannot be determined with this resolver: NED' in err.value.args[0]
966968

967969
with pytest.raises(ValueError) as err:
968-
jwst.query_target(target_name="M1", target_resolver="VIZIER",
970+
jwst.query_target(target_name="test", target_resolver="VIZIER",
969971
radius=units.Quantity(5, units.deg))
970972
assert 'This target name cannot be determined with this resolver: VIZIER' in err.value.args[0]
973+
974+
def test_remove_jobs(self):
975+
dummyTapHandler = DummyTapHandler()
976+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
977+
job_list = ['dummyJob']
978+
parameters = {}
979+
parameters['jobs_list'] = job_list
980+
parameters['verbose'] = False
981+
tap.remove_jobs(job_list)
982+
dummyTapHandler.check_call('remove_jobs', parameters)
983+
984+
def test_save_results(self):
985+
dummyTapHandler = DummyTapHandler()
986+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
987+
job = 'dummyJob'
988+
parameters = {}
989+
parameters['job'] = job
990+
parameters['verbose'] = False
991+
tap.save_results(job)
992+
dummyTapHandler.check_call('save_results', parameters)
993+
994+
def test_login(self):
995+
dummyTapHandler = DummyTapHandler()
996+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
997+
parameters = {}
998+
parameters['user'] = 'test_user'
999+
parameters['password'] = 'test_password'
1000+
parameters['credentials_file'] = None
1001+
parameters['verbose'] = False
1002+
tap.login(user='test_user', password='test_password')
1003+
dummyTapHandler.check_call('login', parameters)
1004+
1005+
def test_login_gui(self):
1006+
dummyTapHandler = DummyTapHandler()
1007+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
1008+
parameters = {}
1009+
parameters['verbose'] = False
1010+
tap.login_gui()
1011+
dummyTapHandler.check_call('login_gui', parameters)
1012+
1013+
def test_logout(self):
1014+
dummyTapHandler = DummyTapHandler()
1015+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
1016+
parameters = {}
1017+
parameters['verbose'] = False
1018+
tap.logout()
1019+
dummyTapHandler.check_call('logout', parameters)
1020+
1021+
@pytest.mark.noautofixt
1022+
def test_query_get_product(self):
1023+
dummyTapHandler = DummyTapHandler()
1024+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
1025+
file = 'test_file'
1026+
parameters = {}
1027+
parameters['query'] = f"select * from jwst.artifact a where a.filename = '{file}'"
1028+
parameters['name'] = None
1029+
parameters['output_file'] = None
1030+
parameters['output_format'] = 'votable'
1031+
parameters['verbose'] = False
1032+
parameters['dump_to_file'] = False
1033+
parameters['upload_resource'] = None
1034+
parameters['upload_table_name'] = None
1035+
tap._query_get_product(file_name=file)
1036+
dummyTapHandler.check_call('launch_job', parameters)
1037+
1038+
artifact = 'test_artifact'
1039+
parameters['query'] = f"select * from jwst.artifact a where a.artifactid = '{artifact}'"
1040+
tap._query_get_product(artifact_id=artifact)
1041+
dummyTapHandler.check_call('launch_job', parameters)
1042+
1043+
def test_get_related_observations(self):
1044+
dummyTapHandler = DummyTapHandler()
1045+
tap = JwstClass(tap_plus_handler=dummyTapHandler, show_messages=False)
1046+
obs = 'dummyObs'
1047+
tap.get_related_observations(observation_id=obs)
1048+
parameters = {}
1049+
parameters['query'] = f"select * from jwst.main m where m.members like '%{obs}%'"
1050+
parameters['name'] = None
1051+
parameters['output_file'] = None
1052+
parameters['output_format'] = 'votable'
1053+
parameters['verbose'] = False
1054+
parameters['dump_to_file'] = False
1055+
parameters['upload_resource'] = None
1056+
parameters['upload_table_name'] = None
1057+
dummyTapHandler.check_call('launch_job', parameters)

0 commit comments

Comments
 (0)