Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Get IBE's query_region_async function minimally working #1430

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
12 changes: 6 additions & 6 deletions astroquery/ibe/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ class Conf(_config.ConfigNamespace):
Configuration parameters for `astroquery.ibe`.
"""

# For some reason the IBE in the URL is case sensitive
server = _config.ConfigItem(
'http://irsa.ipac.caltech.edu/ibe/',
'http://irsa.ipac.caltech.edu/IBE/',
'Name of the IBE server to use.')
mission = _config.ConfigItem(
'ptf',
Expand All @@ -24,12 +25,11 @@ class Conf(_config.ConfigNamespace):

dataset = _config.ConfigItem(
'images',
('Default data set. See, for example, '
'http://irsa.ipac.caltech.edu/ibe/search/ptf for options.'))
('This option is meaningless in the context of IRSA\'s ibe.'))
table = _config.ConfigItem(
'level1',
('Default table. See, for example, '
'http://irsa.ipac.caltech.edu/ibe/search/ptf/images for options.'))
'ptf.ptf_procimg',
('Default table. Select the desired mission at '
'http://irsa.ipac.caltech.edu/ibe/search/ for options.'))
timeout = _config.ConfigItem(
60,
'Time limit for connecting to the IRSA server.')
Expand Down
81 changes: 43 additions & 38 deletions astroquery/ibe/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@
from __future__ import print_function, division

import os
import sys

import webbrowser
from bs4 import BeautifulSoup

import astropy.coordinates as coord
from astropy.table import Table
from astropy.io.ascii.html import HTML
import six

from ..exceptions import InvalidQueryError
Expand All @@ -24,6 +27,14 @@

__all__ = ['Ibe', 'IbeClass']

if sys.version_info[0] >= 3:
decode = lambda x: x.decode()
encode = lambda x: bytes(x, "ascii")

else:
decode = lambda x: x
encode = lambda x: x


class IbeClass(BaseQuery):
URL = conf.server
Expand Down Expand Up @@ -107,7 +118,8 @@ def query_region(
# Raise exception, if request failed
response.raise_for_status()

return Table.read(response.text, format='ipac', guess=False)
return commons.parse_votable(
encode(response.text)).get_first_table().to_table()
odysseus9672 marked this conversation as resolved.
Show resolved Hide resolved

def query_region_sia(self, coordinate=None, mission=None,
dataset=None, table=None, width=None,
Expand Down Expand Up @@ -156,8 +168,10 @@ def query_region_async(
SQL-like query string. Required if ``coordinates`` is absent.
mission : str
The mission to be used (if not the default mission).
Note: this kwarg is not actually used here.
odysseus9672 marked this conversation as resolved.
Show resolved Hide resolved
dataset : str
The dataset to be used (if not the default dataset).
Note: this option is meaningless to the ibe service.
table : str
The table to be queried (if not the default table).
columns : str, list
Expand Down Expand Up @@ -195,7 +209,8 @@ def query_region_async(
The action to perform at the server. The default is ``'search'``,
which returns a table of the available data. ``'data'`` requires
advanced path construction that is not yet supported. ``'sia'``
provides access to the 'simple image access' IVOA protocol
is here for legacy reasons. This function is built around IRSA's
VO TAP API. IRSA's SIA API is completely different.

Returns
-------
Expand All @@ -220,8 +235,16 @@ def query_region_async(
"The action='data' option is a placeholder for future " +
"functionality.")

if action == "sia":
raise ValueError(
"The action='sia' is not implemented for IRSA's IBE "
"interface because IRSA's SIA interface is radically "
"different.")

args = {
'INTERSECT': intersect
'INTERSECT': intersect,
'TABLE': table or self.TABLE,
'RESPONSEFORMAT': "VOTABLE"
}

# Note: in IBE, if 'mcen' argument is present, it is true.
Expand All @@ -247,14 +270,11 @@ def query_region_async(
columns = columns.split()
args['columns'] = ','.join(columns)

url = "{URL}{action}/{mission}/{dataset}/{table}".format(
URL=self.URL,
action=action,
mission=mission or self.MISSION,
dataset=dataset or self.DATASET,
table=table or self.TABLE)
url = self.URL.rstrip("/")

response = self._request('GET', url, args, timeout=self.TIMEOUT)

return self._request('GET', url, args, timeout=self.TIMEOUT)
return response

def list_missions(self, cache=True):
"""
Expand All @@ -276,14 +296,17 @@ def list_missions(self, cache=True):

root = BeautifulSoup(response.text)
links = root.findAll('a')
missions = [os.path.basename(a.attrs['href']) for a in links]

missions = [os.path.basename(a.attrs['href'].rstrip('/'))
for a in links]
self._missions = missions

return missions

def list_datasets(self, mission=None, cache=True):
"""
For a given mission, list the available datasets
For a given mission, list the available datasets.
This level has no meaning in IRSA's ibe service.

Parameters
----------
Expand All @@ -299,24 +322,8 @@ def list_datasets(self, mission=None, cache=True):
datasets : list
A list of dataset names
"""
if mission is None:
mission = self.MISSION
if mission not in self.list_missions():
raise ValueError("Invalid mission specified: {0}."
"Must be one of: {1}"
.format(mission, self.list_missions()))

url = "{URL}search/{mission}/".format(URL=self.URL, mission=mission)
response = self._request('GET', url, timeout=self.TIMEOUT,
cache=cache)

root = BeautifulSoup(response.text)
links = root.findAll('a')
datasets = [a.text for a in links
if a.attrs['href'].count('/') >= 4 # shown as '..'; ignore
]

return datasets
return ["images"]

def list_tables(self, mission=None, dataset=None, cache=True):
"""
Expand Down Expand Up @@ -358,9 +365,7 @@ def list_tables(self, mission=None, dataset=None, cache=True):
.format(dataset, mission,
self.list_datasets(mission, cache=True)))

url = "{URL}search/{mission}/{dataset}/".format(URL=self.URL,
mission=mission,
dataset=dataset)
url = "{URL}search/{mission}/".format(URL=self.URL, mission=mission)
response = self._request('GET', url, timeout=self.TIMEOUT,
cache=cache)

Expand All @@ -386,10 +391,9 @@ def show_docs(self, mission=None, dataset=None, table=None):
The table to be queried (if not the default table).
"""

url = "{URL}docs/{mission}/{dataset}/{table}".format(
url = "{URL}docs/{mission}/{table}".format(
URL=self.URL,
mission=mission or self.MISSION,
dataset=dataset or self.DATASET,
table=table or self.TABLE)

return webbrowser.open(url)
Expand All @@ -413,19 +417,20 @@ def get_columns(self, mission=None, dataset=None, table=None):
A table containing a description of the columns
"""

url = "{URL}search/{mission}/{dataset}/{table}".format(
url = "{URL}search/{mission}/{table}/".format(
URL=self.URL,
mission=mission or self.MISSION,
dataset=dataset or self.DATASET,
table=table or self.TABLE)

response = self._request(
'GET', url, {'FORMAT': 'METADATA'}, timeout=self.TIMEOUT)
'GET', url, {'FORMAT': 'METADATA'},
timeout=self.TIMEOUT)

# Raise exception, if request failed
response.raise_for_status()
HTMLtoTable = HTML()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be nicer to use the Table initializer directly


return Table.read(response.text, format='ipac', guess=False)
return HTMLtoTable.read(response.text)


Ibe = IbeClass()