)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"9e1fd2ddc70507ecc61bc9a1ff103ad8f864f23b","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This change applies a regular expression in order to filter"},{"line_number":10,"context_line":"flavor extraspects keys with invalid characters."},{"line_number":11,"context_line":"The characters allowed are: letters, numbers, underscores,"},{"line_number":12,"context_line":"periods, colons and hyphens."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ifd86bed23a05a5946ae8b9ba6f6c9bf4b24b1d4c"},{"line_number":15,"context_line":"Partial-Bug: #1256119"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAUH%2F98mA%3D","line":12,"updated":"2014-01-31 19:34:43.000000000","message":"This is still missing the paragraph explaining why you had to add the element to fakes.py where you did…","commit_id":"342f184c2f919c0fabf4b835847a6d2e3a506d16"}],"novaclient/tests/test_utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b47e72e07a305f1e60faa78b3812454b007ab4a6","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        invalid_keys \u003d [\u0027/1\u0027, \u0027?1\u0027, \u0027%1\u0027, \u0027\u003c\u0027, \u0027\u003e\u0027]"},{"line_number":299,"context_line":"        for key in invalid_keys:"},{"line_number":300,"context_line":"            try:"},{"line_number":301,"context_line":"                utils.validate_flavor_metadata_keys([key])"},{"line_number":302,"context_line":"                self.assertFail()"},{"line_number":303,"context_line":"            except exceptions.CommandError as ce:"},{"line_number":304,"context_line":"                self.assertTrue(key in str(ce))"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2BEJU%3D","line":301,"updated":"2014-01-30 14:58:48.000000000","message":"Can\u0027t use assertRaises here?","commit_id":"887912a51e899b6d7d01d74e097edb4f39b46967"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"34cdef2353c8999aa06bbf2ace0cb14eaf9bfad1","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        invalid_keys \u003d [\u0027/1\u0027, \u0027?1\u0027, \u0027%1\u0027, \u0027\u003c\u0027, \u0027\u003e\u0027]"},{"line_number":299,"context_line":"        for key in invalid_keys:"},{"line_number":300,"context_line":"            try:"},{"line_number":301,"context_line":"                utils.validate_flavor_metadata_keys([key])"},{"line_number":302,"context_line":"                self.assertFail()"},{"line_number":303,"context_line":"            except exceptions.CommandError as ce:"},{"line_number":304,"context_line":"                self.assertTrue(key in str(ce))"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2BDO0%3D","line":301,"in_reply_to":"AAAAUH%2F%2BEJU%3D","updated":"2014-01-30 17:05:41.000000000","message":"Yes, but in that case I want to validate the key is included in the error message.","commit_id":"887912a51e899b6d7d01d74e097edb4f39b46967"}],"novaclient/tests/v1_1/fakes.py":[{"author":{"_account_id":9275,"name":"Leandro Ignacio Costantino","email":"leandro.i.costantino@intel.com","username":"lcostantino"},"change_message_id":"06683b48d74c678deadbc8555db79d475810bc63","unresolved":false,"context_lines":[{"line_number":738,"context_line":"            200,"},{"line_number":739,"context_line":"            {},"},{"line_number":740,"context_line":"            {\u0027flavor\u0027:"},{"line_number":741,"context_line":"                self.get_flavors_detail(is_public\u003d\u0027None\u0027)[2][\u0027flavors\u0027][3]}"},{"line_number":742,"context_line":"        )"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def get_flavors_4(self, **kw):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Bo4g%3D","line":741,"updated":"2014-01-23 17:05:16.000000000","message":"is there any reason to create a new flavor and not used the already one provided?\nAlso, can we move that new flavor to the end to avoid index changes?","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"3acbe3036509eef34886a9a06943ecef3ddc8c57","unresolved":false,"context_lines":[{"line_number":738,"context_line":"            200,"},{"line_number":739,"context_line":"            {},"},{"line_number":740,"context_line":"            {\u0027flavor\u0027:"},{"line_number":741,"context_line":"                self.get_flavors_detail(is_public\u003d\u0027None\u0027)[2][\u0027flavors\u0027][3]}"},{"line_number":742,"context_line":"        )"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def get_flavors_4(self, **kw):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2BohI%3D","line":741,"in_reply_to":"AAAAUH%2F%2Bo4g%3D","updated":"2014-01-23 18:24:04.000000000","message":"This is because the already existent are validating different data that is sent and received in the requests.","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"cce7d95d2e0824b68cc6fefbeccea80f6bbd6563","unresolved":false,"context_lines":[{"line_number":670,"context_line":"            {\u0027id\u0027: 4, \u0027name\u0027: \u00271024 MB Server\u0027, \u0027ram\u0027: 1024, \u0027disk\u0027: 10,"},{"line_number":671,"context_line":"             \u0027OS-FLV-EXT-DATA:ephemeral\u0027: 10,"},{"line_number":672,"context_line":"             \u0027os-flavor-access:is_public\u0027: True,"},{"line_number":673,"context_line":"             \u0027links\u0027: {}},"},{"line_number":674,"context_line":"            {\u0027id\u0027: \u0027aa1\u0027, \u0027name\u0027: \u0027128 MB Server\u0027, \u0027ram\u0027: 128, \u0027disk\u0027: 0,"},{"line_number":675,"context_line":"             \u0027OS-FLV-EXT-DATA:ephemeral\u0027: 0,"},{"line_number":676,"context_line":"             \u0027os-flavor-access:is_public\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BoHY%3D","line":673,"updated":"2014-01-23 19:05:11.000000000","message":"I still don\u0027t understand why you couldn\u0027t use one of the existing flavors.  It seems to me using flavor id 1, for instance, would be equivalent.  Also, if you still *have* to add a flavor, why not add it at the end of the list, instead of the middle like this?  You have to update the indexes into this list in several of the below fakes, whereas if you just added the flavor to the end of the list you wouldn\u0027t even have to touch them.","commit_id":"e79dae20a17b22ac031b4193764bd2daa2a37a4f"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"aee12f0f23c3b5129d1de8a75fb252deb81bb0e6","unresolved":false,"context_lines":[{"line_number":670,"context_line":"            {\u0027id\u0027: 4, \u0027name\u0027: \u00271024 MB Server\u0027, \u0027ram\u0027: 1024, \u0027disk\u0027: 10,"},{"line_number":671,"context_line":"             \u0027OS-FLV-EXT-DATA:ephemeral\u0027: 10,"},{"line_number":672,"context_line":"             \u0027os-flavor-access:is_public\u0027: True,"},{"line_number":673,"context_line":"             \u0027links\u0027: {}},"},{"line_number":674,"context_line":"            {\u0027id\u0027: \u0027aa1\u0027, \u0027name\u0027: \u0027128 MB Server\u0027, \u0027ram\u0027: 128, \u0027disk\u0027: 0,"},{"line_number":675,"context_line":"             \u0027OS-FLV-EXT-DATA:ephemeral\u0027: 0,"},{"line_number":676,"context_line":"             \u0027os-flavor-access:is_public\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BneY%3D","line":673,"in_reply_to":"AAAAUH%2F%2BoB0%3D","updated":"2014-01-23 20:54:18.000000000","message":"Hrm…add this explanation to your commit message on your next push, then.","commit_id":"e79dae20a17b22ac031b4193764bd2daa2a37a4f"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"3eeb3fc61a2b82fa5242d508b1feb475ebc11657","unresolved":false,"context_lines":[{"line_number":670,"context_line":"            {\u0027id\u0027: 4, \u0027name\u0027: \u00271024 MB Server\u0027, \u0027ram\u0027: 1024, \u0027disk\u0027: 10,"},{"line_number":671,"context_line":"             \u0027OS-FLV-EXT-DATA:ephemeral\u0027: 10,"},{"line_number":672,"context_line":"             \u0027os-flavor-access:is_public\u0027: True,"},{"line_number":673,"context_line":"             \u0027links\u0027: {}},"},{"line_number":674,"context_line":"            {\u0027id\u0027: \u0027aa1\u0027, \u0027name\u0027: \u0027128 MB Server\u0027, \u0027ram\u0027: 128, \u0027disk\u0027: 0,"},{"line_number":675,"context_line":"             \u0027OS-FLV-EXT-DATA:ephemeral\u0027: 0,"},{"line_number":676,"context_line":"             \u0027os-flavor-access:is_public\u0027: True,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BoB0%3D","line":673,"in_reply_to":"AAAAUH%2F%2BoHY%3D","updated":"2014-01-23 19:19:28.000000000","message":"I couldn\u0027t use the flavor 1 because it is validating got an specific key when it makes a post, so this validation breaks the test case for the valid key names. \nInitially, when I created a new flavor it was at the end of the list but a test test_flavor_list_with_extra_specs in /novaclient/tests/v1_1/test_shell.py started to fail. So, I could introduce the flavor at the end and modify this test. In your opinion, which option would be better?","commit_id":"e79dae20a17b22ac031b4193764bd2daa2a37a4f"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3af059860e247bb94bcdadd1bedcfe168be99ffc","unresolved":false,"context_lines":[{"line_number":670,"context_line":"            {\u0027id\u0027: 4, \u0027name\u0027: \u00271024 MB Server\u0027, \u0027ram\u0027: 1024, \u0027disk\u0027: 10,"},{"line_number":671,"context_line":"             \u0027OS-FLV-EXT-DATA:ephemeral\u0027: 10,"},{"line_number":672,"context_line":"             \u0027os-flavor-access:is_public\u0027: True,"},{"line_number":673,"context_line":"             \u0027links\u0027: {}},"},{"line_number":674,"context_line":"            {\u0027id\u0027: \u0027aa1\u0027, \u0027name\u0027: \u0027128 MB Server\u0027, \u0027ram\u0027: 128, \u0027disk\u0027: 0,"},{"line_number":675,"context_line":"             \u0027OS-FLV-EXT-DATA:ephemeral\u0027: 0,"},{"line_number":676,"context_line":"             \u0027os-flavor-access:is_public\u0027: True,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F99WU%3D","line":673,"updated":"2014-01-31 17:11:28.000000000","message":"You lost the comment added to the commit message that explained why this had to be here and not at the end of the list…","commit_id":"463369a6951d625b9f76b015420979c9cdaa0e09"}],"novaclient/tests/v1_1/test_flavors.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"9e1fd2ddc70507ecc61bc9a1ff103ad8f864f23b","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def test_set_with_valid_keys(self):"},{"line_number":193,"context_line":"        valid_keys \u003d [\u0027key4\u0027, \u0027month.price\u0027, \u0027I-Am:AK-ey.44-\u0027,"},{"line_number":194,"context_line":"                      \u0027key with spaces and _\u0027]"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        f \u003d self.cs.flavors.get(4)"},{"line_number":197,"context_line":"        for key in valid_keys:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F98kk%3D","line":194,"updated":"2014-01-31 19:34:43.000000000","message":"This is now a little redundant; you could simplify these tests by mocking out the validate_flavor_metadata_keys() call and verifying that it gets called…","commit_id":"342f184c2f919c0fabf4b835847a6d2e3a506d16"}],"novaclient/tests/v3/test_flavors.py":[{"author":{"_account_id":9275,"name":"Leandro Ignacio Costantino","email":"leandro.i.costantino@intel.com","username":"lcostantino"},"change_message_id":"06683b48d74c678deadbc8555db79d475810bc63","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            self.cs.assert_called(\u0027POST\u0027, \u0027/flavors/4/flavor-extra-specs\u0027,"},{"line_number":58,"context_line":"                                  {\"extra_specs\": {key: \u0027v4\u0027}})"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def test_unset_keys(self):"},{"line_number":61,"context_line":"        f \u003d self.cs.flavors.get(1)"},{"line_number":62,"context_line":"        f.unset_keys([\u0027k1\u0027])"},{"line_number":63,"context_line":"        self.cs.assert_called(\u0027DELETE\u0027, \u0027/flavors/1/flavor-extra-specs/k1\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Bo3M%3D","line":60,"updated":"2014-01-23 17:05:16.000000000","message":"A test for invalid keys would be great also","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"3acbe3036509eef34886a9a06943ecef3ddc8c57","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            self.cs.assert_called(\u0027POST\u0027, \u0027/flavors/4/flavor-extra-specs\u0027,"},{"line_number":58,"context_line":"                                  {\"extra_specs\": {key: \u0027v4\u0027}})"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def test_unset_keys(self):"},{"line_number":61,"context_line":"        f \u003d self.cs.flavors.get(1)"},{"line_number":62,"context_line":"        f.unset_keys([\u0027k1\u0027])"},{"line_number":63,"context_line":"        self.cs.assert_called(\u0027DELETE\u0027, \u0027/flavors/1/flavor-extra-specs/k1\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2BofI%3D","line":60,"in_reply_to":"AAAAUH%2F%2Bo3M%3D","updated":"2014-01-23 18:24:04.000000000","message":"i didn\u0027t created because It is being executed the created for v1 against the v3 too","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"}],"novaclient/utils.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"cce7d95d2e0824b68cc6fefbeccea80f6bbd6563","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        return False"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"def validate_flavor_metadata_keys(keys):"},{"line_number":416,"context_line":"    for key in keys:"},{"line_number":417,"context_line":"        valid_name \u003d VALID_KEY_REGEX.search(key)"},{"line_number":418,"context_line":"        if not valid_name:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BoGY%3D","line":415,"updated":"2014-01-23 19:05:11.000000000","message":"I would like to see a unit test on validate_flavor_metadata_keys(), rather than just the functional tests you\u0027ve added for the methods that call it.  That would help push our test suite more toward a pure unit test suite, which is the structure I\u0027d prefer…","commit_id":"e79dae20a17b22ac031b4193764bd2daa2a37a4f"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"3eeb3fc61a2b82fa5242d508b1feb475ebc11657","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        return False"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"def validate_flavor_metadata_keys(keys):"},{"line_number":416,"context_line":"    for key in keys:"},{"line_number":417,"context_line":"        valid_name \u003d VALID_KEY_REGEX.search(key)"},{"line_number":418,"context_line":"        if not valid_name:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BoBU%3D","line":415,"in_reply_to":"AAAAUH%2F%2BoGY%3D","updated":"2014-01-23 19:19:28.000000000","message":"I will include it","commit_id":"e79dae20a17b22ac031b4193764bd2daa2a37a4f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b47e72e07a305f1e60faa78b3812454b007ab4a6","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from novaclient.openstack.common import jsonutils"},{"line_number":28,"context_line":"from novaclient.openstack.common import strutils"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"VALID_KEY_REGEX \u003d re.compile(\"^[\\w\\.\\-_: ]*$\", re.UNICODE)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"arg \u003d cliutils.arg"},{"line_number":33,"context_line":"env \u003d cliutils.env"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2BEF8%3D","line":30,"updated":"2014-01-30 14:58:48.000000000","message":"This doesn\u0027t line up with what\u0027s in the nova api validation patch:\n\nhttps://review.openstack.org/#/c/61566/\n\nWhich is correct?","commit_id":"887912a51e899b6d7d01d74e097edb4f39b46967"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"34cdef2353c8999aa06bbf2ace0cb14eaf9bfad1","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from novaclient.openstack.common import jsonutils"},{"line_number":28,"context_line":"from novaclient.openstack.common import strutils"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"VALID_KEY_REGEX \u003d re.compile(\"^[\\w\\.\\-_: ]*$\", re.UNICODE)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"arg \u003d cliutils.arg"},{"line_number":33,"context_line":"env \u003d cliutils.env"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2BDNM%3D","line":30,"in_reply_to":"AAAAUH%2F%2BEF8%3D","updated":"2014-01-30 17:05:41.000000000","message":"Done","commit_id":"887912a51e899b6d7d01d74e097edb4f39b46967"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b47e72e07a305f1e60faa78b3812454b007ab4a6","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    for key in keys:"},{"line_number":359,"context_line":"        valid_name \u003d VALID_KEY_REGEX.search(key)"},{"line_number":360,"context_line":"        if not valid_name:"},{"line_number":361,"context_line":"            msg \u003d _(\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027"},{"line_number":362,"context_line":"                    \u0027numbers, underscores, periods, colons and hyphens.\u0027)"},{"line_number":363,"context_line":"            raise exceptions.CommandError(msg % key)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2BEJw%3D","line":361,"updated":"2014-01-30 14:58:48.000000000","message":"And spaces?","commit_id":"887912a51e899b6d7d01d74e097edb4f39b46967"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"af432c400b7d9cca75c48318e240e2ece39a19e1","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    for key in keys:"},{"line_number":359,"context_line":"        valid_name \u003d VALID_KEY_REGEX.search(key)"},{"line_number":360,"context_line":"        if not valid_name:"},{"line_number":361,"context_line":"            msg \u003d _(\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027"},{"line_number":362,"context_line":"                    \u0027numbers, underscores, periods, colons and hyphens.\u0027)"},{"line_number":363,"context_line":"            raise exceptions.CommandError(msg % key)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2BEDI%3D","line":361,"in_reply_to":"AAAAUH%2F%2BEJw%3D","updated":"2014-01-30 15:09:07.000000000","message":"Done","commit_id":"887912a51e899b6d7d01d74e097edb4f39b46967"}],"novaclient/v1_1/flavors.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"2f19bc251403733b5c662de13877e9e8fee9e370","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        :param flavor: The :class:`Flavor` to set extra spec on"},{"line_number":66,"context_line":"        :param metadata: A dict of key/value pairs to be set"},{"line_number":67,"context_line":"        \"\"\""},{"line_number":68,"context_line":"        valid_name_regex \u003d re.compile(\"^[\\w\\.\\-_: ]*$\", re.UNICODE)"},{"line_number":69,"context_line":"        for key in metadata.keys():"},{"line_number":70,"context_line":"            valid_name \u003d valid_name_regex.search(key)"},{"line_number":71,"context_line":"            if not valid_name:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Bovw%3D","line":68,"updated":"2014-01-23 17:22:25.000000000","message":"Why do you compile here?  This RE will have to be recompiled every time the method is called.  It\u0027d probably be better to compile it and assign it to a global at the top level of this file.","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"3acbe3036509eef34886a9a06943ecef3ddc8c57","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        :param flavor: The :class:`Flavor` to set extra spec on"},{"line_number":66,"context_line":"        :param metadata: A dict of key/value pairs to be set"},{"line_number":67,"context_line":"        \"\"\""},{"line_number":68,"context_line":"        valid_name_regex \u003d re.compile(\"^[\\w\\.\\-_: ]*$\", re.UNICODE)"},{"line_number":69,"context_line":"        for key in metadata.keys():"},{"line_number":70,"context_line":"            valid_name \u003d valid_name_regex.search(key)"},{"line_number":71,"context_line":"            if not valid_name:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Bog0%3D","line":68,"in_reply_to":"AAAAUH%2F%2Bovw%3D","updated":"2014-01-23 18:24:04.000000000","message":"Moved to the utils and now it is being made just once.","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":9275,"name":"Leandro Ignacio Costantino","email":"leandro.i.costantino@intel.com","username":"lcostantino"},"change_message_id":"06683b48d74c678deadbc8555db79d475810bc63","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        for key in metadata.keys():"},{"line_number":70,"context_line":"            valid_name \u003d valid_name_regex.search(key)"},{"line_number":71,"context_line":"            if not valid_name:"},{"line_number":72,"context_line":"                msg \u003d (\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027"},{"line_number":73,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":74,"context_line":"                      % key"},{"line_number":75,"context_line":"                raise exceptions.CommandError(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Bo4E%3D","line":72,"updated":"2014-01-23 17:05:16.000000000","message":"Message should be translated? _ seems to be missing","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"3acbe3036509eef34886a9a06943ecef3ddc8c57","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        for key in metadata.keys():"},{"line_number":70,"context_line":"            valid_name \u003d valid_name_regex.search(key)"},{"line_number":71,"context_line":"            if not valid_name:"},{"line_number":72,"context_line":"                msg \u003d (\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027"},{"line_number":73,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":74,"context_line":"                      % key"},{"line_number":75,"context_line":"                raise exceptions.CommandError(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2BogE%3D","line":72,"in_reply_to":"AAAAUH%2F%2Bo4E%3D","updated":"2014-01-23 18:24:04.000000000","message":"I created a dependency with another change which if fixing translations for py33. Translations included now","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"2f19bc251403733b5c662de13877e9e8fee9e370","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            valid_name \u003d valid_name_regex.search(key)"},{"line_number":71,"context_line":"            if not valid_name:"},{"line_number":72,"context_line":"                msg \u003d (\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027"},{"line_number":73,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":74,"context_line":"                      % key"},{"line_number":75,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2BovE%3D","line":73,"updated":"2014-01-23 17:22:25.000000000","message":"I\u0027d prefer you use parentheses to eliminate the backslash, or even move the substitution into the raise.  Combining Leandro\u0027s and my comments, this would look like:\n\n    msg \u003d _(\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027\n            \u0027numbers, underscores, periods, colons and hyphens.\u0027)\n    raise exceptions.CommandError(msg % key)","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"3acbe3036509eef34886a9a06943ecef3ddc8c57","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            valid_name \u003d valid_name_regex.search(key)"},{"line_number":71,"context_line":"            if not valid_name:"},{"line_number":72,"context_line":"                msg \u003d (\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027"},{"line_number":73,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":74,"context_line":"                      % key"},{"line_number":75,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Bosg%3D","line":73,"in_reply_to":"AAAAUH%2F%2BovE%3D","updated":"2014-01-23 18:24:04.000000000","message":"Done","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"2802d0c87a423daa4f61c63814dda2416566a875","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":74,"context_line":"                      % key"},{"line_number":75,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        body \u003d {\u0027extra_specs\u0027: metadata}"},{"line_number":78,"context_line":"        return self.manager._create("},{"line_number":79,"context_line":"                            \"/flavors/%s/os-extra_specs\" % base.getid(self),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Botc%3D","line":76,"updated":"2014-01-23 17:28:11.000000000","message":"I think we may be repeating code. Is it possible to back off this method into a validate method that you could use in both places?","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"3acbe3036509eef34886a9a06943ecef3ddc8c57","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":74,"context_line":"                      % key"},{"line_number":75,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        body \u003d {\u0027extra_specs\u0027: metadata}"},{"line_number":78,"context_line":"        return self.manager._create("},{"line_number":79,"context_line":"                            \"/flavors/%s/os-extra_specs\" % base.getid(self),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Bof8%3D","line":76,"in_reply_to":"AAAAUH%2F%2Borc%3D","updated":"2014-01-23 18:24:04.000000000","message":"I moved the repeated code to the utils.","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"07101ff45b11c7a0a50dc8a64dce38e133fe39de","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":74,"context_line":"                      % key"},{"line_number":75,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        body \u003d {\u0027extra_specs\u0027: metadata}"},{"line_number":78,"context_line":"        return self.manager._create("},{"line_number":79,"context_line":"                            \"/flavors/%s/os-extra_specs\" % base.getid(self),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Borc%3D","line":76,"in_reply_to":"AAAAUH%2F%2Botc%3D","updated":"2014-01-23 17:32:36.000000000","message":"The duplication is endemic right now as the v3 api interface is being built; basically, v3 is being built by copying the v1.1 code and then modifying it to conform to the new interface.  It\u0027s not a substantial change, but it is a bit of one.\n\nThat said, anything that brings us into closer conformance with DRY will be quite welcome :)","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3af059860e247bb94bcdadd1bedcfe168be99ffc","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            if not valid_name:"},{"line_number":73,"context_line":"                msg \u003d _(\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027"},{"line_number":74,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":75,"context_line":"                      % key"},{"line_number":76,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        body \u003d {\u0027extra_specs\u0027: metadata}"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F99XU%3D","line":75,"updated":"2014-01-31 17:11:28.000000000","message":"I don\u0027t like backslash continuations.  Let\u0027s format this as:\n\n    msg \u003d _(\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027\n            \u0027numbers, underscores, periods, colons and hyphens.\u0027)\n    raise exceptions.CommandError(msg % key)","commit_id":"463369a6951d625b9f76b015420979c9cdaa0e09"}],"novaclient/v3/flavors.py":[{"author":{"_account_id":9275,"name":"Leandro Ignacio Costantino","email":"leandro.i.costantino@intel.com","username":"lcostantino"},"change_message_id":"06683b48d74c678deadbc8555db79d475810bc63","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        for key in metadata.keys():"},{"line_number":63,"context_line":"            valid_name \u003d valid_name_regex.search(key)"},{"line_number":64,"context_line":"            if not valid_name:"},{"line_number":65,"context_line":"                msg \u003d (\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027"},{"line_number":66,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":67,"context_line":"                      % key"},{"line_number":68,"context_line":"                raise exceptions.CommandError(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Bo34%3D","line":65,"updated":"2014-01-23 17:05:16.000000000","message":"same, translatin missing","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"3acbe3036509eef34886a9a06943ecef3ddc8c57","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        for key in metadata.keys():"},{"line_number":63,"context_line":"            valid_name \u003d valid_name_regex.search(key)"},{"line_number":64,"context_line":"            if not valid_name:"},{"line_number":65,"context_line":"                msg \u003d (\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027"},{"line_number":66,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":67,"context_line":"                      % key"},{"line_number":68,"context_line":"                raise exceptions.CommandError(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Bof0%3D","line":65,"in_reply_to":"AAAAUH%2F%2Bo34%3D","updated":"2014-01-23 18:24:04.000000000","message":"Same than previous","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"2802d0c87a423daa4f61c63814dda2416566a875","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":67,"context_line":"                      % key"},{"line_number":68,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        body \u003d {\u0027extra_specs\u0027: metadata}"},{"line_number":71,"context_line":"        return self.manager._create("},{"line_number":72,"context_line":"                            \"/flavors/%s/flavor-extra-specs\" %"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Botg%3D","line":69,"updated":"2014-01-23 17:28:11.000000000","message":"would this be better as a separate method?\n\nconsider:\n  _validate_metadata_keys(metadata.keys())","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":9214,"name":"Sergio Cazzolato","email":"sergiocazzolato@gmail.com","username":"sjcazzol"},"change_message_id":"3acbe3036509eef34886a9a06943ecef3ddc8c57","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":67,"context_line":"                      % key"},{"line_number":68,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        body \u003d {\u0027extra_specs\u0027: metadata}"},{"line_number":71,"context_line":"        return self.manager._create("},{"line_number":72,"context_line":"                            \"/flavors/%s/flavor-extra-specs\" %"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Bofw%3D","line":69,"in_reply_to":"AAAAUH%2F%2Botg%3D","updated":"2014-01-23 18:24:04.000000000","message":"Done","commit_id":"03425fcbf6e5cc953dc4a1d84ef9dc77ed87c9b9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"3af059860e247bb94bcdadd1bedcfe168be99ffc","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                msg \u003d _(\u0027Invalid key: \"%s\". Keys may only contain letters, \u0027"},{"line_number":67,"context_line":"                        \u0027numbers, underscores, periods, colons and hyphens.\u0027) \\"},{"line_number":68,"context_line":"                      % key"},{"line_number":69,"context_line":"                raise exceptions.CommandError(msg)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        body \u003d {\u0027extra_specs\u0027: metadata}"},{"line_number":72,"context_line":"        return self.manager._create("}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F99XQ%3D","line":69,"updated":"2014-01-31 17:11:28.000000000","message":"Ibid.","commit_id":"463369a6951d625b9f76b015420979c9cdaa0e09"}]}
