Fixed do_filesizeformat to actually calculate correctly, fixes #59
authorChristopher Grebs <cg@webshox.org>
Fri, 7 Oct 2011 20:50:13 +0000 (22:50 +0200)
committerChristopher Grebs <cg@webshox.org>
Fri, 7 Oct 2011 20:50:13 +0000 (22:50 +0200)
jinja2/filters.py
jinja2/testsuite/filters.py

index 5c9c341b8efbefe1699588da198e05805d895dca..352b1668574edb7ae3dd2b0d61dae07119f78117 100644 (file)
@@ -361,10 +361,10 @@ def do_filesizeformat(value, binary=False):
         return '%d Bytes' % bytes
     else:
         for i, prefix in enumerate(prefixes):
-            unit = base ** (i + 1)
-            if bytes <= unit:
-                return '%.1f %s' % ((bytes / unit), prefix)
-        return '%.1f %s' % ((bytes / unit), prefix)
+            unit = base ** (i + 2)
+            if bytes < unit:
+                return '%.1f %s' % ((base * bytes / unit), prefix)
+        return '%.1f %s' % ((base * bytes / unit), prefix)
 
 
 def do_pprint(value, verbose=False):
index 200935254eed99ef30e36d6b2fc4d412bbcdd8b2..770bdf2e6158e4187c1af1a5ceb73cda4576ec03 100644 (file)
@@ -86,9 +86,27 @@ class FilterTestCase(JinjaTestCase):
         out = tmpl.render()
         self.assert_equal(out, (
             '100 Bytes|1.0 kB|1.0 MB|1.0 GB|1.0 TB|100 Bytes|'
-            '1000 Bytes|1.0 MiB|0.9 GiB|0.9 TiB'
+            '1000 Bytes|976.6 KiB|953.7 MiB|931.3 GiB'
         ))
 
+    def test_filesizeformat_issue59(self):
+        tmpl = env.from_string(
+            '{{ 300|filesizeformat }}|'
+            '{{ 3000|filesizeformat }}|'
+            '{{ 3000000|filesizeformat }}|'
+            '{{ 3000000000|filesizeformat }}|'
+            '{{ 3000000000000|filesizeformat }}|'
+            '{{ 300|filesizeformat(true) }}|'
+            '{{ 3000|filesizeformat(true) }}|'
+            '{{ 3000000|filesizeformat(true) }}'
+        )
+        out = tmpl.render()
+        self.assert_equal(out, (
+            '300 Bytes|3.0 kB|3.0 MB|3.0 GB|3.0 TB|300 Bytes|'
+            '2.9 KiB|2.9 MiB'
+        ))
+
+
     def test_first(self):
         tmpl = env.from_string('{{ foo|first }}')
         out = tmpl.render(foo=range(10))