Skip to content

Commit a48ff44

Browse files
committed
Add improved reprs for TDSCatalog
1 parent c0def67 commit a48ff44

File tree

3 files changed

+142
-6
lines changed

3 files changed

+142
-6
lines changed

siphon/catalog.py

+15-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2013-2017 Siphon Contributors.
1+
# Copyright (c) 2013-2019 Siphon Contributors.
22
# Distributed under the terms of the BSD 3-Clause License.
33
# SPDX-License-Identifier: BSD-3-Clause
44
"""
@@ -36,6 +36,10 @@ def __getitem__(self, item):
3636
except TypeError:
3737
return list(self.values())[item]
3838

39+
def __repr__(self):
40+
"""Return useful repr."""
41+
return IndexableMapping
42+
3943

4044
class DatasetCollection(IndexableMapping):
4145
"""Extend ``IndexableMapping`` to allow datetime-based filter queries."""
@@ -153,7 +157,9 @@ def __str__(self):
153157
"""Return a string representation of the collection."""
154158
return str(list(self))
155159

156-
__repr__ = __str__
160+
def __repr__(self):
161+
"""Return informative repr for TDSCatalog."""
162+
return str(DatasetCollection)
157163

158164

159165
def _try_lower(arg):
@@ -293,7 +299,7 @@ def __init__(self, catalog_url):
293299

294300
# begin parsing the xml doc
295301
root = ET.fromstring(resp.content)
296-
self.catalog_name = root.attrib.get('name', 'No name found')
302+
self.catalog_name = root.attrib.get('name', 'unnamed catalog')
297303

298304
self.datasets = DatasetCollection()
299305
self.services = []
@@ -393,7 +399,9 @@ def latest(self):
393399
return TDSCatalog(latest_cat).datasets[0]
394400
raise AttributeError('"latest" not available for this catalog')
395401

396-
__repr__ = __str__
402+
def __repr__(self):
403+
"""Return informative repr for TDSCatalog."""
404+
return str(TDSCatalog) + ' ' + self.catalog_name
397405

398406

399407
class CatalogRef(object):
@@ -445,7 +453,9 @@ def follow(self):
445453
"""
446454
return TDSCatalog(self.href)
447455

448-
__repr__ = __str__
456+
def __repr__(self):
457+
"""Return repr of CatalogRef."""
458+
return str(CatalogRef) + ' ' + str(self.title)
449459

450460

