dirnode.set_children: take a dict, not a list

This commit is contained in:
Brian Warner 2009-10-12 17:24:40 -07:00
parent e2ffc3dc03
commit 304aadd4f7
5 changed files with 26 additions and 22 deletions

View File

@ -400,14 +400,14 @@ class DirectoryNode:
# this takes URIs # this takes URIs
a = Adder(self, overwrite=overwrite) a = Adder(self, overwrite=overwrite)
node_entries = [] node_entries = []
for e in entries: for (name, e) in entries.iteritems():
if len(e) == 3: assert isinstance(name, unicode)
name, writecap, readcap = e if len(e) == 2:
writecap, readcap = e
metadata = None metadata = None
else: else:
assert len(e) == 4 assert len(e) == 3
name, writecap, readcap, metadata = e writecap, readcap, metadata = e
assert isinstance(name, unicode)
precondition(isinstance(writecap, (str,type(None))), writecap) precondition(isinstance(writecap, (str,type(None))), writecap)
precondition(isinstance(readcap, (str,type(None))), readcap) precondition(isinstance(readcap, (str,type(None))), readcap)
child_node = self._create_node(writecap, readcap) child_node = self._create_node(writecap, readcap)

View File

@ -898,10 +898,11 @@ class IDirectoryNode(IMutableFilesystemNode):
NotMutableError.""" NotMutableError."""
def set_children(entries, overwrite=True): def set_children(entries, overwrite=True):
"""Add multiple (name, writecap, readcap) triples (or (name, """Add multiple children (by writecap+readcap) to a directory node.
writecap, readcap, metadata) 4-tuples) to a directory node. Returns a Takes a dictionary, with childname as keys and (writecap, readcap)
Deferred that fires (with None) when the operation finishes. This is tuples (or (writecap, readcap, metadata) triples) as values. Returns
equivalent to calling set_uri() multiple times, but is much more a Deferred that fires (with None) when the operation finishes. This
is equivalent to calling set_uri() multiple times, but is much more
efficient. All child names must be unicode strings. efficient. All child names must be unicode strings.
""" """

View File

@ -1184,10 +1184,10 @@ class Large(DeepCheckBase, unittest.TestCase):
d.addCallback(lambda root: root.create_empty_directory(u"subdir")) d.addCallback(lambda root: root.create_empty_directory(u"subdir"))
def _add_children(subdir_node): def _add_children(subdir_node):
self.subdir_node = subdir_node self.subdir_node = subdir_node
kids = [] kids = {}
for i in range(1, COUNT): for i in range(1, COUNT):
litcap = LiteralFileURI("%03d-data" % i).to_string() litcap = LiteralFileURI("%03d-data" % i).to_string()
kids.append( (u"%03d-small" % i, litcap, litcap) ) kids[u"%03d-small" % i] = (litcap, litcap)
return subdir_node.set_children(kids) return subdir_node.set_children(kids)
d.addCallback(_add_children) d.addCallback(_add_children)
up = upload.Data("large enough for CHK" * 100, "") up = upload.Data("large enough for CHK" * 100, "")

View File

@ -449,18 +449,21 @@ class Dirnode(GridTestMixin, unittest.TestCase,
# metadata through set_children() # metadata through set_children()
d.addCallback(lambda res: d.addCallback(lambda res:
n.set_children([ n.set_children({
(u"e1", fake_file_uri, fake_file_uri), u"e1": (fake_file_uri, fake_file_uri),
(u"e2", fake_file_uri, fake_file_uri, {}), u"e2": (fake_file_uri, fake_file_uri, {}),
(u"e3", fake_file_uri, fake_file_uri, u"e3": (fake_file_uri, fake_file_uri,
{"key": "value"}), {"key": "value"}),
])) }))
d.addCallback(lambda res: d.addCallback(lambda res:
self.shouldFail(ExistingChildError, "set_children-no", self.shouldFail(ExistingChildError, "set_children-no",
"child 'e1' already exists", "child 'e1' already exists",
n.set_children, n.set_children,
[ (u"e1", other_file_uri, other_file_uri), { u"e1": (other_file_uri,
(u"new", other_file_uri, other_file_uri), ], other_file_uri),
u"new": (other_file_uri,
other_file_uri),
},
overwrite=False)) overwrite=False))
# and 'new' should not have been created # and 'new' should not have been created
d.addCallback(lambda res: n.list()) d.addCallback(lambda res: n.list())

View File

@ -467,7 +467,7 @@ class DirectoryNodeHandler(RenderMixin, rend.Page, ReplaceMeMixin):
le.args = tuple(le.args + (body,)) le.args = tuple(le.args + (body,))
# TODO test handling of bad JSON # TODO test handling of bad JSON
raise raise
cs = [] cs = {}
for name, (file_or_dir, mddict) in children.iteritems(): for name, (file_or_dir, mddict) in children.iteritems():
name = unicode(name) # simplejson-2.0.1 returns str *or* unicode name = unicode(name) # simplejson-2.0.1 returns str *or* unicode
writecap = mddict.get('rw_uri') writecap = mddict.get('rw_uri')
@ -476,7 +476,7 @@ class DirectoryNodeHandler(RenderMixin, rend.Page, ReplaceMeMixin):
readcap = mddict.get('ro_uri') readcap = mddict.get('ro_uri')
if readcap is not None: if readcap is not None:
readcap = str(readcap) readcap = str(readcap)
cs.append((name, writecap, readcap, mddict.get('metadata'))) cs[name] = (writecap, readcap, mddict.get('metadata'))
d = self.node.set_children(cs, replace) d = self.node.set_children(cs, replace)
d.addCallback(lambda res: "Okay so I did it.") d.addCallback(lambda res: "Okay so I did it.")
# TODO: results # TODO: results