diff --git a/CHANGES b/CHANGES index 0a03dc0717..443189e330 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,7 @@ --------- - Fix NASA ADS, which had an internal syntax error (#602) +- Bugifx in NRAO queries: telescope config was parsed incorrectly (#629) - IBE - added new module for locating data from PTF, WISE, and 2MASS from IRSA. See for more information about IBE and for more information about PTF survey diff --git a/astroquery/nrao/core.py b/astroquery/nrao/core.py index cefcceaae4..8cd27aa83a 100644 --- a/astroquery/nrao/core.py +++ b/astroquery/nrao/core.py @@ -197,6 +197,7 @@ def _args_to_payload(self, **kwargs): @prepend_docstr_noreturns(_args_to_payload.__doc__) def query_async(self, get_query_payload=False, + cache=True, **kwargs): """ Returns @@ -209,10 +210,8 @@ def query_async(self, if get_query_payload: return request_payload - response = commons.send_request(Nrao.DATA_URL, - request_payload, - Nrao.TIMEOUT, - request_type='POST') + response = self._request('POST', self.DATA_URL, params=request_payload, + timeout=self.TIMEOUT, cache=cache) return response @prepend_docstr_noreturns(_args_to_payload.__doc__) @@ -244,11 +243,8 @@ def query_region_async(self, coordinates, radius=1 * u.deg, def _parse_result(self, response, verbose=False): if not verbose: commons.suppress_vo_warnings() - # fix to replace non standard datatype 'integer' in returned VOTable - # with 'int' to make it parsable by astropy.io.votable - integer_re = re.compile(r'datatype="integer"') - content = response.text - new_content = integer_re.sub(r'datatype="int"', content) + + new_content = response.text # these are pretty bad hacks, but also needed... days_re = re.compile(r'unit="days" datatype="double"') @@ -257,10 +253,17 @@ def _parse_result(self, response, verbose=False): degrees_re = re.compile(r'unit="degrees" datatype="double"') new_content = degrees_re.sub(r'unit="degrees" datatype="char" ' 'arraysize="*"', new_content) + telconfig_re = re.compile(r'datatype="char" name="Telescope:config"') + new_content = telconfig_re.sub(r'datatype="unicodeChar" ' + 'name="Telescope:config" ' + ' arraysize="*" ', new_content) + + datatype_mapping = {'integer':'long'} try: tf = six.BytesIO(new_content.encode()) - first_table = votable.parse(tf, pedantic=False).get_first_table() + first_table = votable.parse(tf, pedantic=False, + datatype_mapping=datatype_mapping).get_first_table() try: table = first_table.to_table(use_names_over_ids=True) except TypeError: diff --git a/astroquery/nrao/tests/test_nrao.py b/astroquery/nrao/tests/test_nrao.py index 7527fc24d8..b624cf2c35 100644 --- a/astroquery/nrao/tests/test_nrao.py +++ b/astroquery/nrao/tests/test_nrao.py @@ -28,29 +28,20 @@ def parse_coordinates_mock_return(c): return mp -@pytest.fixture -def patch_get(request): - mp = request.getfuncargvalue("monkeypatch") - mp.setattr(requests, 'get', get_mockreturn) - return mp - @pytest.fixture def patch_post(request): mp = request.getfuncargvalue("monkeypatch") - mp.setattr(requests, 'post', post_mockreturn) + mp.setattr(requests.Session, 'request', post_mockreturn) return mp -def get_mockreturn(url, params=None, timeout=10, **kwargs): - filename = data_path(DATA_FILES['votable']) - content = open(filename, 'rb').read() - return MockResponse(content, **kwargs) - - -def post_mockreturn(url, data=None, timeout=10, **kwargs): +def post_mockreturn(self, method, url, data=None, timeout=10, files=None, + params=None, headers=None, **kwargs): + if method != 'POST': + raise ValueError("A 'post request' was made with method != POST") filename = data_path(DATA_FILES['votable']) - content = open(filename, 'rb').read() + content = open(filename, "rb").read() return MockResponse(content, **kwargs)