replace dirnode.create_empty_directory() with create_subdirectory(), which

takes an initial_children= argument
This commit is contained in:
Brian Warner 2009-10-12 19:15:20 -07:00
parent d079eb45f6
commit cf65cc2ae3
10 changed files with 67 additions and 36 deletions

@ -475,14 +475,13 @@ class DirectoryNode:
d.addCallback(lambda res: deleter.old_child)
return d
def create_empty_directory(self, name, overwrite=True):
"""I create and attach an empty directory at the given name. I return
a Deferred that fires (with the new directory node) when the
operation finishes."""
def create_subdirectory(self, name, initial_children={}, overwrite=True):
assert isinstance(name, unicode)
if self.is_readonly():
return defer.fail(NotMutableError())
d = self._nodemaker.create_new_mutable_directory()
if initial_children:
d.addCallback(lambda n: n.set_children(initial_children))
def _created(child):
entries = [(name, child, None)]
a = Adder(self, entries, overwrite=overwrite)

@ -85,7 +85,7 @@ class Handler:
d = node.get(path[0])
def _maybe_create(f):
f.trap(NoSuchChildError)
return node.create_empty_directory(path[0])
return node.create_subdirectory(path[0])
d.addErrback(_maybe_create)
d.addCallback(self._get_or_create_directories, path[1:])
return d

@ -242,7 +242,7 @@ class SFTPHandler:
d = node.get(path[0])
def _maybe_create(f):
f.trap(NoSuchChildError)
return node.create_empty_directory(path[0])
return node.create_subdirectory(path[0])
d.addErrback(_maybe_create)
d.addCallback(self._get_or_create_directories, path[1:])
return d

