)]}'
{"doc/source/apis.rst":[{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Introduction"},{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"The python-swiftclient includes two levels of API; a low level client API that"},{"line_number":5,"context_line":"provides simple python wrappers around the various authentication mechanisms"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_666dc903","line":2,"updated":"2015-09-15 03:37:54.000000000","message":"Titles look like this:\n\n  \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n  Introduction\n  \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":10,"context_line":"examples of usage for the service API."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The swiftclient.Connection API"},{"line_number":13,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"A low level API that provides methods for authentication and methods that"},{"line_number":16,"context_line":"correspond to the individual REST API calls described in the swift"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_21149b42","line":13,"updated":"2015-09-15 03:37:54.000000000","message":"If this is a section, this needs to look like:\n\n The swiftclient.Connection API\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":19,"context_line":"For usage details see the client docs: :mod:`swiftclient.client`."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"The swiftclient.SwiftService API"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"A higher level API aimed at allowing developers an easy way to perform multiple"},{"line_number":25,"context_line":"operations asynchronously using a configurable thread pool."}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_a1266bb8","line":22,"updated":"2015-09-15 03:37:54.000000000","message":"Ditto ^^","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":33,"context_line":"re-architecting later."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"An Object Store is not a Filesystem"},{"line_number":36,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"It can\u0027t be stressed enough that your usage of the object store should reflect"},{"line_number":39,"context_line":"the proper use case, and not treat the storage like a filesystem. There are 2"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_41dbcf7c","line":36,"updated":"2015-09-15 03:37:54.000000000","message":"Is this a consideration within \"important considerations\"?","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":35,"context_line":"An Object Store is not a Filesystem"},{"line_number":36,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"It can\u0027t be stressed enough that your usage of the object store should reflect"},{"line_number":39,"context_line":"the proper use case, and not treat the storage like a filesystem. There are 2"},{"line_number":40,"context_line":"main restrictions to bear in mind here when designing your use of the object"},{"line_number":41,"context_line":"store:"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_6120539c","line":38,"updated":"2015-09-15 03:37:54.000000000","message":"can not* \u003c- try not to use contractions in technical writing","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"change_message_id":"6e333f1e17a4a33326f79196643d8e218aa1e5a4","unresolved":false,"context_lines":[{"line_number":41,"context_line":"store:"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    * Objects cannot be moved/renamed."},{"line_number":44,"context_line":"    * Objects cannot be modified."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Let\u0027s look at those statements in more detail:"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_a312f3b2","line":44,"updated":"2015-09-15 00:12:42.000000000","message":"Depending on the intended audience, I could imagine some readers misinterpreting these as much more onerous constraints than is intended? (And while even though the meaning is clarified below, first impressions are important for optimal reading comprehension.) To the novice, \"It cannot be stressed enough that objects can\u0027t be moved/renamed/modified\" sounds a lot like a terrifying nightmare of \"Once you save an object, the object with those contents is frozen under that name forever\" as opposed to the mundane reality of \"To move things, you have to pay the cost of writing all the bits again.\"","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"f49a1a7a52ed890aced67070fecc223b2d3188e3","unresolved":false,"context_lines":[{"line_number":41,"context_line":"store:"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    * Objects cannot be moved/renamed."},{"line_number":44,"context_line":"    * Objects cannot be modified."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Let\u0027s look at those statements in more detail:"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a29b11f_19b42780","line":44,"in_reply_to":"ba15a1d1_a312f3b2","updated":"2015-10-21 03:10:00.000000000","message":"What do you suggest as a replacement?","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    * Objects cannot be moved/renamed."},{"line_number":44,"context_line":"    * Objects cannot be modified."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Let\u0027s look at those statements in more detail:"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    * Because of the way in which objects are stored and referenced by the object"},{"line_number":49,"context_line":"      store, objects cannot be renamed because this would in most cases require"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_812567ac","line":46,"updated":"2015-09-15 03:37:54.000000000","message":"\"Looking at those statements in more detail:\"","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":46,"context_line":"Let\u0027s look at those statements in more detail:"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    * Because of the way in which objects are stored and referenced by the object"},{"line_number":49,"context_line":"      store, objects cannot be renamed because this would in most cases require"},{"line_number":50,"context_line":"      multiple copies of the data to be moved between physical storage devices."},{"line_number":51,"context_line":"      Because of this a move operation is not provided, so if the user wants to"},{"line_number":52,"context_line":"      move an object they must re-upload to the new location and delete the"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_0132b7f1","line":49,"updated":"2015-09-15 03:37:54.000000000","message":"\"cannot be renamed. This usually requires multiple copies of the data...\"","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    * Because of the way in which objects are stored and referenced by the object"},{"line_number":49,"context_line":"      store, objects cannot be renamed because this would in most cases require"},{"line_number":50,"context_line":"      multiple copies of the data to be moved between physical storage devices."},{"line_number":51,"context_line":"      Because of this a move operation is not provided, so if the user wants to"},{"line_number":52,"context_line":"      move an object they must re-upload to the new location and delete the"},{"line_number":53,"context_line":"      original."},{"line_number":54,"context_line":"    * Objects are stored in multiple locations and are checked for integrity"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_c1527f13","line":51,"updated":"2015-09-15 03:37:54.000000000","message":"\"As a result, a move operation is not provided. If the user wants to move an object they must re-upload...\"","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"change_message_id":"6e333f1e17a4a33326f79196643d8e218aa1e5a4","unresolved":false,"context_lines":[{"line_number":49,"context_line":"      store, objects cannot be renamed because this would in most cases require"},{"line_number":50,"context_line":"      multiple copies of the data to be moved between physical storage devices."},{"line_number":51,"context_line":"      Because of this a move operation is not provided, so if the user wants to"},{"line_number":52,"context_line":"      move an object they must re-upload to the new location and delete the"},{"line_number":53,"context_line":"      original."},{"line_number":54,"context_line":"    * Objects are stored in multiple locations and are checked for integrity"},{"line_number":55,"context_line":"      based on the m5sum calculated during upload. Object creation is a 1-shot"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_e36c6b9e","line":52,"updated":"2015-09-15 00:12:42.000000000","message":"\u003e reupload\n\nor server-side copy (http://developer.openstack.org/api-ref-objectstorage-v1.html#copyObject)","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":52,"context_line":"      move an object they must re-upload to the new location and delete the"},{"line_number":53,"context_line":"      original."},{"line_number":54,"context_line":"    * Objects are stored in multiple locations and are checked for integrity"},{"line_number":55,"context_line":"      based on the m5sum calculated during upload. Object creation is a 1-shot"},{"line_number":56,"context_line":"      event, and in order to modify the contents of an object the entire new"},{"line_number":57,"context_line":"      contents must be re-uploaded. In certain special cases it is possible to"},{"line_number":58,"context_line":"      work around this restriction using large objects, but no general file-like"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_6157f302","line":55,"updated":"2015-09-15 03:37:54.000000000","message":"``m5sum``","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"change_message_id":"68f0b3a28e2208006432e0ad43e06e1dfb98451b","unresolved":false,"context_lines":[{"line_number":52,"context_line":"      move an object they must re-upload to the new location and delete the"},{"line_number":53,"context_line":"      original."},{"line_number":54,"context_line":"    * Objects are stored in multiple locations and are checked for integrity"},{"line_number":55,"context_line":"      based on the m5sum calculated during upload. Object creation is a 1-shot"},{"line_number":56,"context_line":"      event, and in order to modify the contents of an object the entire new"},{"line_number":57,"context_line":"      contents must be re-uploaded. In certain special cases it is possible to"},{"line_number":58,"context_line":"      work around this restriction using large objects, but no general file-like"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_509850c0","line":55,"in_reply_to":"ba15a1d1_6157f302","updated":"2015-09-15 17:57:19.000000000","message":"Or \"MD5 sum\"?","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":59,"context_line":"      access is available to modify a stored object."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Configuration"},{"line_number":62,"context_line":"-------------"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"When we create an instance of a ``SwiftService`` we can override a collection"},{"line_number":65,"context_line":"of default options to suit our use case. Typically the defaults are sensible to"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_e1e7833e","line":62,"updated":"2015-09-15 03:37:54.000000000","message":"Is this meant to be a third tier section?","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":61,"context_line":"Configuration"},{"line_number":62,"context_line":"-------------"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"When we create an instance of a ``SwiftService`` we can override a collection"},{"line_number":65,"context_line":"of default options to suit our use case. Typically the defaults are sensible to"},{"line_number":66,"context_line":"get us started, but depending on our needs we might want to tweak them to"},{"line_number":67,"context_line":"improve performance (options affecting large objects and thread counts can"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_617cd372","line":64,"updated":"2015-09-15 03:37:54.000000000","message":"comma after SwiftService","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":62,"context_line":"-------------"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"When we create an instance of a ``SwiftService`` we can override a collection"},{"line_number":65,"context_line":"of default options to suit our use case. Typically the defaults are sensible to"},{"line_number":66,"context_line":"get us started, but depending on our needs we might want to tweak them to"},{"line_number":67,"context_line":"improve performance (options affecting large objects and thread counts can"},{"line_number":68,"context_line":"significantly alter performance in the right situation)."}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_8181e74c","line":65,"updated":"2015-09-15 03:37:54.000000000","message":"comma after typically","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":68,"context_line":"significantly alter performance in the right situation)."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Service level defaults and some extra options can also be overridden on a"},{"line_number":71,"context_line":"per-operation (or even in some cases per-object) basis, and we\u0027ll call out"},{"line_number":72,"context_line":"which options affect which operations later in the document."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"The configuration of the service API is performed using an options dictionary"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_81f807e7","line":71,"updated":"2015-09-15 03:37:54.000000000","message":"we will*","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":76,"context_line":"in this dictionary are described below, along with their defaults:"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"Options"},{"line_number":79,"context_line":"^^^^^^^"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    ``retries``: ``5``"},{"line_number":82,"context_line":"        The number of times that the library should attempt to retry HTTP"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_c1d59f43","line":79,"updated":"2015-09-15 03:37:54.000000000","message":"Is this meant to be within Configuration?","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        The above options determine the size of the available thread pools for"},{"line_number":93,"context_line":"        performing swift operations. Container operations (such as listing a"},{"line_number":94,"context_line":"        container) operate in the container threads, and a similar pattern"},{"line_number":95,"context_line":"        applies to object and segment threads. Note that the object threads are"},{"line_number":96,"context_line":"        separated into two separate thread pools: ``uu`` and ``dd``. This stands"},{"line_number":97,"context_line":"        for \"upload/update\" and \"download/delete\", and the corresponding actions"},{"line_number":98,"context_line":"        will be run on separate threads pools. We will discuss these in more"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_015397e2","line":95,"updated":"2015-09-15 03:37:54.000000000","message":"You can put this in an actual notation.\n\n.. note::\n   The object threads are separate into two separate thread pools...","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        separated into two separate thread pools: ``uu`` and ``dd``. This stands"},{"line_number":97,"context_line":"        for \"upload/update\" and \"download/delete\", and the corresponding actions"},{"line_number":98,"context_line":"        will be run on separate threads pools. We will discuss these in more"},{"line_number":99,"context_line":"        detail when we cover extending functionality later in the document."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    ``segment_size``: ``None``"},{"line_number":102,"context_line":"        If specified, this option enables uploading of large objects. Should the"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_a15e6be7","line":99,"updated":"2015-09-15 03:37:54.000000000","message":"Maybe put an internal link to this section here","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    ``use_slo``: ``False``"},{"line_number":108,"context_line":"        Used in combination with the above option, ``use_slo`` will upload large"},{"line_number":109,"context_line":"        objects as static rather than dynamic. Only static large objects provide"},{"line_number":110,"context_line":"        error checking for the downloaded object, so this option is recommended."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    ``segment_container``: ``None``"},{"line_number":113,"context_line":"        Allows the user to select the container into which large object segments"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_21733b82","line":110,"updated":"2015-09-15 03:37:54.000000000","message":"\", we recommend this option.\"","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    ``changed``: ``None``"},{"line_number":125,"context_line":"        This option affects uploads and simply means that those objects which"},{"line_number":126,"context_line":"        already exist in the object store will not be overwritten if the mtime"},{"line_number":127,"context_line":"        and size of the source is the same as the existing object."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    ``skip_identical``: ``False``"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_21fa5bbe","line":126,"updated":"2015-09-15 03:37:54.000000000","message":"``mtime``","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        and size of the source is the same as the existing object."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    ``skip_identical``: ``False``"},{"line_number":130,"context_line":"        A slightly more thorough case of the above, but rather than mtime and size"},{"line_number":131,"context_line":"        uses an object\u0027s md5sum (Note: currently does not work for large objects,"},{"line_number":132,"context_line":"        although a patch is in progress to fix this)."},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_e10303b7","line":130,"updated":"2015-09-15 03:37:54.000000000","message":"ditto yo","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    ``skip_identical``: ``False``"},{"line_number":130,"context_line":"        A slightly more thorough case of the above, but rather than mtime and size"},{"line_number":131,"context_line":"        uses an object\u0027s md5sum (Note: currently does not work for large objects,"},{"line_number":132,"context_line":"        although a patch is in progress to fix this)."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    ``yes_all``: ``False``"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_6126136a","line":131,"updated":"2015-09-15 03:37:54.000000000","message":"``m5sum``\n\n.. note::\n   Currently does not work for large objects...","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        are specified as colon separated strings, e.g. \"content-type:text/plain\"."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    ``meta``: ``[]``"},{"line_number":148,"context_line":"        Used to set metadata on an object similarly to headers. Note that setting"},{"line_number":149,"context_line":"        metadata is a destructive operation, so when updating one of many metadata"},{"line_number":150,"context_line":"        values all desired metadata for an object must be re-applied."},{"line_number":151,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_a1a18bab","line":148,"updated":"2015-09-15 03:37:54.000000000","message":"Note again :)","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    ``dir_marker``: ``False``"},{"line_number":173,"context_line":"        Affects uploads, and allows empty \u0027pseudofolder\u0027 objects to be created"},{"line_number":174,"context_line":"        when the source of an upload is ``None``. See later for further details"},{"line_number":175,"context_line":"        on upload sources."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    ``shuffle``: ``False``"},{"line_number":178,"context_line":"        When downloading objects the current default behaviour is to shuffle lists"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_e19f835d","line":175,"updated":"2015-09-15 03:37:54.000000000","message":"Link?","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        on upload sources."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    ``shuffle``: ``False``"},{"line_number":178,"context_line":"        When downloading objects the current default behaviour is to shuffle lists"},{"line_number":179,"context_line":"        of objects in order to spread the load on storage drives when multiple"},{"line_number":180,"context_line":"        clients are downloading the same files to multiple locations (e.g. in the"},{"line_number":181,"context_line":"        event of distributing an update). In a future version of the SwiftService"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_c18d9f32","line":178,"updated":"2015-09-15 03:37:54.000000000","message":"\"When downloading objects, the current default behaviour...\"","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        When downloading objects the current default behaviour is to shuffle lists"},{"line_number":179,"context_line":"        of objects in order to spread the load on storage drives when multiple"},{"line_number":180,"context_line":"        clients are downloading the same files to multiple locations (e.g. in the"},{"line_number":181,"context_line":"        event of distributing an update). In a future version of the SwiftService"},{"line_number":182,"context_line":"        code this behaviour will be optional, so that objects can be downloaded"},{"line_number":183,"context_line":"        in listing order (when combined with a single download thread)."},{"line_number":184,"context_line":"    "}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_417aef25","line":181,"updated":"2015-09-15 03:37:54.000000000","message":"This last sentence should be in a note too","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"change_message_id":"6e333f1e17a4a33326f79196643d8e218aa1e5a4","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        event of distributing an update). In a future version of the SwiftService"},{"line_number":182,"context_line":"        code this behaviour will be optional, so that objects can be downloaded"},{"line_number":183,"context_line":"        in listing order (when combined with a single download thread)."},{"line_number":184,"context_line":"    "},{"line_number":185,"context_line":"Other available options can be found in ``swiftclient/service.py`` in the"},{"line_number":186,"context_line":"source code for ``python-swiftclient``. Each ``SwiftService`` method also allows"},{"line_number":187,"context_line":"for an optional dictionary to override those specified at init time, and the"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_a37993fe","line":184,"updated":"2015-09-15 00:12:42.000000000","message":"I think these red rectangles are Gerrit\u0027s way of complaining about trailing whitespace.","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        event of distributing an update). In a future version of the SwiftService"},{"line_number":182,"context_line":"        code this behaviour will be optional, so that objects can be downloaded"},{"line_number":183,"context_line":"        in listing order (when combined with a single download thread)."},{"line_number":184,"context_line":"    "},{"line_number":185,"context_line":"Other available options can be found in ``swiftclient/service.py`` in the"},{"line_number":186,"context_line":"source code for ``python-swiftclient``. Each ``SwiftService`` method also allows"},{"line_number":187,"context_line":"for an optional dictionary to override those specified at init time, and the"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_c13cbf95","line":184,"in_reply_to":"ba15a1d1_a37993fe","updated":"2015-09-15 03:37:54.000000000","message":"They really are Gerrit\u0027s way of complaining about whitespace. And it will fail you until you give in to it.","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":195,"context_line":"version are detailed below."},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"Version 1.0 Auth"},{"line_number":198,"context_line":"~~~~~~~~~~~~~~~~"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    ``auth_version``: ``environ.get(\u0027ST_AUTH_VERSION\u0027)``"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_c1091f97","line":198,"updated":"2015-09-15 03:37:54.000000000","message":"Is this meant to be beneath authentication? Or as a tier two header?","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    ``os_auth_url``: ``environ.get(\u0027OS_AUTH_URL\u0027)``"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"As you can see from the default values, if these options are not set explicitly"},{"line_number":223,"context_line":"in the options dictionary, then they will default to the values of the given"},{"line_number":224,"context_line":"environment variables. The ``SwiftService`` authentication will automatically"},{"line_number":225,"context_line":"select the auth version based on the combination of options specified, but"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_41cf4f56","line":222,"updated":"2015-09-15 03:37:54.000000000","message":"\"As is evident from the default values, if these options ...\"","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"As you can see from the default values, if these options are not set explicitly"},{"line_number":223,"context_line":"in the options dictionary, then they will default to the values of the given"},{"line_number":224,"context_line":"environment variables. The ``SwiftService`` authentication will automatically"},{"line_number":225,"context_line":"select the auth version based on the combination of options specified, but"},{"line_number":226,"context_line":"having options from different auth versions can cause unexpected behaviour. Note"},{"line_number":227,"context_line":"that leftover environment variables are a common source of confusion when"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_e1db031a","line":224,"updated":"2015-09-15 03:37:54.000000000","message":"\"The ``SwiftService`` authentication automatically selects the auth version...\"","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":223,"context_line":"in the options dictionary, then they will default to the values of the given"},{"line_number":224,"context_line":"environment variables. The ``SwiftService`` authentication will automatically"},{"line_number":225,"context_line":"select the auth version based on the combination of options specified, but"},{"line_number":226,"context_line":"having options from different auth versions can cause unexpected behaviour. Note"},{"line_number":227,"context_line":"that leftover environment variables are a common source of confusion when"},{"line_number":228,"context_line":"authorization fails occur."},{"line_number":229,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_01d95721","line":226,"updated":"2015-09-15 03:37:54.000000000","message":"Note again :)","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    ]"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"Individual Operations"},{"line_number":289,"context_line":"---------------------"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"Stat"},{"line_number":292,"context_line":"^^^^"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_c1303f59","line":289,"updated":"2015-09-15 03:37:54.000000000","message":"What level heading are these two meant to be?","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":297,"context_line":"operation, and in the case of a list of object names being supplied, an"},{"line_number":298,"context_line":"iterator over the results generated for each object is returned."},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"Information returned includes the amount of data used by the given "},{"line_number":301,"context_line":"object/container/account and any headers or metadata set (this includes"},{"line_number":302,"context_line":"user set data as well as content-type and modification times)."},{"line_number":303,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_a12bcbea","line":300,"updated":"2015-09-15 03:37:54.000000000","message":"whitespace :)","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":366,"context_line":"    }"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"Example"},{"line_number":369,"context_line":"~~~~~~~"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"The code below demonstrates the use of ``stat`` to retrieve the headers for a"},{"line_number":372,"context_line":"given list of objects in a container using 20 threads. The code creates a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_971285b3","line":369,"updated":"2015-09-15 03:37:54.000000000","message":"Should this even be its own section? Are you planning to include more?","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":394,"context_line":"                )"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"List"},{"line_number":397,"context_line":"^^^^"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"List can be called against an account or a container to retrieve the containers"},{"line_number":400,"context_line":"or objects contained within them. Each call returns an iterator that returns"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_b71789a2","line":397,"updated":"2015-09-15 03:37:54.000000000","message":"What tier is this one?","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":396,"context_line":"List"},{"line_number":397,"context_line":"^^^^"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"List can be called against an account or a container to retrieve the containers"},{"line_number":400,"context_line":"or objects contained within them. Each call returns an iterator that returns"},{"line_number":401,"context_line":"pages of results (by default, up to 10000 results in each page)."},{"line_number":402,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_3724d90b","line":399,"updated":"2015-09-15 03:37:54.000000000","message":"What is List? I feel like this should be defined a little clearer.","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":10607,"name":"Alexandra Settle","email":"a.settle@outlook.com","username":"asettle"},"change_message_id":"411531a57a1ac9336303fe853f66cc2554f36013","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        \u0027error_timestamp\u0027: \u003ctimestamp\u003e"},{"line_number":451,"context_line":"    }"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"Example"},{"line_number":454,"context_line":"~~~~~~~"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"The code below demonstrates the use of ``list`` to list all items in a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba15a1d1_778811e8","line":453,"updated":"2015-09-15 03:37:54.000000000","message":"Yeah I don\u0027t think this needs to be its own section...","commit_id":"26e095223ea071594efe73e90a56152efa0939b3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":7,"context_line":"and the individual HTTP requests, and a high level service API that provides"},{"line_number":8,"context_line":"methods for performing common operations in parallel on a thread pool."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"This document aims to provide guidance for choosing between these APIs and"},{"line_number":11,"context_line":"examples of usage for the service API."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"------------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_2e6795b8","line":10,"updated":"2015-12-01 18:19:31.000000000","message":"I\u0027m not sure we\u0027ve hit this first goal. I was kinda hoping to see something along the lines of \"Consider using the Connection API if...\" Can be left as future work, but I\u0027d want that sooner rather than later.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"1d47be93f1d85521cdf9301acb10c8a1cdd1b1b9","unresolved":false,"context_lines":[{"line_number":30,"context_line":"      the data to be moved between physical storage devices."},{"line_number":31,"context_line":"      As a result, a move operation is not provided. If the user wants to move an"},{"line_number":32,"context_line":"      object they must re-upload to the new location and delete the"},{"line_number":33,"context_line":"      original."},{"line_number":34,"context_line":"    * Objects cannot be modified. Objects are stored in multiple locations and are"},{"line_number":35,"context_line":"      checked for integrity based on the ``MD5 sum`` calculated during upload."},{"line_number":36,"context_line":"      Object creation is a 1-shot event, and in order to modify the contents of an"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a740942_59cb061f","line":33,"updated":"2015-12-09 19:30:15.000000000","message":"copy?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e7e06fa7e202448fab7713daa35f2f7215185823","unresolved":false,"context_lines":[{"line_number":30,"context_line":"      the data to be moved between physical storage devices."},{"line_number":31,"context_line":"      As a result, a move operation is not provided. If the user wants to move an"},{"line_number":32,"context_line":"      object they must re-upload to the new location and delete the"},{"line_number":33,"context_line":"      original."},{"line_number":34,"context_line":"    * Objects cannot be modified. Objects are stored in multiple locations and are"},{"line_number":35,"context_line":"      checked for integrity based on the ``MD5 sum`` calculated during upload."},{"line_number":36,"context_line":"      Object creation is a 1-shot event, and in order to modify the contents of an"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a740942_77e60946","line":33,"in_reply_to":"7a740942_59cb061f","updated":"2015-12-10 15:50:55.000000000","message":"As Thiago pointed out a couple days ago, swiftclient doesn\u0027t really support server-side copies currently, so I\u0027m not actually sure it\u0027s appropriate to call it out here. Yet.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":46,"context_line":"correspond to the individual REST API calls described in the swift"},{"line_number":47,"context_line":"documentation."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"For usage details see the client docs: :mod:`swiftclient.client`."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"--------------------------------"},{"line_number":52,"context_line":"The swiftclient.SwiftService API"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_aef5c5ed","line":49,"updated":"2015-12-01 18:19:31.000000000","message":"There are plans to flesh out the Connection API some more, yeah? As it is, this seems rather one-sided :P","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"1d47be93f1d85521cdf9301acb10c8a1cdd1b1b9","unresolved":false,"context_lines":[{"line_number":46,"context_line":"correspond to the individual REST API calls described in the swift"},{"line_number":47,"context_line":"documentation."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"For usage details see the client docs: :mod:`swiftclient.client`."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"--------------------------------"},{"line_number":52,"context_line":"The swiftclient.SwiftService API"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a740942_19ec9e8e","line":49,"in_reply_to":"9a8ffd7b_aef5c5ed","updated":"2015-12-09 19:30:15.000000000","message":"Yeah, I\u0027m going to push a (dependent?) patch with more of an outline of how we can structure these two parts.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    ``retries``: ``5``"},{"line_number":80,"context_line":"        The number of times that the library should attempt to retry HTTP"},{"line_number":81,"context_line":"        actions before giving up and reporting a failure."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    ``container_threads``: ``10``"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_198242c9","line":81,"updated":"2015-12-01 18:19:31.000000000","message":"Is it worth noting what\u0027s required to retry uploads?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"1d47be93f1d85521cdf9301acb10c8a1cdd1b1b9","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    ``use_slo``: ``False``"},{"line_number":108,"context_line":"        Used in combination with the above option, ``use_slo`` will upload large"},{"line_number":109,"context_line":"        objects as static rather than dynamic. Only static large objects provide"},{"line_number":110,"context_line":"        error checking for the downloaded object, so we recommend this option."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    ``segment_container``: ``None``"},{"line_number":113,"context_line":"        Allows the user to select the container into which large object segments"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a740942_5c51b40d","line":110,"updated":"2015-12-09 19:30:15.000000000","message":"someday I\u0027d love to change this default in the client and make it \"true\"","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e7e06fa7e202448fab7713daa35f2f7215185823","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    ``use_slo``: ``False``"},{"line_number":108,"context_line":"        Used in combination with the above option, ``use_slo`` will upload large"},{"line_number":109,"context_line":"        objects as static rather than dynamic. Only static large objects provide"},{"line_number":110,"context_line":"        error checking for the downloaded object, so we recommend this option."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    ``segment_container``: ``None``"},{"line_number":113,"context_line":"        Allows the user to select the container into which large object segments"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7a740942_37b5e1cf","line":110,"in_reply_to":"7a740942_5c51b40d","updated":"2015-12-10 15:50:55.000000000","message":"Agreed. Even better: get /info as a matter of course (with some form of caching to the amortized cost is basically nil). From there, we should be able to automatically select a reasonable segment size and use slo if available, otherwise dlo.\n\nThat should also address most of https://bugs.launchpad.net/python-swiftclient/+bug/1524465","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        with care, as it could lead to ever increasing storage usage."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    ``changed``: ``None``"},{"line_number":125,"context_line":"        This option affects uploads and simply means that those objects which"},{"line_number":126,"context_line":"        already exist in the object store will not be overwritten if the ``mtime``"},{"line_number":127,"context_line":"        and size of the source is the same as the existing object."},{"line_number":128,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_1db6ad3d","line":125,"updated":"2015-12-01 18:19:31.000000000","message":"Damn, that\u0027s right! https://review.openstack.org/#/c/158701/ still hasn\u0027t landed :(","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    ``skip_identical``: ``False``"},{"line_number":130,"context_line":"        A slightly more thorough case of the above, but rather than ``mtime`` and size"},{"line_number":131,"context_line":"        uses an object\u0027s ``MD5 sum``."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    ``yes_all``: ``False``"},{"line_number":134,"context_line":"        This options affects only download and delete, and in each case must be"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_7dc9f9ab","line":131,"updated":"2015-12-01 18:19:31.000000000","message":"Might also be worth noting that this is supported for downloads, where changed is not.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        normal with the exception that no data is written to disk."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    ``header``: ``[]``"},{"line_number":143,"context_line":"        Used with upload and post operations to set headers on objects. Headers"},{"line_number":144,"context_line":"        are specified as colon separated strings, e.g. \"content-type:text/plain\"."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    ``meta``: ``[]``"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_59b52ace","line":143,"updated":"2015-12-01 18:19:31.000000000","message":"And download operations, yes? Judging by https://github.com/openstack/python-swiftclient/blob/2.6.0/swiftclient/service.py#L954 anyway.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    ``fail_fast``: ``False``"},{"line_number":158,"context_line":"        Applies to delete and upload operations, and attempts to abort queued"},{"line_number":159,"context_line":"        tasks in the event of errors."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    ``prefix``: ``None``"},{"line_number":162,"context_line":"        Affects list operations; only objects with the given prefix will be"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_7de6d9e9","line":159,"updated":"2015-12-01 18:19:31.000000000","message":"...\"in the event of errors\"... before or after attempting to retry?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        event of distributing an update). When using the ``SwiftService`` directly,"},{"line_number":182,"context_line":"        object downloads are scheduled in the same order as they appear in the container"},{"line_number":183,"context_line":"        listing. When combined with a single download thread this means that objects"},{"line_number":184,"context_line":"        are downloaded in lexically-sorted order. Setting this option to ``True``"},{"line_number":185,"context_line":"        gives the same shuffling behaviour as the CLI."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"Other available options can be found in ``swiftclient/service.py`` in the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_9decdd90","line":184,"updated":"2015-12-01 18:19:31.000000000","message":"\"Lexically-sorted\" in what locale?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    ``user``: ``environ.get(\u0027ST_USER\u0027)``"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    ``key``: ``environ.get(\u0027ST_KEY\u0027)``"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"Version 2.0 \u0026 3.0 Auth"},{"line_number":212,"context_line":"~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_4320d849","line":209,"updated":"2015-12-01 18:19:31.000000000","message":"We should probably call out OS_STORAGE_URL, and its utility as a way to access shared accounts.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":211,"context_line":"Version 2.0 \u0026 3.0 Auth"},{"line_number":212,"context_line":"~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    ``auth_version``: ``environ.get(\u0027ST_AUTH_VERSION\u0027)``"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    ``os_username``: ``environ.get(\u0027OS_USERNAME\u0027)``"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_e003020c","line":214,"updated":"2015-12-01 18:19:31.000000000","message":"The `auth` subcommand uses OS_IDENTITY_API_VERSION and OS_AUTH_VERSION -- should we use those here? Or at least mention their equivalence?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    ``os_tenant_name``: ``environ.get(\u0027OS_TENANT_NAME\u0027)``"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    ``os_auth_url``: ``environ.get(\u0027OS_AUTH_URL\u0027)``"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"As is evident from the default values, if these options are not set explicitly"},{"line_number":225,"context_line":"in the options dictionary, then they will default to the values of the given"},{"line_number":226,"context_line":"environment variables. The ``SwiftService`` authentication automatically selects"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_208d8a7b","line":223,"updated":"2015-12-01 18:19:31.000000000","message":"os_user_domain_name, os_project_name, os_project_domain_name... ids for each of those... \n\nos_service_type, os_endpoint_type, os_region_name...\n\nDamn there are a lot of v2 \u0026 v3 options.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":230,"context_line":"  .. note::"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"     Leftover environment variables are a common source of confusion when"},{"line_number":233,"context_line":"     authorization fails."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"Operation Return Values"},{"line_number":236,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_20734a4f","line":233,"updated":"2015-12-01 18:19:31.000000000","message":"I feel like we would be even more helpful here. Maybe one of\n\n* explicitly call out in the note that users should `unset` environment variables that shouldn\u0027t be necessary\n\n* recommend an easy way to see which auth-related env vars are set; something like ` env | grep -E \u0027^(ST|OS)_\u0027 `?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"* A dictionary detailing the results of a single operation."},{"line_number":244,"context_line":"* An iterator that produces result dictionaries (for calls that perform"},{"line_number":245,"context_line":"  multiple sub-operations)."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"A result dictionary can indicate either the success or failure of an individual"},{"line_number":248,"context_line":"operation (detailed in the ``success`` key), and will either contain the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_608632bb","line":245,"updated":"2015-12-01 18:19:31.000000000","message":"\"that perform multiple sub-operations\" or \"that *can* perform multiple sub-operations\"? If we\u0027re uploading a single object, will it return an iterator all the time, or only when it\u0027s a large object?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        \u0027upload_segment\u0027,"},{"line_number":287,"context_line":"        \u0027delete_container\u0027,"},{"line_number":288,"context_line":"        \u0027delete_object\u0027,"},{"line_number":289,"context_line":"        \u0027delete_segment\u0027,     # from delete_object operations"},{"line_number":290,"context_line":"        \u0027capabilities\u0027,"},{"line_number":291,"context_line":"    ]"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_60095231","line":289,"updated":"2015-12-01 18:19:31.000000000","message":"As well as uploads that overwrite large objects, yes?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":416,"context_line":"        \u0027container\u0027: \u003ccontainer\u003e,      # Only for listing a container"},{"line_number":417,"context_line":"        \u0027prefix\u0027: \u003cprefix\u003e,            # The prefix of returned objects/containers"},{"line_number":418,"context_line":"        \u0027success\u0027: True,"},{"line_number":419,"context_line":"        \u0027listing\u0027: [Item],             # A list of results"},{"line_number":420,"context_line":"                                       # (only in the event of success)"},{"line_number":421,"context_line":"        \u0027marker\u0027: \u003cmarker\u003e             # The last item name in the list"},{"line_number":422,"context_line":"                                       # (only in the event of success)"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_fcd2ab5a","line":419,"updated":"2015-12-01 18:19:31.000000000","message":"Maybe use\n\n \u0027listing\u0027: [Item, ...],","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":433,"context_line":"        \u0027hash\u0027: \u0027fb938269cbeabe4c234e1127bbd3b74a\u0027,"},{"line_number":434,"context_line":"        \u0027content_type\u0027: \u0027application/octet-stream\u0027,"},{"line_number":435,"context_line":"        \u0027meta\u0027: \u003cmetadata\u003e    # Full metadata listing from stat\u0027ing each object"},{"line_number":436,"context_line":"                              # this key only exists if \u0027long\u0027 is specified in options"},{"line_number":437,"context_line":"    }"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"Any failure listing an account or container that exists will return a failure"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_dced678f","line":436,"updated":"2015-12-01 18:19:31.000000000","message":"I hadn\u0027t realized it\u0027d do that for objects...cool. But options[\u0027long\u0027] is off for CLI container listings even with --long, right?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":445,"context_line":"        \u0027action\u0027: \u003c\u0027list_account_part\u0027|\u0027list_container_part\u0027\u003e,,"},{"line_number":446,"context_line":"        \u0027container\u0027: container,         # Only for listing a container"},{"line_number":447,"context_line":"        \u0027prefix\u0027: options[\u0027prefix\u0027],"},{"line_number":448,"context_line":"        \u0027success\u0027: success,"},{"line_number":449,"context_line":"        \u0027marker\u0027: marker,"},{"line_number":450,"context_line":"        \u0027error\u0027: error,"},{"line_number":451,"context_line":"        \u0027traceback\u0027: \u003ctrace\u003e,"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_ffd29d5a","line":448,"updated":"2015-12-01 18:19:31.000000000","message":"May as well specify\n\n \u0027success\u0027: False,","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":446,"context_line":"        \u0027container\u0027: container,         # Only for listing a container"},{"line_number":447,"context_line":"        \u0027prefix\u0027: options[\u0027prefix\u0027],"},{"line_number":448,"context_line":"        \u0027success\u0027: success,"},{"line_number":449,"context_line":"        \u0027marker\u0027: marker,"},{"line_number":450,"context_line":"        \u0027error\u0027: error,"},{"line_number":451,"context_line":"        \u0027traceback\u0027: \u003ctrace\u003e,"},{"line_number":452,"context_line":"        \u0027error_timestamp\u0027: \u003ctimestamp\u003e"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_ff07fdc6","line":449,"updated":"2015-12-01 18:19:31.000000000","message":"Is marker really available? From earlier, it sounded like it wasn\u0027t.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":468,"context_line":"            for stats in stats_parts_gen:"},{"line_number":469,"context_line":"                if stats[\"success\"]:"},{"line_number":470,"context_line":"                    for item in stats[\"listing\"]:"},{"line_number":471,"context_line":"                        i_size \u003d int(item[\"bytes\"])"},{"line_number":472,"context_line":"                        if i_size \u003e minimum_size:"},{"line_number":473,"context_line":"                            i_name \u003d item[\"name\"]"},{"line_number":474,"context_line":"                            i_etag \u003d item[\"hash\"]"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_3fbfc5ab","line":471,"updated":"2015-12-01 18:19:31.000000000","message":"Wait, isn\u0027t bytes already an int? If it isn\u0027t (or might not be), I kinda really want to fix that.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":473,"context_line":"                            i_name \u003d item[\"name\"]"},{"line_number":474,"context_line":"                            i_etag \u003d item[\"hash\"]"},{"line_number":475,"context_line":"                            print("},{"line_number":476,"context_line":"                                \"%s [size: %s] [etag: %s]\" %"},{"line_number":477,"context_line":"                                (i_name, i_size, i_etag)"},{"line_number":478,"context_line":"                            )"},{"line_number":479,"context_line":"                else:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_9fd031cb","line":476,"updated":"2015-12-01 18:19:31.000000000","message":"I would consider using\n\n \u0027%(name)s [size: %(bytes)s] [etag: %(hash)]\u0027 % item\n\n...and getting rid of the extra variables, but I\u0027m not sure to what degree it\u0027s worth picking over example code.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":488,"context_line":"update the metadata attached to the given items. Each element of the object list"},{"line_number":489,"context_line":"may be a plain string of the object name, or a ``SwiftPostObject`` that"},{"line_number":490,"context_line":"allows finer control over the options applied to each of the individual post"},{"line_number":491,"context_line":"operations. In the first two cases a single dictionary is returned containing the"},{"line_number":492,"context_line":"results of the operation, and in the case of a list of objects being supplied,"},{"line_number":493,"context_line":"an iterator over the results generated for each object post is returned. If the"},{"line_number":494,"context_line":"given container or account does not exist, the ``post`` method will raise a"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_c2dfc238","line":491,"updated":"2015-12-01 18:19:31.000000000","message":"With the \"Each element of the object list may...\" sentence in between, it may be worth spelling out \"In the case of account and container updates, a single dictionary...\"","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":501,"context_line":".. code-block:: python"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"    {"},{"line_number":504,"context_line":"        \u0027action\u0027: \u003c\u0027post_account\u0027|\u003c\u0027post_container\u0027\u003e|\u0027post_object\u0027\u003e,"},{"line_number":505,"context_line":"        \u0027success\u0027: True,"},{"line_number":506,"context_line":"        \u0027container\u0027: \u003ccontainer\u003e,"},{"line_number":507,"context_line":"        \u0027object\u0027: \u003cobject\u003e,"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_02e06acb","line":504,"updated":"2015-12-01 18:19:31.000000000","message":"From other examples, I think we want\n\n \u0027action\u0027: \u003c\u0027post_account\u0027|\u0027post_container\u0027|\u0027post_object\u0027\u003e,\n\n(i.e., no angle brackets around \u0027post_container\u0027)","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":505,"context_line":"        \u0027success\u0027: True,"},{"line_number":506,"context_line":"        \u0027container\u0027: \u003ccontainer\u003e,"},{"line_number":507,"context_line":"        \u0027object\u0027: \u003cobject\u003e,"},{"line_number":508,"context_line":"        \u0027headers\u0027: {},"},{"line_number":509,"context_line":"        \u0027response_dict\u0027: \u003cHTTP response details\u003e"},{"line_number":510,"context_line":"    }"},{"line_number":511,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_628936ca","line":508,"updated":"2015-12-01 18:19:31.000000000","message":"Are these the headers that were sent, or the headers that were received? Given the presence of \u0027response_dict\u0027 I\u0027d assume the former, but we might want to be explicit.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":511,"context_line":""},{"line_number":512,"context_line":".. note::"},{"line_number":513,"context_line":"    Updating user metadata keys will not only add any specified keys, but"},{"line_number":514,"context_line":"    will also remove user metadata that has previously been set. This means"},{"line_number":515,"context_line":"    that each time user metadata is updated, the complete set of desired"},{"line_number":516,"context_line":"    key-value pairs must be specified."},{"line_number":517,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_6d91279a","line":514,"updated":"2015-12-01 18:19:31.000000000","message":"This is only true for objects, no? For containers and accounts POST is additive IIRC, and you need to send a header like X-Remove-Container-Meta-Foo to remove metadata.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":539,"context_line":"Upload"},{"line_number":540,"context_line":"------"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"Upload is always called against an account and container and with a list of"},{"line_number":543,"context_line":"objects to upload. Each element of the object list may be a plain string"},{"line_number":544,"context_line":"detailing the path of the object to upload, or a ``SwiftUploadObject`` that"},{"line_number":545,"context_line":"allows finer control over some aspects of the individual operations."}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_0d03bbb9","line":542,"updated":"2015-12-01 18:19:31.000000000","message":"Do we actually specify the account, or is it implicit?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":540,"context_line":"------"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"Upload is always called against an account and container and with a list of"},{"line_number":543,"context_line":"objects to upload. Each element of the object list may be a plain string"},{"line_number":544,"context_line":"detailing the path of the object to upload, or a ``SwiftUploadObject`` that"},{"line_number":545,"context_line":"allows finer control over some aspects of the individual operations."},{"line_number":546,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_ad006f67","line":543,"updated":"2015-12-01 18:19:31.000000000","message":"What happens if the developer does something silly like this?\n\n swift.upload(container, \u0027local_file\u0027)\n\nDo we currently have any guards on that, or does it look for a file named \u0027l\u0027, then a file named \u0027o\u0027, then...","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":544,"context_line":"detailing the path of the object to upload, or a ``SwiftUploadObject`` that"},{"line_number":545,"context_line":"allows finer control over some aspects of the individual operations."},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"When a simple string is supplied to specify a file to upload, the name of the"},{"line_number":548,"context_line":"object uploaded is the full path of the specified file and the options used for"},{"line_number":549,"context_line":"the upload are those supplied to the call to ``upload``."},{"line_number":550,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_8db56b7f","line":547,"updated":"2015-12-01 18:19:31.000000000","message":"What does \"simple string\" entail? bytes, unicode, both, or \"whatever\u0027s native\"?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":553,"context_line":"granularity of invidivual files."},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"If the given container or account does not exist, the ``upload`` method will"},{"line_number":556,"context_line":"raise a ``SwiftError``, otherwise an iterator over the results generated for"},{"line_number":557,"context_line":"each object upload is returned."},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"See :mod:`swiftclient.service.SwiftService.upload` for docs generated from the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_2846ad4f","line":556,"updated":"2015-12-01 18:19:31.000000000","message":"May as well make it two sentences.\n\n raise a ``SwiftError``. Otherwise an iterator ...","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":569,"context_line":"        \u0027container\u0027: \u003ccontainer\u003e,"},{"line_number":570,"context_line":"        \u0027object\u0027: \u003cobject name\u003e,"},{"line_number":571,"context_line":"        \u0027success\u0027: True,"},{"line_number":572,"context_line":"        \u0027status\u0027: \u003c\u0027uploaded\u0027|\u0027skipped-identical\u0027|\u0027skipped-changed\u0027\u003e,"},{"line_number":573,"context_line":"        \u0027attempts\u0027: \u003cattempt count\u003e,"},{"line_number":574,"context_line":"        \u0027response_dict\u0027: \u003cHTTP response details\u003e"},{"line_number":575,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_6877d53b","line":572,"updated":"2015-12-01 18:19:31.000000000","message":"I understand why it is the way it is, but I kinda wish that was \u0027skipped-unchanged\u0027 or even \u0027skipped-unmodified\u0027","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":571,"context_line":"        \u0027success\u0027: True,"},{"line_number":572,"context_line":"        \u0027status\u0027: \u003c\u0027uploaded\u0027|\u0027skipped-identical\u0027|\u0027skipped-changed\u0027\u003e,"},{"line_number":573,"context_line":"        \u0027attempts\u0027: \u003cattempt count\u003e,"},{"line_number":574,"context_line":"        \u0027response_dict\u0027: \u003cHTTP response details\u003e"},{"line_number":575,"context_line":"    }"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"    {"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_68d6f5c4","line":574,"updated":"2015-12-01 18:19:31.000000000","message":"Mind swapping response_dict and attempts to be consistent with the upload_segment result below?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":580,"context_line":"        \u0027for_object\u0027: \u003cobject name\u003e,"},{"line_number":581,"context_line":"        \u0027segment_index\u0027: \u003csegment_index\u003e,"},{"line_number":582,"context_line":"        \u0027segment_size\u0027: \u003csegment_size\u003e,"},{"line_number":583,"context_line":"        \u0027segment_location\u0027: \u003csegment_path\u003e"},{"line_number":584,"context_line":"        \u0027segment_etag\u0027: \u003cetag\u003e,"},{"line_number":585,"context_line":"        \u0027log_line\u0027: \u003cobject segment n\u003e"},{"line_number":586,"context_line":"        \u0027success\u0027: True,"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_8843196c","line":583,"updated":"2015-12-01 18:19:31.000000000","message":"The segment path includes both container name and object name, yeah?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":586,"context_line":"        \u0027success\u0027: True,"},{"line_number":587,"context_line":"        \u0027response_dict\u0027: \u003cHTTP response details\u003e,"},{"line_number":588,"context_line":"        \u0027attempts\u0027: \u003cattempt count\u003e"},{"line_number":589,"context_line":"    }"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"Any failure uploading an object will return a failure dictionary as described"},{"line_number":592,"context_line":"below:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_0803a9b9","line":589,"updated":"2015-12-01 18:19:31.000000000","message":"What about overwrites of large objects with leave_segments\u003dFalse? Will the delete_segment dicts be in this iterator too, or will I need to find out about them in some other way?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":598,"context_line":"        \u0027container\u0027: \u003ccontainer\u003e,"},{"line_number":599,"context_line":"        \u0027object\u0027: \u003cobject name\u003e,"},{"line_number":600,"context_line":"        \u0027success\u0027: False,"},{"line_number":601,"context_line":"        \u0027attempts\u0027: \u003cattempt count\u003e,"},{"line_number":602,"context_line":"        \u0027error\u0027: \u003cerror\u003e,"},{"line_number":603,"context_line":"        \u0027traceback\u0027: \u003ctrace\u003e,"},{"line_number":604,"context_line":"        \u0027error_timestamp\u0027: \u003ctimestamp\u003e,"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_68fd953a","line":601,"updated":"2015-12-01 18:19:31.000000000","message":"Mind moving attempts to the bottom, for consistency with the other results?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":621,"context_line":"        \u0027attempts\u0027: \u003cattempt count\u003e"},{"line_number":622,"context_line":"    }"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"Example"},{"line_number":625,"context_line":"~~~~~~~"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"The code below demonstrates the use of ``upload`` to upload all files and"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_8eaa4184","line":624,"updated":"2015-12-01 18:19:31.000000000","message":"Another interesting example would be uploading a non-file, with the data instead coming from an iterator or a file-like object.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":631,"context_line":".. code-block:: python"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"    _opts[\u0027object_uu_threads\u0027] \u003d 20"},{"line_number":634,"context_line":"    with SwiftService(options\u003d_opts) as swift, OutputManager() as out_manager:"},{"line_number":635,"context_line":"        try:"},{"line_number":636,"context_line":"            # Collect all the files and folders in \u0027/tmp\u0027"},{"line_number":637,"context_line":"            objs \u003d []"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_337cdeb4","line":634,"updated":"2015-12-01 18:19:31.000000000","message":"Do we really need to worry about OutputManager here? All of the printing should be happening in the main thread that\u0027s iterating over results, right?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":637,"context_line":"            objs \u003d []"},{"line_number":638,"context_line":"            dir_markers \u003d []"},{"line_number":639,"context_line":"            dir \u003d \u0027/tmp\u0027:"},{"line_number":640,"context_line":"                for (_dir, _ds, _fs) in walk(f):"},{"line_number":641,"context_line":"                    if not (_ds + _fs):"},{"line_number":642,"context_line":"                        dir_markers.append(_dir)"},{"line_number":643,"context_line":"                    else:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_134bda5a","line":640,"updated":"2015-12-01 18:19:31.000000000","message":"Probably worth spelling out _subdirs and _files, so readers don\u0027t need to go look up the return values for os.walk.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":668,"context_line":"                        out_manager.print_msg(r[\u0027object\u0027])"},{"line_number":669,"context_line":"                    elif \u0027for_object\u0027 in r:"},{"line_number":670,"context_line":"                        out_manager.print_msg("},{"line_number":671,"context_line":"                            \u0027%s segment %s\u0027 % (r[\u0027for_object\u0027],"},{"line_number":672,"context_line":"                                               r[\u0027segment_index\u0027])"},{"line_number":673,"context_line":"                            )"},{"line_number":674,"context_line":"                else:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_73d82680","line":671,"updated":"2015-12-01 18:19:31.000000000","message":"Isn\u0027t this what r[\u0027log_line\u0027] is for? Or are we just trying to highlight how you can do whatever follow-up you might need to do here?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":673,"context_line":"                            )"},{"line_number":674,"context_line":"                else:"},{"line_number":675,"context_line":"                    error \u003d r[\u0027error\u0027]"},{"line_number":676,"context_line":"                    if r[\u0027action\u0027] \u003d\u003d \"create_container\":"},{"line_number":677,"context_line":"                        out_manager.warning("},{"line_number":678,"context_line":"                            \u0027Warning: failed to create container \u0027"},{"line_number":679,"context_line":"                            \"\u0027%s\u0027%s\", container, msg"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_f32e5641","line":676,"updated":"2015-12-01 18:19:31.000000000","message":"Wait, I thought \"If the given container or account does not exist, the ``upload`` method will raise a ``SwiftError``\" -- is this a failure to create the segments container? We should probably add that to the set of possible responses in the iterator, too.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":676,"context_line":"                    if r[\u0027action\u0027] \u003d\u003d \"create_container\":"},{"line_number":677,"context_line":"                        out_manager.warning("},{"line_number":678,"context_line":"                            \u0027Warning: failed to create container \u0027"},{"line_number":679,"context_line":"                            \"\u0027%s\u0027%s\", container, msg"},{"line_number":680,"context_line":"                        )"},{"line_number":681,"context_line":"                    elif r[\u0027action\u0027] \u003d\u003d \"upload_object\":"},{"line_number":682,"context_line":"                        out_manager.error("}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_b3b68ef7","line":679,"updated":"2015-12-01 18:19:31.000000000","message":"msg is undefined. And r[\u0027container\u0027], surely?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":684,"context_line":"                            (container, r[\u0027object\u0027], error)"},{"line_number":685,"context_line":"                        )"},{"line_number":686,"context_line":"                    else:"},{"line_number":687,"context_line":"                        out_manager.error(\"%s\" % error)"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"        except SwiftError as e:"},{"line_number":690,"context_line":"            out_manager.error(e.value)"}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a8ffd7b_533f2225","line":687,"updated":"2015-12-01 18:19:31.000000000","message":"Can this just be\n\n out_manager.error(error)\n\n? Also, do the segment upload/delete errors provide enough information that this is terribly meaningful?","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"}],"swiftclient/service.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00ad640aceb86ee824521e523472cc6834e65d2d","unresolved":false,"context_lines":[{"line_number":1628,"context_line":""},{"line_number":1629,"context_line":"        res \u003d {"},{"line_number":1630,"context_line":"            \u0027action\u0027: \u0027upload_segment\u0027,"},{"line_number":1631,"context_line":"            \u0027for_container\u0027: container,"},{"line_number":1632,"context_line":"            \u0027for_object\u0027: obj_name,"},{"line_number":1633,"context_line":"            \u0027segment_index\u0027: segment_index,"},{"line_number":1634,"context_line":"            \u0027segment_size\u0027: segment_size,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_8efd6170","line":1631,"updated":"2015-12-01 18:19:31.000000000","message":"Nice.","commit_id":"a3a78be87b88beca83a8cc0c96e209ab8e1a4189"}]}
