)]}'
{"openstackclient/common/parseractions.py":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"99b7d79abdbe249911dba1e83e54811785d752c9","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    def __call__(self, parser, namespace, values, option_string\u003dNone):"},{"line_number":24,"context_line":"        # Add value if an assignment else remove it"},{"line_number":25,"context_line":"        if \u0027\u003d\u0027 in values:"},{"line_number":26,"context_line":"            getattr(namespace, self.dest, {}).update([values.split(\u0027\u003d\u0027, 1)])"},{"line_number":27,"context_line":"        else:"},{"line_number":28,"context_line":"            getattr(namespace, self.dest, {}).pop(values, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FWyc%3D","line":26,"updated":"2013-05-13 19:48:20.000000000","message":"If the dest doesn\u0027t exist in the namespace, this won\u0027t set it and values will be lost. I think you\u0027ll have to do\n\n  if not hasattr(namespace, self.dest):\n    setattr(namespace, self.dest, {})\n\nbefore updating the dict.","commit_id":"8674eca8566321ed09310007b5e60467e9ea0bb3"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"3342996f7c7ec07256208d92e7ea99791ff2cb22","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    def __call__(self, parser, namespace, values, option_string\u003dNone):"},{"line_number":24,"context_line":"        # Add value if an assignment else remove it"},{"line_number":25,"context_line":"        if \u0027\u003d\u0027 in values:"},{"line_number":26,"context_line":"            getattr(namespace, self.dest, {}).update([values.split(\u0027\u003d\u0027, 1)])"},{"line_number":27,"context_line":"        else:"},{"line_number":28,"context_line":"            getattr(namespace, self.dest, {}).pop(values, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FVDQ%3D","line":26,"in_reply_to":"AAAAOn%2F%2FWyc%3D","updated":"2013-05-24 19:17:41.000000000","message":"dest existed but had value None when no default was set in add_argument().\n\nDone","commit_id":"8674eca8566321ed09310007b5e60467e9ea0bb3"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"99b7d79abdbe249911dba1e83e54811785d752c9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        if \u0027\u003d\u0027 in values:"},{"line_number":26,"context_line":"            getattr(namespace, self.dest, {}).update([values.split(\u0027\u003d\u0027, 1)])"},{"line_number":27,"context_line":"        else:"},{"line_number":28,"context_line":"            getattr(namespace, self.dest, {}).pop(values, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FWx8%3D","line":28,"updated":"2013-05-13 19:48:20.000000000","message":"I don\u0027t understand what this is doing. Why remove values from the result set being stored?","commit_id":"8674eca8566321ed09310007b5e60467e9ea0bb3"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"3342996f7c7ec07256208d92e7ea99791ff2cb22","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        if \u0027\u003d\u0027 in values:"},{"line_number":26,"context_line":"            getattr(namespace, self.dest, {}).update([values.split(\u0027\u003d\u0027, 1)])"},{"line_number":27,"context_line":"        else:"},{"line_number":28,"context_line":"            getattr(namespace, self.dest, {}).pop(values, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FWgA%3D","line":28,"in_reply_to":"AAAAOn%2F%2FWx8%3D","updated":"2013-05-24 19:17:41.000000000","message":"It is a way to remove values from the default dict.  Maybe it is too much of a corner case?  I don\u0027t have a need for it today but thought it might be useful somewhere.","commit_id":"8674eca8566321ed09310007b5e60467e9ea0bb3"}],"openstackclient/volume/v1/type.py":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"e7ae3226a9579d1f059ce5525594222d690dafef","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            meta \u003d parsed_args.property"},{"line_number":175,"context_line":"            volume_client.volumes.delete_metadata(volume.id, meta)"},{"line_number":176,"context_line":"        else:"},{"line_number":177,"context_line":"            sys.stderr.write(\"Volume type not removed\\n\")"},{"line_number":178,"context_line":"        return"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOn%2F%2Fn6s%3D","line":177,"updated":"2013-05-01 15:15:44.000000000","message":"Use self.app.log.error","commit_id":"2ccec7ea646dd647dc937cb247cc15ceb80dfdd2"}],"openstackclient/volume/v1/volume.py":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"e7ae3226a9579d1f059ce5525594222d690dafef","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        meta \u003d None"},{"line_number":105,"context_line":"        if parsed_args.property:"},{"line_number":106,"context_line":"            meta \u003d dict(v.split(\u0027\u003d\u0027, 1) for v in parsed_args.property)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        source_volume \u003d None"},{"line_number":109,"context_line":"        if parsed_args.source:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOn%2F%2Fn6Q%3D","line":106,"updated":"2013-05-01 15:15:44.000000000","message":"I see this pattern in a few places. We should define a custom action to handle the parsing, so we can get proper error reporting (if there is no \"\u003d\" the current form will result in the user seeing the error \"ValueError: dictionary update sequence element #0 has length 1; 2 is required\"). It will also simplify the command logic, since the action can create the dictionary for us.\n\nhttp://pymotw.com/2/argparse/#custom-actions","commit_id":"2ccec7ea646dd647dc937cb247cc15ceb80dfdd2"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"99b7d79abdbe249911dba1e83e54811785d752c9","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        parser.add_argument("},{"line_number":79,"context_line":"            \u0027--property\u0027,"},{"line_number":80,"context_line":"            metavar\u003d\u0027\u003ckey\u003dvalue\u003e\u0027,"},{"line_number":81,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":82,"context_line":"            default\u003d{},"},{"line_number":83,"context_line":"            help\u003d\u0027Property to store for this volume \u0027"},{"line_number":84,"context_line":"                 \u0027(repeat option to set multiple properties)\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FWxo%3D","line":81,"updated":"2013-05-13 19:48:20.000000000","message":"This should be the KeyValueAction, right?","commit_id":"8674eca8566321ed09310007b5e60467e9ea0bb3"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"99b7d79abdbe249911dba1e83e54811785d752c9","unresolved":false,"context_lines":[{"line_number":266,"context_line":"            volume_client.volumes.update(volume.id, **kwargs)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        if not kwargs and not meta:"},{"line_number":269,"context_line":"            self.app.log.error(\"Volume not updated\\n\")"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        return"},{"line_number":272,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FWxk%3D","line":269,"updated":"2013-05-13 19:48:20.000000000","message":"This message should probably say why no change was made.","commit_id":"8674eca8566321ed09310007b5e60467e9ea0bb3"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"99b7d79abdbe249911dba1e83e54811785d752c9","unresolved":false,"context_lines":[{"line_number":329,"context_line":"                parsed_args.property,"},{"line_number":330,"context_line":"            )"},{"line_number":331,"context_line":"        else:"},{"line_number":332,"context_line":"            self.app.log.error(\"Volume not updated\\n\")"},{"line_number":333,"context_line":"        return"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FWxc%3D","line":332,"updated":"2013-05-13 19:48:20.000000000","message":"Ditto.","commit_id":"8674eca8566321ed09310007b5e60467e9ea0bb3"}],"tests/common/test_parseractions.py":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"99b7d79abdbe249911dba1e83e54811785d752c9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        actual \u003d getattr(results, \u0027property\u0027, {})"},{"line_number":44,"context_line":"        # All should pass through unmolested"},{"line_number":45,"context_line":"        expect \u003d {\u0027red\u0027: \u0027\u0027, \u0027green\u0027: \u0027100%\u0027, \u0027blue\u0027: \u002750%\u0027}"},{"line_number":46,"context_line":"        self.assertTrue(all([actual[x] \u003d\u003d y for (x, y) in expect.iteritems()]))"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_default_values(self):"},{"line_number":49,"context_line":"        parser \u003d argparse.ArgumentParser()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FWxA%3D","line":46,"updated":"2013-05-13 19:48:20.000000000","message":"Use assertDictEqual http://docs.python.org/2/library/unittest.html#unittest.TestCase.assertDictEqual","commit_id":"8674eca8566321ed09310007b5e60467e9ea0bb3"}]}
