Convert on-object lists into properties. Add tests for these properties.

This commit is contained in:
Jason R. Coombs 2016-09-03 12:49:33 -04:00
parent 9115d23d83
commit d4e09bb905
3 changed files with 53 additions and 25 deletions

View File

@ -7,6 +7,8 @@
* ``Client.query`` now accepts keyword arguments
and parameters passed directly to Wolfram|Alpha
as URL parameters.
* ``Result.pods`` now returns an iterator and not
a list.
2.4
===

View File

@ -74,28 +74,31 @@ class Result(ErrorHandler, object):
def __init__(self, stream):
self.tree = xmltodict.parse(stream, dict_constructor=dict)['queryresult']
self._handle_error(self.tree)
self.info = []
try:
self.pods = list(map(Pod, self.tree['pod']))
self.info.append(self.pods)
except KeyError:
self.pods = None
try:
self.assumptions = list(map(Assumption, self.tree['assumptions']))
self.info.append(self.assumptions)
except KeyError:
self.assumptions = None
try:
self.warnings = list(map(Warning, self.tree['warnings']))
self.info.append(self.warnings)
except KeyError:
self.warnings = None
@property
def info(self):
"""
The pods, assumptions, and warnings of this result.
"""
return itertools.chain(self.pods, self.assumptions, self.warnings)
@property
def pods(self):
return map(Pod, self.tree.get('pod', []))
@property
def assumptions(self):
return map(Assumption, self.tree.get('assumptions', []))
@property
def warnings(self):
return map(Warning, self.tree.get('warnings', []))
def __iter__(self):
return iter(self.info)
return self.info
def __len__(self):
return len(self.info)
return sum(1 for _ in self.info)
@property
def results(self):

View File

@ -9,7 +9,7 @@ import pytest
import wolframalpha
@pytest.fixture
@pytest.fixture(scope='session')
def API_key():
"""
To run the tests fully, the environment must be configured
@ -22,26 +22,49 @@ def API_key():
pytest.skip("Need WOLFRAMALPHA_API_KEY in environment")
@pytest.fixture
@pytest.fixture(scope='session')
def client(API_key):
return wolframalpha.Client(API_key)
def test_basic(client):
res = client.query('30 deg C in deg F')
assert len(res.pods) > 0
@pytest.fixture(scope='module')
def temp_result(client):
return client.query('30 deg C in deg F')
def test_basic(temp_result):
res = temp_result
assert len(list(res.pods)) > 0
result, = res.results
assert result.text == '86 °F (degrees Fahrenheit)'
assert result.texts == ['86 °F (degrees Fahrenheit)']
def test_results_iterator(client):
def test_results_iterator(temp_result):
"""
A Result.results should be an iterator.
"""
res = client.query('30 deg C in deg F')
res = temp_result
next(res.results)
def test_properties(temp_result):
"""
A result should have a number of properties.
"""
res = temp_result
info = list(res.info)
warnings = list(res.warnings)
assert all(isinstance(item, wolframalpha.Warning) for item in warnings)
assumptions = list(res.assumptions)
assert all(
isinstance(item, wolframalpha.Assumption)
for item in assumptions
)
pods = list(res.pods)
assert all(isinstance(item, wolframalpha.Pod) for item in pods)
assert len(info) == len(pods) + len(warnings) + len(assumptions)
def test_invalid_app_id():
client = wolframalpha.Client('abcdefg')
with pytest.raises(Exception):