451461
class Dataset(object):
+108
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept:
6+
- '*/*'
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Connection:
10+
- keep-alive
11+
User-Agent:
12+
- Siphon (0.8.0+46.gc0def67.dirty)
13+
method: GET
14+
uri: https://www.ncei.noaa.gov/thredds/catalog/avhrr-patmos-x-cloudprops-files/catalog.xml
15+
response:
16+
body:
17+
string: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<catalog xmlns=\"http://www.unidata.ucar.edu/namespaces/thredds/InvCatalog/v1.0\"
18+
xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.0.1\">\r\n <service
19+
name=\"fileServices\" serviceType=\"Compound\" base=\"\">\r\n <service
20+
name=\"dapService\" serviceType=\"OPENDAP\" base=\"/thredds/dodsC/\" />\r\n
21+
\ <service name=\"HTTPServer\" serviceType=\"HTTPServer\" base=\"/thredds/fileServer/\"
22+
/>\r\n <service name=\"wcsService\" serviceType=\"WCS\" base=\"/thredds/wcs/\"
23+
/>\r\n <service name=\"wms\" serviceType=\"WMS\" base=\"/thredds/wms/\"
24+
/>\r\n <service name=\"ncss\" serviceType=\"NetcdfSubset\" base=\"/thredds/ncss/\"
25+
/>\r\n <service name=\"ncml\" serviceType=\"NCML\" base=\"/thredds/ncml/\"
26+
/>\r\n <service name=\"uddc\" serviceType=\"UDDC\" base=\"/thredds/uddc/\"
27+
/>\r\n <service name=\"iso\" serviceType=\"ISO\" base=\"/thredds/iso/\"
28+
/>\r\n </service>\r\n <dataset name=\"PATMOS-X Cloud Properties: File access\"
29+
ID=\"avhrr-patmos-x-cloudprops\">\r\n <metadata inherited=\"true\">\r\n
30+
\ <serviceName>fileServices</serviceName>\r\n </metadata>\r\n <catalogRef
31+
xlink:href=\"1979/catalog.xml\" xlink:title=\"1979\" ID=\"avhrr-patmos-x-cloudprops/1979\"
32+
name=\"\" />\r\n <catalogRef xlink:href=\"1980/catalog.xml\" xlink:title=\"1980\"
33+
ID=\"avhrr-patmos-x-cloudprops/1980\" name=\"\" />\r\n <catalogRef xlink:href=\"1981/catalog.xml\"
34+
xlink:title=\"1981\" ID=\"avhrr-patmos-x-cloudprops/1981\" name=\"\" />\r\n
35+
\ <catalogRef xlink:href=\"1982/catalog.xml\" xlink:title=\"1982\" ID=\"avhrr-patmos-x-cloudprops/1982\"
36+
name=\"\" />\r\n <catalogRef xlink:href=\"1983/catalog.xml\" xlink:title=\"1983\"
37+
ID=\"avhrr-patmos-x-cloudprops/1983\" name=\"\" />\r\n <catalogRef xlink:href=\"1984/catalog.xml\"
38+
xlink:title=\"1984\" ID=\"avhrr-patmos-x-cloudprops/1984\" name=\"\" />\r\n
39+
\ <catalogRef xlink:href=\"1985/catalog.xml\" xlink:title=\"1985\" ID=\"avhrr-patmos-x-cloudprops/1985\"
40+
name=\"\" />\r\n <catalogRef xlink:href=\"1986/catalog.xml\" xlink:title=\"1986\"
41+
ID=\"avhrr-patmos-x-cloudprops/1986\" name=\"\" />\r\n <catalogRef xlink:href=\"1987/catalog.xml\"
42+
xlink:title=\"1987\" ID=\"avhrr-patmos-x-cloudprops/1987\" name=\"\" />\r\n
43+
\ <catalogRef xlink:href=\"1988/catalog.xml\" xlink:title=\"1988\" ID=\"avhrr-patmos-x-cloudprops/1988\"
44+
name=\"\" />\r\n <catalogRef xlink:href=\"1989/catalog.xml\" xlink:title=\"1989\"
45+
ID=\"avhrr-patmos-x-cloudprops/1989\" name=\"\" />\r\n <catalogRef xlink:href=\"1990/catalog.xml\"
46+
xlink:title=\"1990\" ID=\"avhrr-patmos-x-cloudprops/1990\" name=\"\" />\r\n
47+
\ <catalogRef xlink:href=\"1991/catalog.xml\" xlink:title=\"1991\" ID=\"avhrr-patmos-x-cloudprops/1991\"
48+
name=\"\" />\r\n <catalogRef xlink:href=\"1992/catalog.xml\" xlink:title=\"1992\"
49+
ID=\"avhrr-patmos-x-cloudprops/1992\" name=\"\" />\r\n <catalogRef xlink:href=\"1993/catalog.xml\"
50+
xlink:title=\"1993\" ID=\"avhrr-patmos-x-cloudprops/1993\" name=\"\" />\r\n
51+
\ <catalogRef xlink:href=\"1994/catalog.xml\" xlink:title=\"1994\" ID=\"avhrr-patmos-x-cloudprops/1994\"
52+
name=\"\" />\r\n <catalogRef xlink:href=\"1995/catalog.xml\" xlink:title=\"1995\"
53+
ID=\"avhrr-patmos-x-cloudprops/1995\" name=\"\" />\r\n <catalogRef xlink:href=\"1996/catalog.xml\"
54+
xlink:title=\"1996\" ID=\"avhrr-patmos-x-cloudprops/1996\" name=\"\" />\r\n
55+
\ <catalogRef xlink:href=\"1997/catalog.xml\" xlink:title=\"1997\" ID=\"avhrr-patmos-x-cloudprops/1997\"
56+
name=\"\" />\r\n <catalogRef xlink:href=\"1998/catalog.xml\" xlink:title=\"1998\"
57+
ID=\"avhrr-patmos-x-cloudprops/1998\" name=\"\" />\r\n <catalogRef xlink:href=\"1999/catalog.xml\"
58+
xlink:title=\"1999\" ID=\"avhrr-patmos-x-cloudprops/1999\" name=\"\" />\r\n
59+
\ <catalogRef xlink:href=\"2000/catalog.xml\" xlink:title=\"2000\" ID=\"avhrr-patmos-x-cloudprops/2000\"
60+
name=\"\" />\r\n <catalogRef xlink:href=\"2001/catalog.xml\" xlink:title=\"2001\"
61+
ID=\"avhrr-patmos-x-cloudprops/2001\" name=\"\" />\r\n <catalogRef xlink:href=\"2002/catalog.xml\"
62+
xlink:title=\"2002\" ID=\"avhrr-patmos-x-cloudprops/2002\" name=\"\" />\r\n
63+
\ <catalogRef xlink:href=\"2003/catalog.xml\" xlink:title=\"2003\" ID=\"avhrr-patmos-x-cloudprops/2003\"
64+
name=\"\" />\r\n <catalogRef xlink:href=\"2004/catalog.xml\" xlink:title=\"2004\"
65+
ID=\"avhrr-patmos-x-cloudprops/2004\" name=\"\" />\r\n <catalogRef xlink:href=\"2005/catalog.xml\"
66+
xlink:title=\"2005\" ID=\"avhrr-patmos-x-cloudprops/2005\" name=\"\" />\r\n
67+
\ <catalogRef xlink:href=\"2006/catalog.xml\" xlink:title=\"2006\" ID=\"avhrr-patmos-x-cloudprops/2006\"
68+
name=\"\" />\r\n <catalogRef xlink:href=\"2007/catalog.xml\" xlink:title=\"2007\"
69+
ID=\"avhrr-patmos-x-cloudprops/2007\" name=\"\" />\r\n <catalogRef xlink:href=\"2008/catalog.xml\"
70+
xlink:title=\"2008\" ID=\"avhrr-patmos-x-cloudprops/2008\" name=\"\" />\r\n
71+
\ <catalogRef xlink:href=\"2009/catalog.xml\" xlink:title=\"2009\" ID=\"avhrr-patmos-x-cloudprops/2009\"
72+
name=\"\" />\r\n <catalogRef xlink:href=\"2010/catalog.xml\" xlink:title=\"2010\"
73+
ID=\"avhrr-patmos-x-cloudprops/2010\" name=\"\" />\r\n <catalogRef xlink:href=\"2011/catalog.xml\"
74+
xlink:title=\"2011\" ID=\"avhrr-patmos-x-cloudprops/2011\" name=\"\" />\r\n
75+
\ <catalogRef xlink:href=\"2012/catalog.xml\" xlink:title=\"2012\" ID=\"avhrr-patmos-x-cloudprops/2012\"
76+
name=\"\" />\r\n <catalogRef xlink:href=\"2013/catalog.xml\" xlink:title=\"2013\"
77+
ID=\"avhrr-patmos-x-cloudprops/2013\" name=\"\" />\r\n <catalogRef xlink:href=\"2014/catalog.xml\"
78+
xlink:title=\"2014\" ID=\"avhrr-patmos-x-cloudprops/2014\" name=\"\" />\r\n
79+
\ <catalogRef xlink:href=\"2015/catalog.xml\" xlink:title=\"2015\" ID=\"avhrr-patmos-x-cloudprops/2015\"
80+
name=\"\" />\r\n <catalogRef xlink:href=\"2016/catalog.xml\" xlink:title=\"2016\"
81+
ID=\"avhrr-patmos-x-cloudprops/2016\" name=\"\" />\r\n <catalogRef xlink:href=\"2017/catalog.xml\"
82+
xlink:title=\"2017\" ID=\"avhrr-patmos-x-cloudprops/2017\" name=\"\" />\r\n
83+
\ <catalogRef xlink:href=\"2018/catalog.xml\" xlink:title=\"2018\" ID=\"avhrr-patmos-x-cloudprops/2018\"
84+
name=\"\" />\r\n <catalogRef xlink:href=\"2019/catalog.xml\" xlink:title=\"2019\"
85+
ID=\"avhrr-patmos-x-cloudprops/2019\" name=\"\" />\r\n </dataset>\r\n</catalog>\r\n"
86+
headers:
87+
Access-Control-Allow-Headers:
88+
- X-Requested-With, Content-Type
89+
Access-Control-Allow-Origin:
90+
- '*'
91+
Connection:
92+
- close
93+
Content-Language:
94+
- en-US
95+
Content-Type:
96+
- application/xml;charset=UTF-8
97+
Date:
98+
- Tue, 01 Oct 2019 20:23:57 GMT
99+
Server:
100+
- Apache-Coyote/1.1
101+
Strict-Transport-Security:
102+
- max-age=31536000
103+
Transfer-Encoding:
104+
- chunked
105+
status:
106+
code: 200
107+
message: OK
108+
version: 1

