Move a utility function into allmydata.util.
authorDaira Hopwood <daira@jacaranda.org>
Fri, 4 Apr 2014 14:34:20 +0000 (15:34 +0100)
committerDaira Hopwood <daira@jacaranda.org>
Fri, 10 Jul 2015 05:10:30 +0000 (06:10 +0100)
Signed-off-by: Daira Hopwood <daira@jacaranda.org>
src/allmydata/storage/backends/cloud/cloud_common.py
src/allmydata/test/test_storage.py
src/allmydata/test/test_util.py
src/allmydata/util/listutil.py [new file with mode: 0644]

index c3d0606848d9e2847e16d3a355da465503ee0e8c..f07e3814dfefa3d815338c54877035a95b63d3c4 100644 (file)
@@ -16,6 +16,7 @@ from allmydata.interfaces import IShareBase
 from allmydata.util import log
 from allmydata.util.assertutil import precondition, _assert
 from allmydata.util.deferredutil import eventually_callback, eventually_errback, eventual_chain, gatherResults
+from allmydata.util.listutil import concat
 from allmydata.storage.common import si_b2a, NUM_RE
 
 
@@ -458,24 +459,6 @@ class CommonContainerMixin:
         return self._do_request('DELETE object', self._delete_object, object_name)
 
 
-def concat(seqs):
-    """
-    O(n), rather than O(n^2), concatenation of list-like things, returning a list.
-    I can't believe this isn't built in.
-    """
-    total_len = 0
-    for seq in seqs:
-        total_len += len(seq)
-    result = [None]*total_len
-    i = 0
-    for seq in seqs:
-        for x in seq:
-            result[i] = x
-            i += 1
-    _assert(i == total_len, i=i, total_len=total_len)
-    return result
-
-
 class ContainerListMixin:
     """
     S3 has a limitation of 1000 object entries returned on each list (GET Bucket) request.
index 7ab93a8c92a2d3f0dc0a2391d2e2aacd64bc489c..8c48d3724cb87d0e366fa68400f6020ce91d3001 100644 (file)
@@ -1,6 +1,5 @@
 
 import time, os.path, platform, re, simplejson, struct, itertools, urllib
-from collections import deque
 from cStringIO import StringIO
 import thread
 
@@ -365,10 +364,6 @@ class Seek(unittest.TestCase, WorkdirMixin):
 
 
 class CloudCommon(unittest.TestCase, ShouldFailMixin, WorkdirMixin):
-    def test_concat(self):
-        x = deque([[1, 2], (), xrange(3, 6)])
-        self.failUnlessEqual(cloud_common.concat(x), [1, 2, 3, 4, 5])
-
     def test_list_objects_truncated_badly(self):
         # If a container misbehaves by not producing listings with increasing keys,
         # that should cause an incident.
index db64bf194aa21c1d330ec78e2b06f51844063fd2..c668d9c93b83556dfb2dc98e15076931487d7675 100644 (file)
@@ -2,7 +2,9 @@
 def foo(): pass # keep the line number constant
 
 import os, time, sys
+from collections import deque
 from StringIO import StringIO
+
 from twisted.trial import unittest
 from twisted.internet import defer, reactor
 from twisted.python.failure import Failure
@@ -12,7 +14,7 @@ from pycryptopp.hash.sha256 import SHA256 as _hash
 from allmydata.util import base32, idlib, humanreadable, mathutil, hashutil
 from allmydata.util import assertutil, fileutil, deferredutil, abbreviate
 from allmydata.util import limiter, time_format, pollmixin, cachedir
-from allmydata.util import statistics, dictutil, pipeline
+from allmydata.util import statistics, dictutil, listutil, pipeline
 from allmydata.util import log as tahoe_log
 from allmydata.util.spans import Spans, overlap, DataSpans
 from allmydata.test.common_util import ReallyEqualMixin
@@ -1468,6 +1470,13 @@ class DictUtil(unittest.TestCase):
         self.failUnlessEqual(d["one"], 1)
         self.failUnlessEqual(d.get_aux("one"), None)
 
+
+class ListUtil(unittest.TestCase):
+    def test_concat(self):
+        x = deque([[1, 2], (), xrange(3, 6)])
+        self.failUnlessEqual(listutil.concat(x), [1, 2, 3, 4, 5])
+
+
 class Pipeline(unittest.TestCase):
     def pause(self, *args, **kwargs):
         d = defer.Deferred()
diff --git a/src/allmydata/util/listutil.py b/src/allmydata/util/listutil.py
new file mode 100644 (file)
index 0000000..56b0ee2
--- /dev/null
@@ -0,0 +1,20 @@
+
+from allmydata.util.assertutil import _assert
+
+
+def concat(seqs):
+    """
+    O(n), rather than O(n^2), concatenation of list-like things, returning a list.
+    I can't believe this isn't built in.
+    """
+    total_len = 0
+    for seq in seqs:
+        total_len += len(seq)
+    result = [None]*total_len
+    i = 0
+    for seq in seqs:
+        for x in seq:
+            result[i] = x
+            i += 1
+    _assert(i == total_len, i=i, total_len=total_len)
+    return result