Skip to content

Commit de9f645

Browse files
committed
improved Dimensionality repr
keep all tests in top-level tests directory, allows better control over order in which tests are run begin working on dimensionality tests
1 parent 4603388 commit de9f645

File tree

10 files changed

+130
-17
lines changed

10 files changed

+130
-17
lines changed

quantities.e4p

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!DOCTYPE Project SYSTEM "Project-4.6.dtd">
33
<!-- eric4 project file for project quantities -->
4-
<!-- Saved: 2009-02-11, 08:41:32 -->
4+
<!-- Saved: 2009-02-15, 17:28:58 -->
55
<!-- Copyright (C) 2009 , -->
66
<Project version="4.6">
77
<Language>en</Language>
@@ -72,8 +72,6 @@
7272
<Source>quantities/umath/ufunclike.py</Source>
7373
<Source>quantities/umath/__init__.py</Source>
7474
<Source>quantities/umath/umath.py</Source>
75-
<Source>quantities/tests/test_umath.py</Source>
76-
<Source>quantities/umath/tests/test_umath.py</Source>
7775
</Sources>
7876
<Forms>
7977
</Forms>

quantities/dimensionality.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ class Dimensionality(dict):
1717
"""
1818
"""
1919

20+
@property
21+
def ndims(self):
22+
return sum(abs(i) for i in self.simplified.itervalues())
23+
2024
@property
2125
def simplified(self):
2226
if len(self):
@@ -144,7 +148,8 @@ def __ipow__(self, other):
144148
return self
145149

146150
def __repr__(self):
147-
return self.string
151+
return 'Dimensionality([%s])' \
152+
% ', '.join(['(%s, %s)'% (u.name, e) for u, e in self.iteritems()])
148153

149154
def __str__(self):
150155
if USE_UNICODE:
@@ -155,5 +160,22 @@ def __str__(self):
155160
def __eq__(self, other):
156161
return hash(self) == hash(other)
157162

163+
def __ne__(self, other):
164+
return hash(self) != hash(other)
165+
166+
__neq__ = __ne__
167+
168+
def __gt__(self, other):
169+
return self.ndims > other.ndims
170+
171+
def __ge__(self, other):
172+
return self.ndims >= other.ndims
173+
174+
def __lt__(self, other):
175+
return self.ndims < other.ndims
176+
177+
def __le__(self, other):
178+
return self.ndims <= other.ndims
179+
158180
def copy(self):
159181
return Dimensionality(self)

quantities/quantity.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import numpy
88

9+
from .config import USE_UNICODE
910
from .dimensionality import Dimensionality
1011
from .registry import unit_registry
1112
from .utilities import with_doc
@@ -353,14 +354,16 @@ def __rpow__(self, other):
353354
@with_doc(numpy.ndarray.__repr__)
354355
def __repr__(self):
355356
return '%s * %s'%(
356-
repr(self.magnitude), repr(self.dimensionality)
357+
repr(self.magnitude), self.dimensionality.string
357358
)
358359

359360
@with_doc(numpy.ndarray.__str__)
360361
def __str__(self):
361-
return '%s %s'%(
362-
str(self.magnitude), str(self.dimensionality)
363-
)
362+
if USE_UNICODE:
363+
dims = self.dimensionality.unicode
364+
else:
365+
dims = self.dimensionality.string
366+
return '%s %s'%(str(self.magnitude), dims)
364367

