[PATCH 5/6] Allow negative sizes.

David Lehman dlehman at redhat.com
Tue Jan 7 23:51:00 UTC 2014


There are times, especially when reconfiguring a stack via the device
factory, when a volume group might have a negative amount free space.
---
 blivet/errors.py   |  3 ---
 blivet/size.py     | 11 ++++-------
 tests/size_test.py | 10 +++++-----
 3 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/blivet/errors.py b/blivet/errors.py
index 78d8271..03c9d7b 100644
--- a/blivet/errors.py
+++ b/blivet/errors.py
@@ -182,9 +182,6 @@ class DasdFormatError(StorageError):
 class SizeParamsError(StorageError):
     pass
 
-class SizeNotPositiveError(StorageError):
-    pass
-
 class SizePlacesError(StorageError):
     pass
 
diff --git a/blivet/size.py b/blivet/size.py
index 154693e..b98a52c 100644
--- a/blivet/size.py
+++ b/blivet/size.py
@@ -93,9 +93,6 @@ def _parseSpec(spec, xlate):
     except InvalidOperation:
         raise ValueError("invalid size specification", spec)
 
-    if size < 0:
-        raise SizeNotPositiveError("spec= param must be >=0")
-
     specifier = m.groups()[1].lower()
     if xlate:
         bytes = [_(b) for b in _bytes]
@@ -155,10 +152,10 @@ class Size(Decimal):
             raise SizeParamsError("only specify one parameter")
 
         if bytes is not None:
-            if type(bytes).__name__ in ["int", "long", "float", 'Decimal'] and bytes >= 0:
+            if type(bytes).__name__ in ["int", "long", "float", 'Decimal']:
                 value = Decimal(bytes)
             else:
-                raise SizeNotPositiveError("bytes= param must be >=0")
+                raise ValueError("invalid value for bytes param")
         elif spec:
             value = _parseSpec(spec, True)
         elif en_spec:
@@ -259,14 +256,14 @@ class Size(Decimal):
 
         check = self._trimEnd("%d" % self)
 
-        if Decimal(check) < 1000:
+        if abs(Decimal(check)) < 1000:
             return "%s %s" % (check, _("B"))
 
         prefixes_xlated = [_(p) for p in _prefixes]
         for factor, prefix, abbr in prefixes_xlated:
             newcheck = super(Size, self).__div__(Decimal(factor))
 
-            if newcheck < 1000:
+            if abs(newcheck) < 1000:
                 # nice value, use this factor, prefix and abbr
                 break
 
diff --git a/tests/size_test.py b/tests/size_test.py
index 23c8bce..5680b43 100644
--- a/tests/size_test.py
+++ b/tests/size_test.py
@@ -31,14 +31,9 @@ class SizeTestCase(unittest.TestCase):
         self.assertRaises(SizeParamsError, Size)
         self.assertRaises(SizeParamsError, Size, bytes=500, en_spec="45GB")
 
-        self.assertRaises(SizeNotPositiveError, Size, bytes=-1)
-
         zero = Size(bytes=0)
         self.assertEqual(zero, 0.0)
 
-        self.assertRaises(SizeNotPositiveError, Size, en_spec="-1 TB")
-        self.assertRaises(SizeNotPositiveError, Size, en_spec="-47kb")
-
         s = Size(bytes=500)
         self.assertRaises(SizePlacesError, s.humanReadable, places=-1)
 
@@ -81,6 +76,11 @@ class SizeTestCase(unittest.TestCase):
         s = Size(bytes=478360371L)
         self.assertEquals(s.humanReadable(), "478.36 MB")
 
+    def testNegative(self):
+        s = Size(spec="-500MiB")
+        self.assertEquals(s.humanReadable(), "-500 MiB")
+        self.assertEquals(s.convertTo(spec="b"), -524288000)
+
     def testPartialBytes(self):
         s = Size(bytes=1024.6)
         self.assertEquals(Size(bytes=1024.6), Size(bytes=1024))
-- 
1.8.1.4



More information about the anaconda-patches mailing list