]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
webish: add edge metadata to t=json output, including timestamps
authorBrian Warner <warner@allmydata.com>
Tue, 12 Feb 2008 02:14:10 +0000 (19:14 -0700)
committerBrian Warner <warner@allmydata.com>
Tue, 12 Feb 2008 02:14:10 +0000 (19:14 -0700)
docs/webapi.txt
src/allmydata/test/test_web.py
src/allmydata/webish.py

index 7604ce42780f1c330f3a3a0f0e9e86b182d2f40c..5e77a740145d3bc8ce75ac94d62af46994454e28 100644 (file)
@@ -94,7 +94,7 @@ d. examining files or directories
 
   GET $URL?t=json
 
-  out: json metadata
+  out: json description of $URL
 
   This returns machine-parseable information about the indicated file or
   directory in the HTTP response body. The JSON always contains a list, and
@@ -104,28 +104,49 @@ d. examining files or directories
   If it is a file, then the information includes file size and URI, like
   this:
 
-   [ 'filenode', { 'ro_uri': file_uri,
-                   'size': bytes } ]
+   GET $FILEURL?t=json :
+
+    [ 'filenode', { 'ro_uri': file_uri,
+                    'size': bytes,
+                    'metadata': {'ctime': 1202777696.7564139,
+                                 'mtime': 1202777696.7564139,
+                                 },
+                    } ]
 
   If it is a directory, then it includes information about the children of
-  this directory, as a mapping from child name to a set of metadata about the
+  this directory, as a mapping from child name to a set of data about the
   child (the same data that would appear in a corresponding GET?t=json of the
-  child itself). Like this:
-
-   [ 'dirnode', { 'rw_uri': read_write_uri,
-                  'ro_uri': read_only_uri,
-                  'children': children } ]
-
-  In the above example, 'children' is a dictionary in which the keys are
-  child names and the values depend upon whether the child is a file or a
-  directory:
-
-   'foo.txt': [ 'filenode', { 'ro_uri': uri, 'size': bytes } ]
-   'subdir':  [ 'dirnode', { 'rw_uri': rwuri, 'ro_uri': rouri } ]
+  child itself). The child entries also include metadata about each child,
+  including creation- and modification- timestamps. The output looks like
+  this:
 
-  note that the value is the same as the JSON representation of the child
-  object (except that directories do not recurse -- the "children" entry of
-  the child is omitted).
+   GET $DIRURL?t=json :
+
+    [ 'dirnode', { 'rw_uri': read_write_uri,
+                   'ro_uri': read_only_uri,
+                   'children': [
+                     'foo.txt': [ 'filenode', { 'ro_uri': uri,
+                                                'size': bytes,
+                                                'metadata': {
+                                                  'ctime': 1202777696.7564139,
+                                                  'mtime': 1202777696.7564139,
+                                                 },
+                                               } ],
+                     'subdir':  [ 'dirnode', { 'rw_uri': rwuri,
+                                               'ro_uri': rouri,
+                                                'metadata': {
+                                                  'ctime': 1202778102.7589991,
+                                                  'mtime': 1202778111.2160511,
+                                                 },
+                                              } ],
+                    ] } ]
+
+  In the above example, note how 'children' is a dictionary in which the keys
+  are child names and the values depend upon whether the child is a file or a
+  directory. The value is mostly the same as the JSON representation of the
+  child object (except that directories do not recurse -- the "children"
+  entry of the child is omitted, and the directory view includes the metadata
+  that is stored on the directory edge).
 
   Then the rw_uri field will be present in the information about a directory
   if and only if you have read-write access to that directory,
index eb7fb809da9df71c0fabc4a3e24976bd2ff17b98..97c92ff15dfced902d8fdf54c410b18b907a01be 100644 (file)
@@ -96,6 +96,7 @@ class WebMixin(object):
 
             self.BAR_CONTENTS, n, self._bar_txt_uri = self.makefile(0)
             foo.set_uri("bar.txt", self._bar_txt_uri)
+
             foo.set_uri("empty", res[3][1].get_uri())
             sub_uri = res[4][1].get_uri()
             foo.set_uri("sub", sub_uri)
@@ -125,7 +126,12 @@ class WebMixin(object):
             # public/reedownlee/
             # public/reedownlee/nor
             self.NEWFILE_CONTENTS = "newfile contents\n"
+
+            return foo.get_metadata_for("bar.txt")
         d.addCallback(_then)
+        def _got_metadata(metadata):
+            self._bar_txt_metadata = metadata
+        d.addCallback(_got_metadata)
         return d
 
     def makefile(self, number):
@@ -162,9 +168,14 @@ class WebMixin(object):
                              ["bar.txt", "blockingfile", "empty", "sub"])
         kids = data[1]["children"]
         self.failUnlessEqual(kids["sub"][0], "dirnode")
+        self.failUnless("metadata" in kids["sub"][1])
+        self.failUnless("ctime" in kids["sub"][1]["metadata"])
+        self.failUnless("mtime" in kids["sub"][1]["metadata"])
         self.failUnlessEqual(kids["bar.txt"][0], "filenode")
         self.failUnlessEqual(kids["bar.txt"][1]["size"], len(self.BAR_CONTENTS))
         self.failUnlessEqual(kids["bar.txt"][1]["ro_uri"], self._bar_txt_uri)
+        self.failUnlessEqual(kids["bar.txt"][1]["metadata"]["ctime"],
+                             self._bar_txt_metadata["ctime"])
 
     def GET(self, urlpath, followRedirect=False):
         url = self.webish_url + urlpath
index 7341a3f6a34e66aace6a4aabf0ce25cfd205c84c..4c2c5abe2f2ff93d2eb4ef2a709084f644c2b2c4 100644 (file)
@@ -656,11 +656,13 @@ class DirectoryJSONMetadata(rend.Page):
                     kiddata = ("filenode",
                                {'ro_uri': kiduri,
                                 'size': childnode.get_size(),
+                                'metadata': metadata,
                                 })
                 else:
                     assert IDirectoryNode.providedBy(childnode), (childnode, children,)
                     kiddata = ("dirnode",
                                {'ro_uri': childnode.get_readonly_uri(),
+                                'metadata': metadata,
                                 })
                     if not childnode.is_readonly():
                         kiddata[1]['rw_uri'] = childnode.get_uri()