siphon/tests/test_catalog.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2013-2017 Siphon Contributors.
1+
# Copyright (c) 2013-2019 Siphon Contributors.
22
# Distributed under the terms of the BSD 3-Clause License.
33
# SPDX-License-Identifier: BSD-3-Clause
44
"""Test the catalog access API."""
@@ -385,3 +385,21 @@ def test_latest_resolver_fail():
385385

386386
assert latest == ''
387387
assert '"latest" not available for this catalog' in str(excinfo.value)
388+
389+
390+
@recorder.use_cassette('unnamed_catalog_test')
391+
def test_no_catalog_name():
392+
"""Test the repr of an unnamed catalog."""
393+
cat_url = ('https://www.ncei.noaa.gov/thredds/catalog/'
394+
'avhrr-patmos-x-cloudprops-files/catalog.xml')
395+
cat = TDSCatalog(cat_url)
396+
assert str(cat) == 'unnamed catalog'
397+
398+
399+
@recorder.use_cassette('unnamed_catalog_test')
400+
def test_catalog_items_repr():
401+
"""Test the repr of catalog items."""
402+
cat_url = ('https://www.ncei.noaa.gov/thredds/catalog/'
403+
'avhrr-patmos-x-cloudprops-files/catalog.xml')
404+
cat = TDSCatalog(cat_url)
405+
assert str(list(cat.catalog_refs.values())[0]) == '1979'

0 commit comments

Comments
 (0)