From 32e086f44adb88bfe11fe73a9c4b69a1dff862cf Mon Sep 17 00:00:00 2001 From: alalazo Date: Wed, 6 Jul 2016 15:24:10 +0200 Subject: [PATCH 1/3] version : modified __repr__ to return a string representation of the object + unit tests --- lib/spack/spack/test/versions.py | 8 ++++++++ lib/spack/spack/version.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/spack/spack/test/versions.py b/lib/spack/spack/test/versions.py index 4624f901c8b..5f7d57b4e4a 100644 --- a/lib/spack/spack/test/versions.py +++ b/lib/spack/spack/test/versions.py @@ -389,3 +389,11 @@ def test_formatted_strings(self): self.assertEqual(v.dotted, '1.2.3') self.assertEqual(v.dashed, '1-2-3') self.assertEqual(v.underscored, '1_2_3') + + def test_repr_and_str(self): + a = Version('1.2.3') + self.assertEqual(repr(a), 'Version(\'1.2.3\')') + b = eval(repr(a)) + self.assertEqual(a, b) + self.assertEqual(str(a), '1.2.3') + self.assertEqual(str(a), str(b)) diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index 858d5814728..6f95e8a2f3c 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -197,7 +197,7 @@ def __getitem__(self, idx): return tuple(self.version[idx]) def __repr__(self): - return self.string + return 'Version(' + repr(self.string) + ')' def __str__(self): return self.string From 780a57367dd41f77d45f3e229c0a018c7695821f Mon Sep 17 00:00:00 2001 From: alalazo Date: Wed, 6 Jul 2016 17:00:48 +0200 Subject: [PATCH 2/3] version : modified __getitem__ to return either an item or a Version instance + unit tests --- bin/spack | 2 +- lib/spack/spack/test/versions.py | 40 +++++++++++++++++++++++++++----- lib/spack/spack/version.py | 17 +++++++++++++- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/bin/spack b/bin/spack index e9307d1485a..9b1276a8666 100755 --- a/bin/spack +++ b/bin/spack @@ -77,7 +77,7 @@ import llnl.util.tty as tty from llnl.util.tty.color import * import spack from spack.error import SpackError -import argparse +from external import argparse # Command parsing parser = argparse.ArgumentParser( diff --git a/lib/spack/spack/test/versions.py b/lib/spack/spack/test/versions.py index 5f7d57b4e4a..c051895ca3a 100644 --- a/lib/spack/spack/test/versions.py +++ b/lib/spack/spack/test/versions.py @@ -391,9 +391,37 @@ def test_formatted_strings(self): self.assertEqual(v.underscored, '1_2_3') def test_repr_and_str(self): - a = Version('1.2.3') - self.assertEqual(repr(a), 'Version(\'1.2.3\')') - b = eval(repr(a)) - self.assertEqual(a, b) - self.assertEqual(str(a), '1.2.3') - self.assertEqual(str(a), str(b)) + + def check_repr_and_str(vrs): + a = Version(vrs) + self.assertEqual(repr(a), 'Version(\'' + vrs + '\')') + b = eval(repr(a)) + self.assertEqual(a, b) + self.assertEqual(str(a), vrs) + self.assertEqual(str(a), str(b)) + + check_repr_and_str('1.2.3') + check_repr_and_str('R2016a') + check_repr_and_str('R2016a.2-3_4') + + def test_get_item(self): + a = Version('0.1_2-3') + self.assertTrue(isinstance(a[1], int)) + # Test slicing + b = a[0:2] + self.assertTrue(isinstance(b, Version)) + self.assertEqual(b, Version('0.1')) + self.assertEqual(repr(b), 'Version(\'0.1\')') + self.assertEqual(str(b), '0.1') + b = a[0:3] + self.assertTrue(isinstance(b, Version)) + self.assertEqual(b, Version('0.1_2')) + self.assertEqual(repr(b), 'Version(\'0.1_2\')') + self.assertEqual(str(b), '0.1_2') + b = a[1:] + self.assertTrue(isinstance(b, Version)) + self.assertEqual(b, Version('1_2-3')) + self.assertEqual(repr(b), 'Version(\'1_2-3\')') + self.assertEqual(str(b), '1_2-3') + # Raise TypeError on tuples + self.assertRaises(TypeError, b.__getitem__, 1, 2) \ No newline at end of file diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index 6f95e8a2f3c..7e5878383d0 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -44,6 +44,7 @@ concrete """ import re +import numbers from bisect import bisect_left from functools import wraps @@ -194,7 +195,21 @@ def __iter__(self): return iter(self.version) def __getitem__(self, idx): - return tuple(self.version[idx]) + cls = type(self) + if isinstance(idx, numbers.Integral): + return self.version[idx] + elif isinstance(idx, slice): + # Currently len(self.separators) == len(self.version) - 1 + extendend_separators = self.separators + ('',) + string_arg = [] + for token, separator in zip(self.version, extendend_separators)[idx]: + string_arg.append(str(token)) + string_arg.append(str(separator)) + string_arg.pop() # We don't need the last separator + string_arg = ''.join(string_arg) + return cls(string_arg) + message = '{cls.__name__} indices must be integers' + raise TypeError(message.format(cls=cls)) def __repr__(self): return 'Version(' + repr(self.string) + ')' From 9b926a480f84c62cf4ed23c26b950dd7c89fb1ad Mon Sep 17 00:00:00 2001 From: alalazo Date: Wed, 6 Jul 2016 17:03:32 +0200 Subject: [PATCH 3/3] qa : flake8 issues --- bin/spack | 2 +- lib/spack/spack/test/versions.py | 2 +- lib/spack/spack/version.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/spack b/bin/spack index 9b1276a8666..e9307d1485a 100755 --- a/bin/spack +++ b/bin/spack @@ -77,7 +77,7 @@ import llnl.util.tty as tty from llnl.util.tty.color import * import spack from spack.error import SpackError -from external import argparse +import argparse # Command parsing parser = argparse.ArgumentParser( diff --git a/lib/spack/spack/test/versions.py b/lib/spack/spack/test/versions.py index c051895ca3a..a3a328fb14e 100644 --- a/lib/spack/spack/test/versions.py +++ b/lib/spack/spack/test/versions.py @@ -424,4 +424,4 @@ def test_get_item(self): self.assertEqual(repr(b), 'Version(\'1_2-3\')') self.assertEqual(str(b), '1_2-3') # Raise TypeError on tuples - self.assertRaises(TypeError, b.__getitem__, 1, 2) \ No newline at end of file + self.assertRaises(TypeError, b.__getitem__, 1, 2) diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index 7e5878383d0..68396439417 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -202,9 +202,9 @@ def __getitem__(self, idx): # Currently len(self.separators) == len(self.version) - 1 extendend_separators = self.separators + ('',) string_arg = [] - for token, separator in zip(self.version, extendend_separators)[idx]: + for token, sep in zip(self.version, extendend_separators)[idx]: string_arg.append(str(token)) - string_arg.append(str(separator)) + string_arg.append(str(sep)) string_arg.pop() # We don't need the last separator string_arg = ''.join(string_arg) return cls(string_arg)