365368
@with_doc(numpy.ndarray.__getitem__)
366369
def __getitem__(self, key):
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import operator
4+
import os
5+
6+
from nose.tools import *
7+
from numpy.testing import *
8+
9+
import quantities as q
10+
from quantities.dimensionality import Dimensionality
11+
12+
13+
meter = Dimensionality([(q.m, 1)])
14+
meter_repr = 'Dimensionality([(meter, 1)])'
15+
meter_str = 'm'
16+
joule = Dimensionality([(q.kg, 1), (q.m, 2), (q.s, -2)])
17+
joule_repr = 'Dimensionality([(kilogram, 1), (meter, 2), (second, -2)])'
18+
joule_str = 'kg*m**2/s**2'
19+
joule_uni = 'kg·m²/s²'
20+
Joule = Dimensionality([(q.J, 1)])
21+
Joule_repr = 'Dimensionality([(joule, 1)])'
22+
Joule_str = 'J'
23+
24+
25+
def test_dimensionality_repr():
26+
assert_equal(repr(meter), meter_repr)
27+
assert_equal(repr(joule), joule_repr)
28+
assert_equal(repr(Joule), Joule_repr)
29+
30+
def test_dimensionality_str():
31+
assert_equal(str(meter), meter_str)
32+
assert_equal(joule.string, joule_str)
33+
assert_equal(joule.unicode, joule_uni)
34+
assert_equal(Joule.string, 'J')
35+
36+
def test_equality():
37+
assert_true(meter == meter)
38+
assert_true(joule == joule)
39+
assert_false(meter == Joule)
40+
assert_false(joule == Joule)
41+
assert_equal(repr(joule), joule_repr)
42+
43+
def test_inequality():
44+
assert_false(meter != meter)
45+
assert_false(joule != joule)
46+
assert_true(meter != Joule)
47+
assert_true(joule != Joule)
48+
assert_equal(repr(joule), joule_repr)
49+
50+
def test_addition():
51+
assert_equal(repr(meter+meter), meter_repr)
52+
assert_true(meter + meter is not meter)
53+
assert_equal(repr(meter), meter_repr)
54+
assert_raises(ValueError, operator.__add__, meter, joule)
55+
assert_raises(ValueError, operator.__add__, Joule, joule)
56+
57+
def test_subtraction():
58+
assert_equal(repr(meter-meter), meter_repr)
59+
assert_true(meter - meter is not meter)
60+
assert_equal(repr(meter), meter_repr)
61+
assert_raises(ValueError, operator.__sub__, meter, joule)
62+
assert_raises(ValueError, operator.__sub__, Joule, joule)
63+
64+
65+
def test_simplification():
66+
assert_equal(Joule.simplified.string, 'kg*m**2/s**2')
67+
68+
def test_gt():
69+
assert_true(joule > meter)
70+
assert_true(Joule > meter)
71+
assert_false(meter > joule)
72+
assert_false(meter > Joule)
73+
assert_false(joule > joule)
74+
assert_false(joule > Joule)
75+
76+
def test_ge():
77+
assert_true(joule >= meter)
78+
assert_true(Joule >= meter)
79+
assert_false(meter >= joule)
80+
assert_false(meter >= Joule)
81+
assert_true(joule >= joule)
82+
assert_true(joule >= Joule)
83+
84+
85+
86+
if __name__ == "__main__":
87+
run_module_suite()

quantities/umath/__init__.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
11
from fromnumeric import *
22
from ufunclike import *
33
from umath import *
4-
5-
from numpy.testing import Tester
6-
test = Tester().test
7-
#bench = Tester().bench

quantities/uncertainquantity.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,15 +170,19 @@ def __repr__(self):
170170
return '%s(%s, %s, %s)'%(
171171
self.__class__.__name__,
172172
repr(self.magnitude),
173-
repr(self.dimensionality),
173+
self.dimensionality.string,
174174
repr(self.uncertainty.magnitude)
175175
)
176176

177177
@with_doc(Quantity.__str__, use_header=False)
178178
def __str__(self):
179+
if USE_UNICODE:
180+
dims = self.dimensionality.unicode
181+
else:
182+
dims = self.dimensionality.string
179183
s = '%s %s\n+/-%s (1 sigma)'%(
180184
str(self.magnitude),
181-
str(self.dimensionality),
185+
dims,
182186
str(self.uncertainty)
183187
)
184188
if USE_UNICODE:

quantities/unitquantity.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def _set_units(self, units):
138138
def __repr__(self):
139139
ref = self._definition
140140
if ref:
141-
ref = ', %s * %s'%(str(ref.magnitude), repr(ref.dimensionality))
141+
ref = ', %s * %s'%(str(ref.magnitude), ref.dimensionality.string)
142142
else:
143143
ref = ''
144144
symbol = self._symbol

quantities/units/mass.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from .length import m
88

99
kg = kilogram = UnitMass(
10-
'kilograms',
10+
'kilogram',
1111
symbol='kg',
1212
aliases=['kilograms']
1313
)

setup.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@
3333
import os
3434
import sys
3535

36-
from distutils.core import setup
36+
if 'develop' in sys.argv or 'nosetests' in sys.argv:
37+
from setuptools import setup
38+
else:
39+
from distutils.core import setup
3740

3841
if os.path.exists('MANIFEST'): os.remove('MANIFEST')
3942

0 commit comments

Comments
 (0)