@ -946,10 +946,14 @@ class IDirectoryNode(IMutableFilesystemNode):
string. I raise NoSuchChildError if I do not have a child by that
name."""
def create_empty_directory(name, overwrite=True):
"""I create and attach an empty directory at the given name. The
child name must be a unicode string. I return a Deferred that fires
when the operation finishes."""
def create_subdirectory(name, initial_children={}, overwrite=True):
"""I create and attach a directory at the given name. The new
directory can be empty, or it can be populated with children
according to 'initial_children', which takes a dictionary in the same
format as set_children (i.e. mapping unicode child name to (writecap,
readcap, metadata) triples). The child name must be a unicode string.
I return a Deferred that fires (with the new directory node) when the
operation finishes."""
def move_child_to(current_child_name, new_parent, new_child_name=None,
overwrite=True):

@ -754,12 +754,10 @@ class List(GridTestMixin, CLITestMixin, unittest.TestCase):
self.rooturi = n.get_uri()
return n.add_file(u"good", upload.Data("small", convergence=""))
d.addCallback(_stash_root_and_create_file)
d.addCallback(lambda ign:
self.rootnode.create_empty_directory(u"1share"))
d.addCallback(lambda ign: self.rootnode.create_subdirectory(u"1share"))
d.addCallback(lambda n:
self.delete_shares_numbered(n.get_uri(), range(1,10)))
d.addCallback(lambda ign:
self.rootnode.create_empty_directory(u"0share"))
d.addCallback(lambda ign: self.rootnode.create_subdirectory(u"0share"))
d.addCallback(lambda n:
self.delete_shares_numbered(n.get_uri(), range(0,10)))
d.addCallback(lambda ign:
@ -1471,8 +1469,7 @@ class Check(GridTestMixin, CLITestMixin, unittest.TestCase):
# now add a subdir, and a file below that, then make the subdir
# unrecoverable
d.addCallback(lambda ign:
self.rootnode.create_empty_directory(u"subdir"))
d.addCallback(lambda ign: self.rootnode.create_subdirectory(u"subdir"))
d.addCallback(_stash_uri, "subdir")
d.addCallback(lambda fn:
fn.add_file(u"subfile", upload.Data(DATA+"2", "")))

@ -887,11 +887,11 @@ class DeepCheckWebBad(DeepCheckBase, unittest.TestCase):
d.addCallback(lambda ignored:
self.nodes["broken"].add_file(u"large1", large1))
d.addCallback(lambda ignored:
self.nodes["broken"].create_empty_directory(u"subdir-good"))
self.nodes["broken"].create_subdirectory(u"subdir-good"))
large2 = upload.Data("Lots of data\n" * 1000 + "large2" + "\n", None)
d.addCallback(lambda subdir: subdir.add_file(u"large2-good", large2))
d.addCallback(lambda ignored:
self.nodes["broken"].create_empty_directory(u"subdir-unrecoverable"))
self.nodes["broken"].create_subdirectory(u"subdir-unrecoverable"))
d.addCallback(self._stash_node, "subdir-unrecoverable")
large3 = upload.Data("Lots of data\n" * 1000 + "large3" + "\n", None)
d.addCallback(lambda subdir: subdir.add_file(u"large3-good", large3))
@ -1181,7 +1181,7 @@ class Large(DeepCheckBase, unittest.TestCase):
self.root = n
return n
d.addCallback(_created_root)
d.addCallback(lambda root: root.create_empty_directory(u"subdir"))
d.addCallback(lambda root: root.create_subdirectory(u"subdir"))
def _add_children(subdir_node):
self.subdir_node = subdir_node
kids = {}

@ -58,7 +58,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
d = c.create_dirnode()
def _created_root(rootnode):
self._rootnode = rootnode
return rootnode.create_empty_directory(u"subdir")
return rootnode.create_subdirectory(u"subdir")
d.addCallback(_created_root)
def _created_subdir(subdir):
self._subdir = subdir
@ -182,7 +182,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
self.shouldFail(dirnode.NotMutableError, "set_uri ro", None,
ro_dn.delete, u"child")
self.shouldFail(dirnode.NotMutableError, "set_uri ro", None,
ro_dn.create_empty_directory, u"newchild")
ro_dn.create_subdirectory, u"newchild")
self.shouldFail(dirnode.NotMutableError, "set_metadata_for ro", None,
ro_dn.set_metadata_for, u"child", {})
self.shouldFail(dirnode.NotMutableError, "set_uri ro", None,
@ -255,7 +255,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
# /
# /child = mutable
d.addCallback(lambda res: n.create_empty_directory(u"subdir"))
d.addCallback(lambda res: n.create_subdirectory(u"subdir"))
# /
# /child = mutable
@ -274,7 +274,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
d.addCallback(lambda res:
self.shouldFail(ExistingChildError, "mkdir-no",
"child 'subdir' already exists",
n.create_empty_directory, u"subdir",
n.create_subdirectory, u"subdir",
overwrite=False))
d.addCallback(lambda res: n.list())
@ -322,7 +322,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
d.addCallback(_check_manifest)
def _add_subsubdir(res):
return self.subdir.create_empty_directory(u"subsubdir")
return self.subdir.create_subdirectory(u"subsubdir")
d.addCallback(_add_subsubdir)
# /
# /child = mutable
@ -624,7 +624,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
(metadata['key'] == "value"), metadata))
d.addCallback(lambda res: n.delete(u"newfile-metadata"))
d.addCallback(lambda res: n.create_empty_directory(u"subdir2"))
d.addCallback(lambda res: n.create_subdirectory(u"subdir2"))
def _created2(subdir2):
self.subdir2 = subdir2
# put something in the way, to make sure it gets overwritten
@ -682,6 +682,37 @@ class Dirnode(GridTestMixin, unittest.TestCase,
d.addErrback(self.explain_error)
return d
def test_create_subdirectory(self):
self.basedir = "dirnode/Dirnode/test_create_subdirectory"
self.set_up_grid()
c = self.g.clients[0]
d = c.create_dirnode()
def _then(n):
# /
self.rootnode = n
fake_file_uri = make_mutable_file_uri()
other_file_uri = make_mutable_file_uri()
md = {"metakey": "metavalue"}
kids = {u"kid1": (fake_file_uri, fake_file_uri),
u"kid2": (other_file_uri, other_file_uri, md),
}
d = n.create_subdirectory(u"subdir", kids)
def _check(sub):
d = n.get_child_at_path(u"subdir")
d.addCallback(lambda sub2: self.failUnlessEqual(sub2.get_uri(),
sub.get_uri()))
d.addCallback(lambda ign: sub.list())
return d
d.addCallback(_check)
def _check_kids(kids2):
self.failUnlessEqual(sorted(kids.keys()), sorted(kids2.keys()))
self.failUnlessEqual(kids2[u"kid2"][1]["metakey"], "metavalue")
d.addCallback(_check_kids)
return d
d.addCallback(_then)
return d
class Packing(unittest.TestCase):
# This is a base32-encoded representation of the directory tree
# root/file1
@ -974,7 +1005,7 @@ class Adder(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin):
d.addCallback(lambda res:
root_node.add_file(u'file2', upload.Data("Sekrit Codes", None)))
d.addCallback(lambda res:
root_node.create_empty_directory(u"dir1"))
root_node.create_subdirectory(u"dir1"))
d.addCallback(lambda res: root_node)
return d
@ -984,7 +1015,7 @@ class Adder(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin):
d = root_node.set_node(u'file1', filenode)
# We've overwritten file1. Let's try it with a directory
d.addCallback(lambda res:
root_node.create_empty_directory(u'dir2'))
root_node.create_subdirectory(u'dir2'))
d.addCallback(lambda res:
root_node.set_node(u'dir2', filenode))
# We try overwriting a file with a child while also specifying

@ -825,7 +825,7 @@ class SystemTest(SystemTestMixin, unittest.TestCase):
self._root_directory_uri = new_dirnode.get_uri()
return c0.create_node_from_uri(self._root_directory_uri)
d.addCallback(_made_root)
d.addCallback(lambda root: root.create_empty_directory(u"subdir1"))
d.addCallback(lambda root: root.create_subdirectory(u"subdir1"))
def _made_subdir1(subdir1_node):
self._subdir1_node = subdir1_node
d1 = subdir1_node.add_file(u"mydata567", ut)
@ -840,7 +840,7 @@ class SystemTest(SystemTestMixin, unittest.TestCase):
def _do_publish2(self, res):
ut = upload.Data(self.data, convergence=None)
d = self._subdir1_node.create_empty_directory(u"subdir2")
d = self._subdir1_node.create_subdirectory(u"subdir2")
d.addCallback(lambda subdir2: subdir2.add_file(u"mydata992", ut))
return d
@ -856,7 +856,7 @@ class SystemTest(SystemTestMixin, unittest.TestCase):
d.addCallback(self.log, "GOT private directory")
def _got_new_dir(privnode):
rootnode = self.clients[0].create_node_from_uri(self._root_directory_uri)
d1 = privnode.create_empty_directory(u"personal")
d1 = privnode.create_subdirectory(u"personal")
d1.addCallback(self.log, "made P/personal")
d1.addCallback(lambda node: node.add_file(u"sekrit data", ut))
d1.addCallback(self.log, "made P/personal/sekrit data")
@ -934,7 +934,7 @@ class SystemTest(SystemTestMixin, unittest.TestCase):
d1.addCallback(lambda res: dirnode.list())
d1.addCallback(self.log, "dirnode.list")
d1.addCallback(lambda res: self.shouldFail2(NotMutableError, "mkdir(nope)", None, dirnode.create_empty_directory, u"nope"))
d1.addCallback(lambda res: self.shouldFail2(NotMutableError, "mkdir(nope)", None, dirnode.create_subdirectory, u"nope"))
d1.addCallback(self.log, "doing add_file(ro)")
ut = upload.Data("I will disappear, unrecorded and unobserved. The tragedy of my demise is made more poignant by its silence, but this beauty is not for you to ever know.", convergence="99i-p1x4-xd4-18yc-ywt-87uu-msu-zo -- completely and totally unguessable string (unless you read this)")

@ -2972,7 +2972,7 @@ class Grid(GridTestMixin, WebErrorMixin, unittest.TestCase, ShouldFailMixin):
# unrecoverable, then see what happens
d.addCallback(lambda ign:
self.rootnode.create_empty_directory(u"subdir"))
self.rootnode.create_subdirectory(u"subdir"))
d.addCallback(_stash_uri, "subdir")
d.addCallback(lambda subdir_node:
subdir_node.add_file(u"grandchild",

@ -86,7 +86,7 @@ class DirectoryNodeHandler(RenderMixin, rend.Page, ReplaceMeMixin):
if should_create_intermediate_directories(req):
# create intermediate directories
if DEBUG: print " making intermediate directory"
d = self.node.create_empty_directory(name)
d = self.node.create_subdirectory(name)
d.addCallback(make_handler_for,
self.client, self.node, name)
return d
@ -96,7 +96,7 @@ class DirectoryNodeHandler(RenderMixin, rend.Page, ReplaceMeMixin):
if (method,t) in [ ("POST","mkdir"), ("PUT","mkdir") ]:
if DEBUG: print " making final directory"
# final directory
d = self.node.create_empty_directory(name)
d = self.node.create_subdirectory(name)
d.addCallback(make_handler_for,
self.client, self.node, name)
return d
@ -221,7 +221,7 @@ class DirectoryNodeHandler(RenderMixin, rend.Page, ReplaceMeMixin):
return defer.succeed(self.node.get_uri()) # TODO: urlencode
name = name.decode("utf-8")
replace = boolean_of_arg(get_arg(req, "replace", "true"))
d = self.node.create_empty_directory(name, overwrite=replace)
d = self.node.create_subdirectory(name, overwrite=replace)
d.addCallback(lambda child: child.get_uri()) # TODO: urlencode
return d
@ -246,7 +246,7 @@ class DirectoryNodeHandler(RenderMixin, rend.Page, ReplaceMeMixin):
d = node.get(path[0])
def _maybe_create(f):
f.trap(NoSuchChildError)
return node.create_empty_directory(path[0])
return node.create_subdirectory(path[0])
d.addErrback(_maybe_create)
d.addCallback(self._get_or_create_directories, path[1:])
return d