)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4e22bab0ee64b9aef3dd7269ace0ea6dca203df4","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implements datastore capabilities"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This allows for capabilities to be set in the mysql database capabilities"},{"line_number":10,"context_line":"tables and associated to datastores with the datastore_capabilities"},{"line_number":11,"context_line":"table."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAWH%2F%2BSSM%3D","line":9,"updated":"2014-03-27 21:07:32.000000000","message":"Please re-word commit message body to be more precise.","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"e739f8cbc0e19d81f01cb8b1e5ac93e78ace32ba","unresolved":false,"context_lines":[{"line_number":11,"context_line":"table."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I7153d435bf8c00dc2a874a66c7a2b64e8fbafa09"},{"line_number":14,"context_line":"Implements: blueprint capabilities"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAWH%2F%2BSME%3D","line":14,"updated":"2014-03-27 21:08:33.000000000","message":"Partially-implements: blueprint capabilities","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"}],"trove/datastore/models.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4e22bab0ee64b9aef3dd7269ace0ea6dca203df4","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def add(self, capability):"},{"line_number":78,"context_line":"        if self.datastore_id is not None:"},{"line_number":79,"context_line":"            DBDatastoreCapabilities.create(capability_id\u003dcapability.id,"},{"line_number":80,"context_line":"                                           datastore_id\u003dself.datastore_id)"},{"line_number":81,"context_line":"        self.capabilities.append(capability)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BSQ0%3D","line":79,"updated":"2014-03-27 21:07:32.000000000","message":"\"add\" means add something to something that already exists.\nplease explain naming, because, accoring to code - method call \"add\" but actually it creates.","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"df011a16e7d35ce7f21d27ed7a513e3713755313","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def add(self, capability):"},{"line_number":78,"context_line":"        if self.datastore_id is not None:"},{"line_number":79,"context_line":"            DBDatastoreCapabilities.create(capability_id\u003dcapability.id,"},{"line_number":80,"context_line":"                                           datastore_id\u003dself.datastore_id)"},{"line_number":81,"context_line":"        self.capabilities.append(capability)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9%2Bxw%3D","line":79,"in_reply_to":"AAAAWH%2F%2BSQ0%3D","updated":"2014-03-31 19:47:40.000000000","message":"This method adds the association record between the datastore and capability.  I will add doc strings to make this more clear.","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4e22bab0ee64b9aef3dd7269ace0ea6dca203df4","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    @classmethod"},{"line_number":84,"context_line":"    def load(cls, datastore_id\u003dNone):"},{"line_number":85,"context_line":"        self \u003d cls()"},{"line_number":86,"context_line":"        self.datastore_id \u003d datastore_id"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        capability_mappings \u003d DBDatastoreCapabilities.find_all("},{"line_number":89,"context_line":"            datastore_id\u003ddatastore_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BSQI%3D","line":86,"updated":"2014-03-27 21:07:32.000000000","message":"please explain why do load method needs such trick ?","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"df011a16e7d35ce7f21d27ed7a513e3713755313","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    @classmethod"},{"line_number":84,"context_line":"    def load(cls, datastore_id\u003dNone):"},{"line_number":85,"context_line":"        self \u003d cls()"},{"line_number":86,"context_line":"        self.datastore_id \u003d datastore_id"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        capability_mappings \u003d DBDatastoreCapabilities.find_all("},{"line_number":89,"context_line":"            datastore_id\u003ddatastore_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9%2BxU%3D","line":86,"in_reply_to":"AAAAWH%2F%2BSQI%3D","updated":"2014-03-31 19:47:40.000000000","message":"When capabilities are loaded for a datastore, they are each loaded and populated into the capabilities array in the object.","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"8dc8de59bf6a609c1243e23b194b62001ca7862a","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    @classmethod"},{"line_number":84,"context_line":"    def load(cls, datastore_id\u003dNone):"},{"line_number":85,"context_line":"        self \u003d cls()"},{"line_number":86,"context_line":"        self.datastore_id \u003d datastore_id"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        capability_mappings \u003d DBDatastoreCapabilities.find_all("},{"line_number":89,"context_line":"            datastore_id\u003ddatastore_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9%2BjA%3D","line":86,"in_reply_to":"AAAAWH%2F9%2BxU%3D","updated":"2014-03-31 19:54:20.000000000","message":"i mean why do you need to create instance of the class and assign datastore_id if it\u0027s not used below ?","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4e22bab0ee64b9aef3dd7269ace0ea6dca203df4","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    @classmethod"},{"line_number":126,"context_line":"    def create(cls, name, description):"},{"line_number":127,"context_line":"        DBCapabilities.create(name\u003dname, description\u003ddescription)"},{"line_number":128,"context_line":"        return cls.load(name)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def delete(self):"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BSPI%3D","line":128,"updated":"2014-03-27 21:07:32.000000000","message":"as i remember create method already returns model object, no need to do load","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"df011a16e7d35ce7f21d27ed7a513e3713755313","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    @classmethod"},{"line_number":126,"context_line":"    def create(cls, name, description):"},{"line_number":127,"context_line":"        DBCapabilities.create(name\u003dname, description\u003ddescription)"},{"line_number":128,"context_line":"        return cls.load(name)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def delete(self):"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9%2Bws%3D","line":128,"in_reply_to":"AAAAWH%2F%2BSPI%3D","updated":"2014-03-31 19:47:40.000000000","message":"Would create return an instance of Capability or an instance of DBCapabilities? My understanding is that it would return the latter.","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4e22bab0ee64b9aef3dd7269ace0ea6dca203df4","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    @property"},{"line_number":170,"context_line":"    def capabilities(self):"},{"line_number":171,"context_line":"        if self._capabilities is None:"},{"line_number":172,"context_line":"            self._capabilities \u003d Capabilities.load(self.db_info.id)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        return self._capabilities"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BSR0%3D","line":172,"updated":"2014-03-27 21:07:32.000000000","message":"why is it made as singleton ?","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"df011a16e7d35ce7f21d27ed7a513e3713755313","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    @property"},{"line_number":170,"context_line":"    def capabilities(self):"},{"line_number":171,"context_line":"        if self._capabilities is None:"},{"line_number":172,"context_line":"            self._capabilities \u003d Capabilities.load(self.db_info.id)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        return self._capabilities"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9%2BwE%3D","line":172,"in_reply_to":"AAAAWH%2F%2BSR0%3D","updated":"2014-03-31 19:47:40.000000000","message":"This is not a singleton, its lazy loading. When the datastore object is created, it doesn\u0027t load the capabilities. When the capabilities property is requested the first time, it load it into the object and never reloads it from the database.","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"8ad0eecc7f5b43911a4f1989332acad9e1ed13b2","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def add(self, capability):"},{"line_number":78,"context_line":"        if self.datastore_id is not None:"},{"line_number":79,"context_line":"            DBDatastoreCapabilities.create(capability_id\u003dcapability.id,"},{"line_number":80,"context_line":"                                           datastore_id\u003dself.datastore_id)"},{"line_number":81,"context_line":"        self.capabilities.append(capability)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9ldk%3D","line":79,"updated":"2014-04-03 14:47:29.000000000","message":"no docsting presented, please take a look at previous comments","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"37a138943b710cd06eb290b341bfa365dc6580be","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def add(self, capability):"},{"line_number":78,"context_line":"        if self.datastore_id is not None:"},{"line_number":79,"context_line":"            DBDatastoreCapabilities.create(capability_id\u003dcapability.id,"},{"line_number":80,"context_line":"                                           datastore_id\u003dself.datastore_id)"},{"line_number":81,"context_line":"        self.capabilities.append(capability)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9jTU%3D","line":79,"in_reply_to":"AAAAWH%2F9ldk%3D","updated":"2014-04-07 18:54:43.000000000","message":"Docstring added.","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"8ad0eecc7f5b43911a4f1989332acad9e1ed13b2","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    @classmethod"},{"line_number":84,"context_line":"    def load(cls, datastore_id\u003dNone):"},{"line_number":85,"context_line":"        self \u003d cls()"},{"line_number":86,"context_line":"        self.datastore_id \u003d datastore_id"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        capability_mappings \u003d DBDatastoreCapabilities.find_all("},{"line_number":89,"context_line":"            datastore_id\u003ddatastore_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9ldc%3D","line":86,"updated":"2014-04-03 14:47:29.000000000","message":"why do you need to create instance of the class and assign datastore_id if it\u0027s not used below ?","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"37a138943b710cd06eb290b341bfa365dc6580be","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    @classmethod"},{"line_number":84,"context_line":"    def load(cls, datastore_id\u003dNone):"},{"line_number":85,"context_line":"        self \u003d cls()"},{"line_number":86,"context_line":"        self.datastore_id \u003d datastore_id"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        capability_mappings \u003d DBDatastoreCapabilities.find_all("},{"line_number":89,"context_line":"            datastore_id\u003ddatastore_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9jTY%3D","line":86,"in_reply_to":"AAAAWH%2F9ldc%3D","updated":"2014-04-07 18:54:43.000000000","message":"It is used in the add method.","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"8ad0eecc7f5b43911a4f1989332acad9e1ed13b2","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.datastore_id \u003d datastore_id"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        capability_mappings \u003d DBDatastoreCapabilities.find_all("},{"line_number":89,"context_line":"            datastore_id\u003ddatastore_id)"},{"line_number":90,"context_line":"        for capability_map in capability_mappings:"},{"line_number":91,"context_line":"            capability \u003d Capability.load(capability_map.capability_id)"},{"line_number":92,"context_line":"            self.capabilities.append(capability)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9ldQ%3D","line":89,"updated":"2014-04-03 14:47:29.000000000","message":"i guess, it should\u0027ve been used here","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"37a138943b710cd06eb290b341bfa365dc6580be","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.datastore_id \u003d datastore_id"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        capability_mappings \u003d DBDatastoreCapabilities.find_all("},{"line_number":89,"context_line":"            datastore_id\u003ddatastore_id)"},{"line_number":90,"context_line":"        for capability_map in capability_mappings:"},{"line_number":91,"context_line":"            capability \u003d Capability.load(capability_map.capability_id)"},{"line_number":92,"context_line":"            self.capabilities.append(capability)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9jTc%3D","line":89,"in_reply_to":"AAAAWH%2F9ldQ%3D","updated":"2014-04-07 18:54:43.000000000","message":"Fixed to use self.datastore_id","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"8ad0eecc7f5b43911a4f1989332acad9e1ed13b2","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @classmethod"},{"line_number":126,"context_line":"    def create(cls, name, description):"},{"line_number":127,"context_line":"        DBCapabilities.create(name\u003dname, description\u003ddescription)"},{"line_number":128,"context_line":"        return cls.load(name)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def delete(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9lbA%3D","line":127,"updated":"2014-04-03 14:47:29.000000000","message":"create method from the base model class returns the actual model representation, no need to ask backend twice.","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"37a138943b710cd06eb290b341bfa365dc6580be","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @classmethod"},{"line_number":126,"context_line":"    def create(cls, name, description):"},{"line_number":127,"context_line":"        DBCapabilities.create(name\u003dname, description\u003ddescription)"},{"line_number":128,"context_line":"        return cls.load(name)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def delete(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9jT4%3D","line":127,"in_reply_to":"AAAAWH%2F9lbA%3D","updated":"2014-04-07 18:54:43.000000000","message":"Got it, that makes sense.","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"8ad0eecc7f5b43911a4f1989332acad9e1ed13b2","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    @property"},{"line_number":170,"context_line":"    def capabilities(self):"},{"line_number":171,"context_line":"        if self._capabilities is None:"},{"line_number":172,"context_line":"            self._capabilities \u003d Capabilities.load(self.db_info.id)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        return self._capabilities"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9lY4%3D","line":172,"updated":"2014-04-03 14:47:29.000000000","message":"what would happen after you ask capabilities attribute in the second time.\n\nfrom the first time, self._capabilities already not equal to None, so i think lazy loading doesn\u0027t fits here","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"37a138943b710cd06eb290b341bfa365dc6580be","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    @property"},{"line_number":170,"context_line":"    def capabilities(self):"},{"line_number":171,"context_line":"        if self._capabilities is None:"},{"line_number":172,"context_line":"            self._capabilities \u003d Capabilities.load(self.db_info.id)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        return self._capabilities"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9jTo%3D","line":172,"in_reply_to":"AAAAWH%2F9lY4%3D","updated":"2014-04-07 18:54:43.000000000","message":"The second time capabilities is asked for, self._capabilities will be a list. Potentially an empty list, but not None.\n\nThat means there will never be an instance of loading all of the capabilities for a datastore twice.","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"37a138943b710cd06eb290b341bfa365dc6580be","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        return self.db_info.default_version_id"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    @property"},{"line_number":175,"context_line":"    def capabilities(self):"},{"line_number":176,"context_line":"        if self._capabilities is None:"},{"line_number":177,"context_line":"            self._capabilities \u003d Capabilities.load(self.db_info.id)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9PDA%3D","line":175,"updated":"2014-04-07 18:58:57.000000000","message":"I meant to reply in the previous review comment, but lost the message. \nThe second time capabilities is asked for, self._capabilities will be a list. Potentially an empty list, but not None.\nThat means there will never be an instance of loading all of the capabilities for a datastore twice.","commit_id":"fa3bdbc48196e1efcf68bd5b735bfbab42577a23"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"373494d98a3cef10fc16cbddfa5ad9ce3ee95a57","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    @property"},{"line_number":175,"context_line":"    def capabilities(self):"},{"line_number":176,"context_line":"        if self._capabilities is None:"},{"line_number":177,"context_line":"            self._capabilities \u003d Capabilities.load(self.db_info.id)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        return self._capabilities"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9PAI%3D","line":177,"updated":"2014-04-07 19:04:44.000000000","message":"what if the capabilities were updated? at this point only old capabilities would be loaded, so i still stand that we don\u0027t need the lazy loading here.","commit_id":"fa3bdbc48196e1efcf68bd5b735bfbab42577a23"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"621ae4ea1a868a8aa76e223b5c491d6f11e9945d","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        for item in self.capabilities:"},{"line_number":75,"context_line":"            yield item"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def add(self, capability):"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"            This adds a capability to the list. If this capability list has"},{"line_number":80,"context_line":"            an associated datastore, it also creates the association in the"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAW3%2F%2F6oA%3D","line":77,"updated":"2014-04-09 14:18:20.000000000","message":"Does this have a unit test?","commit_id":"86935f536bd6187525a14fd72dbecce60bf934fd"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"81868ffdaf3f77d9561d49b835d4369729fe8282","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        for item in self.capabilities:"},{"line_number":75,"context_line":"            yield item"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def add(self, capability):"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"            This adds a capability to the list. If this capability list has"},{"line_number":80,"context_line":"            an associated datastore, it also creates the association in the"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAW3%2F%2F6So%3D","line":77,"in_reply_to":"AAAAW3%2F%2F6oA%3D","updated":"2014-04-09 14:49:58.000000000","message":"This is tested as part of the datastore tests. Capabilities is the union of datastore and capability, so it makes sense to test in in context I think.","commit_id":"86935f536bd6187525a14fd72dbecce60bf934fd"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"621ae4ea1a868a8aa76e223b5c491d6f11e9945d","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    @classmethod"},{"line_number":89,"context_line":"    def load(cls, datastore_id\u003dNone):"},{"line_number":90,"context_line":"        self \u003d cls()"},{"line_number":91,"context_line":"        self.datastore_id \u003d datastore_id"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        capability_mappings \u003d DBDatastoreCapabilities.find_all("},{"line_number":94,"context_line":"            datastore_id\u003dself.datastore_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAW3%2F%2F6wo%3D","line":91,"updated":"2014-04-09 14:18:20.000000000","message":"Why not just put this into the __init__ method? What I don\u0027t like here is client code has the opportunity to call the __init__ method but will return an instance which lacks the datastore_id field and isn\u0027t fully formed.","commit_id":"86935f536bd6187525a14fd72dbecce60bf934fd"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"81868ffdaf3f77d9561d49b835d4369729fe8282","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    @classmethod"},{"line_number":89,"context_line":"    def load(cls, datastore_id\u003dNone):"},{"line_number":90,"context_line":"        self \u003d cls()"},{"line_number":91,"context_line":"        self.datastore_id \u003d datastore_id"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        capability_mappings \u003d DBDatastoreCapabilities.find_all("},{"line_number":94,"context_line":"            datastore_id\u003dself.datastore_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAW3%2F%2F6T0%3D","line":91,"in_reply_to":"AAAAW3%2F%2F6wo%3D","updated":"2014-04-09 14:49:58.000000000","message":"This makes sense. I\u0027ve moved that to the __init__ method.","commit_id":"86935f536bd6187525a14fd72dbecce60bf934fd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3803c4c2334d4a323285a85d0f8e148d504a2354","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    @property"},{"line_number":175,"context_line":"    def capabilities(self):"},{"line_number":176,"context_line":"        if self._capabilities is None:"},{"line_number":177,"context_line":"            self._capabilities \u003d Capabilities.load(self.db_info.id)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        return self._capabilities"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWn%2F%2F5AY%3D","line":177,"updated":"2014-04-08 17:34:15.000000000","message":"Copied from the last patchset. Reason: no points were given as the replay.\n\nwhat if the capabilities were updated? at this point only old capabilities would be loaded, so i still stand that we don\u0027t need the lazy loading here.","commit_id":"86935f536bd6187525a14fd72dbecce60bf934fd"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"621ae4ea1a868a8aa76e223b5c491d6f11e9945d","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    @property"},{"line_number":175,"context_line":"    def capabilities(self):"},{"line_number":176,"context_line":"        if self._capabilities is None:"},{"line_number":177,"context_line":"            self._capabilities \u003d Capabilities.load(self.db_info.id)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        return self._capabilities"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAW3%2F%2F6pw%3D","line":177,"in_reply_to":"AAAAWn%2F%2F4fY%3D","updated":"2014-04-09 14:18:20.000000000","message":"Since the Datastore object will be created during each thread of execution (REST request, RPC message, etc), the capabilities will be relatively fresh. The only thing loading them each time would help is if we wanted to change a capability and have it take affect during a thread of execution, which seems dangerous to me.\n\nImagine, for example, you have a code path in taskmanager that checks some value which, if set, means a later value *must* be set. Then it goes about it\u0027s work as meanwhile, the user changes the capabilities. Then the taskmanager gets to that later value, reloads the capabilities, and this later value the former one depended on was changed, so the code path fails in some unpredictable way. To me, I\u0027d rather avoid this scenario all together by only loading the capabilities once.\n\nSo I vote we keep it as it is here, and lazy load it only once.","commit_id":"86935f536bd6187525a14fd72dbecce60bf934fd"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"cbf06c131ffba47a2f26bb6b9021a003d1143345","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    @property"},{"line_number":175,"context_line":"    def capabilities(self):"},{"line_number":176,"context_line":"        if self._capabilities is None:"},{"line_number":177,"context_line":"            self._capabilities \u003d Capabilities.load(self.db_info.id)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        return self._capabilities"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWn%2F%2F4fY%3D","line":177,"in_reply_to":"AAAAWn%2F%2F5AY%3D","updated":"2014-04-08 18:53:31.000000000","message":"Sorry my tests were broken; I needed to rebase and push to get the tests to pass.\n\nI think that lazy loading is strictly necessary, but we can check the database each time if everyone feels that is appropriate.","commit_id":"86935f536bd6187525a14fd72dbecce60bf934fd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"0664d472d5881272d1972df1eb67c4d667579177","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027name\u0027, \u0027default_version_id\u0027]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class DBCapabilities(dbmodels.DatabaseModelBase):"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027name\u0027, \u0027description\u0027]"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAW3%2F%2FmEQ%3D","line":46,"updated":"2014-04-11 22:01:04.000000000","message":"1) datastore-version-id vs. datastore-id\n\ni\u0027m thinking that datastore-id isn\u0027t the right granularity, that instead it should be datastore-version-id (with the ability to set a default for a datastore-id for convenience).\n\nex: say my datastore is \u0027x\u0027, and x\u0027s latest available version is 5.y.y. If later in the year datastore \u0027x\u0027 releases version 6, and 6 now supports a capability that other datastores already had, how can i turn that capability on for only 6+ and not 5.y.y? an example of this could be a datastore that supports a primitive backup/restore in its initial offering, but adds point-in-time and/or incremental in later versions. setting a default capability value for a datastore is fine, but each version should have the ability to override.\n\n2) delete datastore_capabilities row vs. introducing an \u0027active\u0027 column\n\nusing an \u0027active\u0027 column to indicate 0/1 (off/on) vs. the absence/presence of a row is more advantageous.\n\nex: capability \u0027d\u0027 is introduced and inserted into the capabilities table. \u0027d\u0027 is a new feature, so trove should not automatically insert rows into datastore_capabilities because that would turn on the feature. let\u0027s say the trove implementation for \u0027d\u0027 only exists for mysql at the moment (people are still working on mongodb and others). how would the deployer know which datastores can actually support capability \u0027d\u0027? in short, they would have no idea unless they looked in the codebase. if instead, an \u0027active\u0027 column exists, then the capability row for \u0027d\u0027 could be inserted into datastore_capabilities on db_sync, but with active\u003d0. now, the datastore_capabilities table at all times correctly represents the list of capabilities that are *possible* for each datastore (and datastore-version), *and* which ones are enabled/disabled.","commit_id":"483077f6af1450d9b40eb4e9e34ea2d68c38e256"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"b8e8751a3474a333f853f56cb71bd5ecc2b0222b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027name\u0027, \u0027default_version_id\u0027]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class DBCapabilities(dbmodels.DatabaseModelBase):"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027name\u0027, \u0027description\u0027]"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAW3%2F%2FaqQ%3D","line":46,"in_reply_to":"AAAAW3%2F%2FmEQ%3D","updated":"2014-04-14 18:11:06.000000000","message":"+1 amcrn.  I would prefer that we store enabled/disabled flag in the DB, as well as return something like that in the API.","commit_id":"483077f6af1450d9b40eb4e9e34ea2d68c38e256"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"dfd1b949a351817ca41d5e2ca9b62c847066528e","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def add(self, capability):"},{"line_number":79,"context_line":"        \"\"\""},{"line_number":80,"context_line":"            This adds a capability to the list. If this capability list has"},{"line_number":81,"context_line":"            an associated datastore, it also creates the association in the"},{"line_number":82,"context_line":"            datastore_capabilities table."},{"line_number":83,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FQEY%3D","line":80,"updated":"2014-04-15 19:20:19.000000000","message":"This method adds a new capability to the set of all existing capabilities.","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"d7d41e83f5c114646ed3d8af81cfcf9f21cc3430","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def add(self, capability):"},{"line_number":79,"context_line":"        \"\"\""},{"line_number":80,"context_line":"            This adds a capability to the list. If this capability list has"},{"line_number":81,"context_line":"            an associated datastore, it also creates the association in the"},{"line_number":82,"context_line":"            datastore_capabilities table."},{"line_number":83,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXH%2F%2F4q8%3D","line":80,"in_reply_to":"AAAAW3%2F%2FQEY%3D","updated":"2014-04-16 19:46:59.000000000","message":"If you want to create a capability, you use the Capability.create method. This method adds it to a list of capabilities (typically associated with a datastore).","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"dfd1b949a351817ca41d5e2ca9b62c847066528e","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        return self.db_info.default_version_id"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def delete(self):"},{"line_number":191,"context_line":"        self.db_info.delete()"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"class Datastores(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FQD0%3D","line":191,"updated":"2014-04-15 19:20:19.000000000","message":"Why do we need to add this method for the datastore entity ?","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"d7d41e83f5c114646ed3d8af81cfcf9f21cc3430","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        return self.db_info.default_version_id"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def delete(self):"},{"line_number":191,"context_line":"        self.db_info.delete()"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"class Datastores(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXH%2F%2F4p0%3D","line":191,"in_reply_to":"AAAAW3%2F%2FQD0%3D","updated":"2014-04-16 19:46:59.000000000","message":"Short answer: Testing.\n\nFor the capability and datastore_version  tests, the datastore is modified in the database. Since our tests are run asynchronously, we cannot use a single test datastore. Instead, we create a new datastore each run, and remove it when we are done with it.","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        else:"},{"line_number":208,"context_line":"            raise exception.CapabilityNotFound("},{"line_number":209,"context_line":"                _(\u0027Somehow we got a datastore version capability without \u0027"},{"line_number":210,"context_line":"                  \u0027a parent, that shouldn\\\u0027t happen\u0027))"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @property"},{"line_number":213,"context_line":"    def name(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_6aed7c25","line":210,"updated":"2014-05-21 02:46:20.000000000","message":"This message should include the `db_info.capability_id` that was attempted to be loaded so it can be logged or maybe that should be logged. Not sure how this object is used yet.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"}],"trove/db/sqlalchemy/migrate_repo/versions/026_add_datastore_capabilities.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4e22bab0ee64b9aef3dd7269ace0ea6dca203df4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BSOM%3D","line":1,"updated":"2014-03-27 21:07:32.000000000","message":"please use same headers for all files","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"df011a16e7d35ce7f21d27ed7a513e3713755313","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9%2Bvw%3D","line":1,"in_reply_to":"AAAAWH%2F%2BSOM%3D","updated":"2014-03-31 19:47:40.000000000","message":"Fixing","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"4f3a5499a096668f58c59d4daf4778a769895b4c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":34,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":35,"context_line":"    Column(\u0027description\u0027, String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027enabled\u0027, Boolean())"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"datastore_version_capabilities \u003d Table("}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXX%2F%2F%2FTo%3D","line":36,"updated":"2014-04-24 20:05:59.000000000","message":"having enabled only on capabilities is not sufficient. this means a capability is either on or off for all datastores or none.\n\neither:\n\n(1) this enabled acts as a default, and an enabled column is added to datastore_version_capabilities below as a means of overriding the default.\n\n(2) enabled is moved from this table to datastore_version_capabilities. this approach has the downside of being forced to set the value for every single datastore-version, which if the # of versions is high, becomes a bit painful.","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"6d293b97cb317dcb470f6fc2035cb43fe5bca420","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":34,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":35,"context_line":"    Column(\u0027description\u0027, String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027enabled\u0027, Boolean())"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"datastore_version_capabilities \u003d Table("}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_d64e14c1","line":36,"in_reply_to":"AAAAXX%2F%2F%2FN4%3D","updated":"2014-05-01 17:32:00.000000000","message":"Done","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"6d293b97cb317dcb470f6fc2035cb43fe5bca420","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":34,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":35,"context_line":"    Column(\u0027description\u0027, String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027enabled\u0027, Boolean())"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"datastore_version_capabilities \u003d Table("}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_b6519064","line":36,"in_reply_to":"AAAAXX%2F%2F%2FTo%3D","updated":"2014-05-01 17:32:00.000000000","message":"Isn\u0027t 2) kind of how this works.  If a capability is enabled for a datastore version it has a row in datastore_version_capabilites.  This means that it is enabled for that version.  Are you wanting an overarching \"for all datastores this is set to X unless there is an override in datastore_version_capabilities?","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"fe8470b50abe176cbac15fd6c50aa2d821589711","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":34,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":35,"context_line":"    Column(\u0027description\u0027, String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027enabled\u0027, Boolean())"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"datastore_version_capabilities \u003d Table("}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXX%2F%2F%2FN4%3D","line":36,"in_reply_to":"AAAAXX%2F%2F%2FTo%3D","updated":"2014-04-24 20:12:59.000000000","message":"also, should have an \u0027updated\u0027 column.","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"4f3a5499a096668f58c59d4daf4778a769895b4c","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    Column(\u0027enabled\u0027, Boolean())"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"datastore_version_capabilities \u003d Table("},{"line_number":40,"context_line":"    \u0027datastore_version_capabilities\u0027,"},{"line_number":41,"context_line":"    meta,"},{"line_number":42,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXX%2F%2F%2FSg%3D","line":39,"updated":"2014-04-24 20:05:59.000000000","message":"the naming of this table isn\u0027t desirable because in the future the capability might be tied to a higher or lower-level construct than the datastore-version.\n\ni\u0027d recommend: capabilities_enabled.\n\nother options: (a) capabilities_supported (don\u0027t like this as much, because by existing in the capabilities table it\u0027s obviously supported for *some* datastore)","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"6d293b97cb317dcb470f6fc2035cb43fe5bca420","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    Column(\u0027enabled\u0027, Boolean())"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"datastore_version_capabilities \u003d Table("},{"line_number":40,"context_line":"    \u0027datastore_version_capabilities\u0027,"},{"line_number":41,"context_line":"    meta,"},{"line_number":42,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_56d204d3","line":39,"in_reply_to":"AAAAXX%2F%2F%2FNs%3D","updated":"2014-05-01 17:32:00.000000000","message":"Done","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"6d293b97cb317dcb470f6fc2035cb43fe5bca420","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    Column(\u0027enabled\u0027, Boolean())"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"datastore_version_capabilities \u003d Table("},{"line_number":40,"context_line":"    \u0027datastore_version_capabilities\u0027,"},{"line_number":41,"context_line":"    meta,"},{"line_number":42,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_36cd8032","line":39,"in_reply_to":"AAAAXX%2F%2F%2FSg%3D","updated":"2014-05-01 17:32:00.000000000","message":"Done","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"fe8470b50abe176cbac15fd6c50aa2d821589711","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    Column(\u0027enabled\u0027, Boolean())"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"datastore_version_capabilities \u003d Table("},{"line_number":40,"context_line":"    \u0027datastore_version_capabilities\u0027,"},{"line_number":41,"context_line":"    meta,"},{"line_number":42,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXX%2F%2F%2FNs%3D","line":39,"in_reply_to":"AAAAXX%2F%2F%2FSg%3D","updated":"2014-04-24 20:12:59.000000000","message":"also, should have an \u0027updated\u0027 column.","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"fe8470b50abe176cbac15fd6c50aa2d821589711","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    \u0027datastore_version_capabilities\u0027,"},{"line_number":41,"context_line":"    meta,"},{"line_number":42,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":43,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36)),"},{"line_number":44,"context_line":"    Column(\u0027capability_id\u0027, String(36), ForeignKey(\u0027capabilities.id\u0027)),"},{"line_number":45,"context_line":"    UniqueConstraint(\u0027datastore_version_id\u0027, \u0027capability_id\u0027,"},{"line_number":46,"context_line":"                     name\u003d\u0027ds_capabilities\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXX%2F%2F%2FM8%3D","line":43,"updated":"2014-04-24 20:12:59.000000000","message":"datastore_version_id should have ForeignKey defined here.","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"6d293b97cb317dcb470f6fc2035cb43fe5bca420","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    \u0027datastore_version_capabilities\u0027,"},{"line_number":41,"context_line":"    meta,"},{"line_number":42,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":43,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36)),"},{"line_number":44,"context_line":"    Column(\u0027capability_id\u0027, String(36), ForeignKey(\u0027capabilities.id\u0027)),"},{"line_number":45,"context_line":"    UniqueConstraint(\u0027datastore_version_id\u0027, \u0027capability_id\u0027,"},{"line_number":46,"context_line":"                     name\u003d\u0027ds_capabilities\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_76d708c2","line":43,"in_reply_to":"AAAAXX%2F%2F%2FM8%3D","updated":"2014-05-01 17:32:00.000000000","message":"Done","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"dfd1b949a351817ca41d5e2ca9b62c847066528e","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36)),"},{"line_number":44,"context_line":"    Column(\u0027capability_id\u0027, String(36), ForeignKey(\u0027capabilities.id\u0027)),"},{"line_number":45,"context_line":"    UniqueConstraint(\u0027datastore_version_id\u0027, \u0027capability_id\u0027,"},{"line_number":46,"context_line":"                     name\u003d\u0027ds_capabilities\u0027)"},{"line_number":47,"context_line":")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FQDQ%3D","line":46,"updated":"2014-04-15 19:20:19.000000000","message":"i\u0027d suggest to write the full name for the uniq constrait","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"6d293b97cb317dcb470f6fc2035cb43fe5bca420","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36)),"},{"line_number":44,"context_line":"    Column(\u0027capability_id\u0027, String(36), ForeignKey(\u0027capabilities.id\u0027)),"},{"line_number":45,"context_line":"    UniqueConstraint(\u0027datastore_version_id\u0027, \u0027capability_id\u0027,"},{"line_number":46,"context_line":"                     name\u003d\u0027ds_capabilities\u0027)"},{"line_number":47,"context_line":")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9ad9bd40_96dbacec","line":46,"in_reply_to":"AAAAW3%2F%2FQDQ%3D","updated":"2014-05-01 17:32:00.000000000","message":"Done","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":35,"context_line":"    Column(\u0027description\u0027, String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"    Column(\u0027enabled\u0027, Boolean()),"},{"line_number":37,"context_line":"    Column(\u0027updated\u0027, DateTime())"},{"line_number":38,"context_line":")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_2aee14b5","line":37,"updated":"2014-05-21 02:46:20.000000000","message":"This field looks like is never used and will be left null.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":46,"context_line":"           ForeignKey(\u0027datastore_versions.id\u0027)),"},{"line_number":47,"context_line":"    Column(\u0027capability_id\u0027, String(36), ForeignKey(\u0027capabilities.id\u0027)),"},{"line_number":48,"context_line":"    Column(\u0027enabled\u0027, Boolean()),"},{"line_number":49,"context_line":"    Column(\u0027updated\u0027, DateTime()),"},{"line_number":50,"context_line":"    UniqueConstraint(\u0027datastore_version_id\u0027, \u0027capability_id\u0027,"},{"line_number":51,"context_line":"                     name\u003d\u0027idx_datastore_capabilities_enabled\u0027)"},{"line_number":52,"context_line":")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_8a34884b","line":49,"updated":"2014-05-21 02:46:20.000000000","message":"This field looks like is never used and will be left null.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"}],"trove/db/sqlalchemy/migrate_repo/versions/027_add_datastore_capabilities.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"c42eec4ff878b6f90e1b8148de1df3ed64f8f67d","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    meta,"},{"line_number":32,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":33,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":34,"context_line":"    Column(\u0027description\u0027, String(255), nullable\u003dFalse),"},{"line_number":35,"context_line":"    Column(\u0027enabled\u0027, Boolean())"},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_eda9517c","line":34,"updated":"2014-05-29 13:02:18.000000000","message":"Why description cannot be nullable ?\nI guess we need to do what we did with backups","commit_id":"3b47be604a58dd0ce983a25421879d21580c88e6"},{"author":{"_account_id":9746,"name":"Doug Shelley","email":"dougshelley66@gmail.com","username":"dougshelley"},"change_message_id":"a852c4a0e01c4de6804f1c3749f88a9133207b13","unresolved":false,"context_lines":[{"line_number":39,"context_line":"capability_overrides \u003d Table("},{"line_number":40,"context_line":"    \u0027capability_overrides\u0027,"},{"line_number":41,"context_line":"    meta,"},{"line_number":42,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":43,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36),"},{"line_number":44,"context_line":"           ForeignKey(\u0027datastore_versions.id\u0027)),"},{"line_number":45,"context_line":"    Column(\u0027capability_id\u0027, String(36), ForeignKey(\u0027capabilities.id\u0027)),"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_4d0ec58e","line":42,"updated":"2014-05-29 13:27:20.000000000","message":"Is this ID column required? (Is there a requirement that all tables have a UUID?)","commit_id":"3b47be604a58dd0ce983a25421879d21580c88e6"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"be2db9b907d1fe975163ffd30cadf952bd55f0d1","unresolved":false,"context_lines":[{"line_number":39,"context_line":"capability_overrides \u003d Table("},{"line_number":40,"context_line":"    \u0027capability_overrides\u0027,"},{"line_number":41,"context_line":"    meta,"},{"line_number":42,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":43,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36),"},{"line_number":44,"context_line":"           ForeignKey(\u0027datastore_versions.id\u0027)),"},{"line_number":45,"context_line":"    Column(\u0027capability_id\u0027, String(36), ForeignKey(\u0027capabilities.id\u0027)),"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_a41bdb19","line":42,"in_reply_to":"3ae8d1ca_4d0ec58e","updated":"2014-05-29 16:12:17.000000000","message":"I believe I was told to add the ID field at some point, but I don\u0027t remember why. I can take it out if there is consensus, or leave it if no one strongly objects.","commit_id":"3b47be604a58dd0ce983a25421879d21580c88e6"},{"author":{"_account_id":9746,"name":"Doug Shelley","email":"dougshelley66@gmail.com","username":"dougshelley"},"change_message_id":"a852c4a0e01c4de6804f1c3749f88a9133207b13","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36),"},{"line_number":44,"context_line":"           ForeignKey(\u0027datastore_versions.id\u0027)),"},{"line_number":45,"context_line":"    Column(\u0027capability_id\u0027, String(36), ForeignKey(\u0027capabilities.id\u0027)),"},{"line_number":46,"context_line":"    Column(\u0027enabled\u0027, Boolean()),"},{"line_number":47,"context_line":"    UniqueConstraint(\u0027datastore_version_id\u0027, \u0027capability_id\u0027,"},{"line_number":48,"context_line":"                     name\u003d\u0027idx_datastore_capabilities_enabled\u0027)"},{"line_number":49,"context_line":")"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_6d3aa137","line":46,"updated":"2014-05-29 13:27:20.000000000","message":"Can you update the spec to reflect the addition of this column?","commit_id":"3b47be604a58dd0ce983a25421879d21580c88e6"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"be2db9b907d1fe975163ffd30cadf952bd55f0d1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36),"},{"line_number":44,"context_line":"           ForeignKey(\u0027datastore_versions.id\u0027)),"},{"line_number":45,"context_line":"    Column(\u0027capability_id\u0027, String(36), ForeignKey(\u0027capabilities.id\u0027)),"},{"line_number":46,"context_line":"    Column(\u0027enabled\u0027, Boolean()),"},{"line_number":47,"context_line":"    UniqueConstraint(\u0027datastore_version_id\u0027, \u0027capability_id\u0027,"},{"line_number":48,"context_line":"                     name\u003d\u0027idx_datastore_capabilities_enabled\u0027)"},{"line_number":49,"context_line":")"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_44e21704","line":46,"in_reply_to":"3ae8d1ca_6d3aa137","updated":"2014-05-29 16:12:17.000000000","message":"Updated wiki spec","commit_id":"3b47be604a58dd0ce983a25421879d21580c88e6"}],"trove/tests/unittests/datastore/base.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4e22bab0ee64b9aef3dd7269ace0ea6dca203df4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 Rackspace Hosting"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BSOI%3D","line":1,"updated":"2014-03-27 21:07:32.000000000","message":"please use same headers for all files","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"df011a16e7d35ce7f21d27ed7a513e3713755313","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 Rackspace Hosting"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9%2Bvo%3D","line":1,"in_reply_to":"AAAAWH%2F%2BSOI%3D","updated":"2014-03-31 19:47:40.000000000","message":"Fixing","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"dfd1b949a351817ca41d5e2ca9b62c847066528e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"class TestDatastoreBase(testtools.TestCase):"},{"line_number":21,"context_line":"    def setUp(self):"},{"line_number":22,"context_line":"        # Basic setup and mock/fake structures for testing only"},{"line_number":23,"context_line":"        super(TestDatastoreBase, self).setUp()"},{"line_number":24,"context_line":"        util.init_db()"},{"line_number":25,"context_line":"        self.test_id \u003d str(uuid.uuid4())"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FQCg%3D","line":23,"updated":"2014-04-15 19:20:19.000000000","message":"i think its redundant, because this class contains too easy logic, so, no need to add it, please move it to the next file","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"282c81abdd6ba73be7fd226a154952baa8fac3cd","unresolved":false,"context_lines":[{"line_number":20,"context_line":"class TestDatastoreBase(testtools.TestCase):"},{"line_number":21,"context_line":"    def setUp(self):"},{"line_number":22,"context_line":"        # Basic setup and mock/fake structures for testing only"},{"line_number":23,"context_line":"        super(TestDatastoreBase, self).setUp()"},{"line_number":24,"context_line":"        util.init_db()"},{"line_number":25,"context_line":"        self.test_id \u003d str(uuid.uuid4())"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXH%2F%2FSYs%3D","line":23,"in_reply_to":"AAAAW3%2F%2FQCg%3D","updated":"2014-04-22 18:25:21.000000000","message":"I disagree, this is good reuse of code.  All 3 test files for this feature use this code.  Sure it\u0027s only a couple but I feel it\u0027s more logical to keep this all in one place.","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"d7d41e83f5c114646ed3d8af81cfcf9f21cc3430","unresolved":false,"context_lines":[{"line_number":20,"context_line":"class TestDatastoreBase(testtools.TestCase):"},{"line_number":21,"context_line":"    def setUp(self):"},{"line_number":22,"context_line":"        # Basic setup and mock/fake structures for testing only"},{"line_number":23,"context_line":"        super(TestDatastoreBase, self).setUp()"},{"line_number":24,"context_line":"        util.init_db()"},{"line_number":25,"context_line":"        self.test_id \u003d str(uuid.uuid4())"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXH%2F%2F3pU%3D","line":23,"in_reply_to":"AAAAW3%2F%2FQCg%3D","updated":"2014-04-16 19:46:59.000000000","message":"This class abstracts the init_db and test_id setup stuff that is used in 3 places. I see no reason we should duplicate this into those 3 files.","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":6268,"name":"Robert Myers","email":"myer0052@gmail.com","username":"rmyers"},"change_message_id":"e22765f4dd4cc20565ac50f8dd168915bbfb9d75","unresolved":false,"context_lines":[{"line_number":20,"context_line":"class TestDatastoreBase(testtools.TestCase):"},{"line_number":21,"context_line":"    def setUp(self):"},{"line_number":22,"context_line":"        # Basic setup and mock/fake structures for testing only"},{"line_number":23,"context_line":"        super(TestDatastoreBase, self).setUp()"},{"line_number":24,"context_line":"        util.init_db()"},{"line_number":25,"context_line":"        self.test_id \u003d str(uuid.uuid4())"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXH%2F%2FIag%3D","line":23,"in_reply_to":"AAAAXH%2F%2FSYs%3D","updated":"2014-04-23 19:38:53.000000000","message":"I also like seeing base test classes instead of copying the logic everywhere. We should have a TroveTestBase as well, but that is for a different BP.","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"7adec928_2a1c54c1","updated":"2014-05-21 02:46:20.000000000","message":"I think separating the classes would have been better in the same file so references are easier to follow from the this base class because its only used in the other 3 small child classes. Its not a big deal but just think looking at the other classes its hard to reference what the variables are that get setup here.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"0ad3536c01116a88d936b65a92c05f3dcd591aed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"7adec928_ecf7e9d2","in_reply_to":"7adec928_2a1c54c1","updated":"2014-05-21 03:03:15.000000000","message":"After reading the older reviews i see why you did this.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.cap2 \u003d Capability.create(\"require_volume\" + self.rand_id,"},{"line_number":51,"context_line":"                                      \"Require external volume\", True)"},{"line_number":52,"context_line":"        self.cap3 \u003d Capability.create(\"test_capability\" + self.rand_id,"},{"line_number":53,"context_line":"                                      \"Test capability\", True)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def tearDown(self):"},{"line_number":56,"context_line":"        super(TestDatastoreBase, self).tearDown()"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_aad5c4ba","line":53,"updated":"2014-05-21 02:46:20.000000000","message":"i think one of these should be set to False in the base case.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        self.cap1.delete()"},{"line_number":64,"context_line":"        self.cap2.delete()"},{"line_number":65,"context_line":"        self.cap3.delete()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def capability_name_filter(self, capabilities):"},{"line_number":68,"context_line":"        new_capabilities \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_4a49a08d","line":65,"updated":"2014-05-21 02:46:20.000000000","message":"I think this tearDown should take care of cleaning up the datastore and datastore version since you have created them in this class not the child classes.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"}],"trove/tests/unittests/datastore/test_capability.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4e22bab0ee64b9aef3dd7269ace0ea6dca203df4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Rackspace"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BSOU%3D","line":1,"updated":"2014-03-27 21:07:32.000000000","message":"please use same headers for all files","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"df011a16e7d35ce7f21d27ed7a513e3713755313","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Rackspace"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9%2Bvc%3D","line":1,"in_reply_to":"AAAAWH%2F%2BSOU%3D","updated":"2014-03-31 19:47:40.000000000","message":"Fixing","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"dfd1b949a351817ca41d5e2ca9b62c847066528e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":16,"context_line":"from trove.datastore.models import Capability"},{"line_number":17,"context_line":"from trove.common.exception import CapabilityNotFound"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FQCE%3D","line":15,"updated":"2014-04-15 19:20:19.000000000","message":"redundant class","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"282c81abdd6ba73be7fd226a154952baa8fac3cd","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":16,"context_line":"from trove.datastore.models import Capability"},{"line_number":17,"context_line":"from trove.common.exception import CapabilityNotFound"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXH%2F%2FSYg%3D","line":15,"in_reply_to":"AAAAW3%2F%2FQCE%3D","updated":"2014-04-22 18:25:21.000000000","message":"Disagree","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_capability(self):"},{"line_number":29,"context_line":"        self.assertEqual(Capability.load(self.capability_name).name,"},{"line_number":30,"context_line":"                         self.capability_name)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def test_ds_capability_create_disabled(self):"},{"line_number":33,"context_line":"        self.ds_cap \u003d CapabilityOverride.create("}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_2ae1b49a","line":30,"updated":"2014-05-21 02:46:20.000000000","message":"Should test also the other fields here \u0027description\u0027, \u0027enabled\u0027, and \u0027datastore_version\u0027 since you have them.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def test_ds_capability_create_disabled(self):"},{"line_number":33,"context_line":"        self.ds_cap \u003d CapabilityOverride.create("},{"line_number":34,"context_line":"            self.cap1, self.datastore_version.id, enabled\u003dFalse)"},{"line_number":35,"context_line":"        self.assertFalse(self.ds_cap.enabled)"},{"line_number":36,"context_line":"        self.ds_cap.delete()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def test_capability_enabled(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_6af2dc70","line":35,"updated":"2014-05-21 02:46:20.000000000","message":"What about loading the capability override you created to verify that its cascading the load correctly.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def test_capability_disabled(self):"},{"line_number":42,"context_line":"        capability \u003d Capability.load(self.capability_name)"},{"line_number":43,"context_line":"        capability.disable()"},{"line_number":44,"context_line":"        self.assertFalse(capability.enabled)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        self.assertFalse(Capability.load(self.capability_name).enabled)"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_ca005038","line":44,"updated":"2014-05-21 02:46:20.000000000","message":"I think you should reload the capability to verify this test as well as this assert.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"},{"author":{"_account_id":9746,"name":"Doug Shelley","email":"dougshelley66@gmail.com","username":"dougshelley"},"change_message_id":"a852c4a0e01c4de6804f1c3749f88a9133207b13","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        self.assertFalse(Capability.load(self.capability_name).enabled)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_load_nonexistant_capability(self):"},{"line_number":52,"context_line":"        self.assertRaises(CapabilityNotFound, Capability.load, \"non-existant\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_9f1b901a","line":51,"updated":"2014-05-29 13:27:20.000000000","message":"minor nit - spelling - nonexistEnt","commit_id":"3b47be604a58dd0ce983a25421879d21580c88e6"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"be2db9b907d1fe975163ffd30cadf952bd55f0d1","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        self.assertFalse(Capability.load(self.capability_name).enabled)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_load_nonexistant_capability(self):"},{"line_number":52,"context_line":"        self.assertRaises(CapabilityNotFound, Capability.load, \"non-existant\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_a4c91b7a","line":51,"in_reply_to":"3ae8d1ca_9f1b901a","updated":"2014-05-29 16:12:17.000000000","message":"All 3 instances of nonexistant are now nonexistent :)","commit_id":"3b47be604a58dd0ce983a25421879d21580c88e6"},{"author":{"_account_id":9746,"name":"Doug Shelley","email":"dougshelley66@gmail.com","username":"dougshelley"},"change_message_id":"a852c4a0e01c4de6804f1c3749f88a9133207b13","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.assertFalse(Capability.load(self.capability_name).enabled)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_load_nonexistant_capability(self):"},{"line_number":52,"context_line":"        self.assertRaises(CapabilityNotFound, Capability.load, \"non-existant\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_3fe27c03","line":52,"updated":"2014-05-29 13:27:20.000000000","message":"non-existEnt","commit_id":"3b47be604a58dd0ce983a25421879d21580c88e6"}],"trove/tests/unittests/datastore/test_datastore.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4e22bab0ee64b9aef3dd7269ace0ea6dca203df4","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from trove.datastore.models import Datastore, Capability"},{"line_number":17,"context_line":"from trove.datastore.models import get_datastore_version, update_datastore"},{"line_number":18,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":19,"context_line":"from trove.common.exception import DatastoreDefaultDatastoreNotFound"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2BSTM%3D","line":17,"updated":"2014-03-27 21:07:32.000000000","message":"wrong import format","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"df011a16e7d35ce7f21d27ed7a513e3713755313","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from trove.datastore.models import Datastore, Capability"},{"line_number":17,"context_line":"from trove.datastore.models import get_datastore_version, update_datastore"},{"line_number":18,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":19,"context_line":"from trove.common.exception import DatastoreDefaultDatastoreNotFound"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9%2BuU%3D","line":17,"in_reply_to":"AAAAWH%2F%2BSTM%3D","updated":"2014-03-31 19:47:40.000000000","message":"As far as I know, this is the only pep8 compliant way to solve this. Can you suggest another way to do this?","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"8dc8de59bf6a609c1243e23b194b62001ca7862a","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from trove.datastore.models import Datastore, Capability"},{"line_number":17,"context_line":"from trove.datastore.models import get_datastore_version, update_datastore"},{"line_number":18,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":19,"context_line":"from trove.common.exception import DatastoreDefaultDatastoreNotFound"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F9%2Bis%3D","line":17,"in_reply_to":"AAAAWH%2F9%2BuU%3D","updated":"2014-03-31 19:54:20.000000000","message":"from trove.datastore import models as dstore_models","commit_id":"64e61fb0361f179bd11f86ea7bf65c20582901ce"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"8ad0eecc7f5b43911a4f1989332acad9e1ed13b2","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from trove.datastore import models as datastore_models"},{"line_number":17,"context_line":"from trove.datastore.models import Datastore, Capability"},{"line_number":18,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":19,"context_line":"from trove.common.exception import DatastoreDefaultDatastoreNotFound"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9lYg%3D","line":17,"updated":"2014-04-03 14:47:29.000000000","message":"wrong import format, please do it correctly:\n\nfrom trove.datastore import models as dstore_models\n\nand then use any attribute from any needed object","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"37a138943b710cd06eb290b341bfa365dc6580be","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from trove.datastore import models as datastore_models"},{"line_number":17,"context_line":"from trove.datastore.models import Datastore, Capability"},{"line_number":18,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":19,"context_line":"from trove.common.exception import DatastoreDefaultDatastoreNotFound"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F9jQ8%3D","line":17,"in_reply_to":"AAAAWH%2F9lYg%3D","updated":"2014-04-07 18:54:43.000000000","message":"Fixed to be single import per line.","commit_id":"78f59d551e8c2a76860d13f956e53c8cf5aac835"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"dfd1b949a351817ca41d5e2ca9b62c847066528e","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from trove.datastore import models as datastore_models"},{"line_number":17,"context_line":"from trove.datastore.models import Datastore"},{"line_number":18,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":19,"context_line":"from trove.common import exception"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FQBY%3D","line":18,"updated":"2014-04-15 19:20:19.000000000","message":"redundant class, it contains to few logic in it","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"282c81abdd6ba73be7fd226a154952baa8fac3cd","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from trove.datastore import models as datastore_models"},{"line_number":17,"context_line":"from trove.datastore.models import Datastore"},{"line_number":18,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":19,"context_line":"from trove.common import exception"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXH%2F%2FSYY%3D","line":18,"in_reply_to":"AAAAW3%2F%2FQBY%3D","updated":"2014-04-22 18:25:21.000000000","message":"Disagree","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_load_datastore(self):"},{"line_number":40,"context_line":"        datastore \u003d Datastore.load(self.ds_name)"},{"line_number":41,"context_line":"        self.assertEqual(datastore.name, self.ds_name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_2a545420","line":41,"updated":"2014-05-21 02:46:20.000000000","message":"thanks for adding some basic datastore unit tests. :)","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"}],"trove/tests/unittests/datastore/test_datastore_versions.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"dfd1b949a351817ca41d5e2ca9b62c847066528e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from trove.datastore.models import Datastore"},{"line_number":18,"context_line":"from trove.datastore.models import Capability"},{"line_number":19,"context_line":"from trove.datastore.models import DatastoreVersion"},{"line_number":20,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":21,"context_line":"from trove.common import exception"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FQBQ%3D","line":20,"updated":"2014-04-15 19:20:19.000000000","message":"redundant class, it contains to few logic","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":971,"name":"Daniel Salinas","email":"imsplitbit@gmail.com","username":"imsplitbit"},"change_message_id":"282c81abdd6ba73be7fd226a154952baa8fac3cd","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from trove.datastore.models import Datastore"},{"line_number":18,"context_line":"from trove.datastore.models import Capability"},{"line_number":19,"context_line":"from trove.datastore.models import DatastoreVersion"},{"line_number":20,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":21,"context_line":"from trove.common import exception"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXH%2F%2FSYI%3D","line":20,"in_reply_to":"AAAAW3%2F%2FQBQ%3D","updated":"2014-04-22 18:25:21.000000000","message":"Disagree","commit_id":"958f4df27562fe9deb0cf88813a1293d9eecf3e6"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from trove.tests.unittests.datastore.base import TestDatastoreBase"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TestDatastore(TestDatastoreBase):"},{"line_number":22,"context_line":"    def setUp(self):"},{"line_number":23,"context_line":"        super(TestDatastore, self).setUp()"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_6ac01ce1","line":21,"updated":"2014-05-21 02:46:20.000000000","message":"Chang this class name to `TestDatastoreVersions`","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def tearDown(self):"},{"line_number":26,"context_line":"        super(TestDatastore, self).tearDown()"},{"line_number":27,"context_line":"        Datastore.load(self.ds_name).delete()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def test_load_datastore_version(self):"},{"line_number":30,"context_line":"        datastore_version \u003d DatastoreVersion.load(self.datastore,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_aa486488","line":27,"updated":"2014-05-21 02:46:20.000000000","message":"this should be deleted in the base class.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def test_load_datastore_version(self):"},{"line_number":30,"context_line":"        datastore_version \u003d DatastoreVersion.load(self.datastore,"},{"line_number":31,"context_line":"                                                  self.ds_version)"},{"line_number":32,"context_line":"        self.assertEqual(datastore_version.name, self.ds_version)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_datastore_verison_capabilities(self):"},{"line_number":35,"context_line":"        self.datastore_version.capabilities.add(self.cap1, enabled\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_0a579827","line":32,"updated":"2014-05-21 02:46:20.000000000","message":"thanks for adding some basic datastore version unit tests. :)","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"37dfcea11270a57747bb7094e47c258948195939","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.assertEqual(datastore_version.name, self.ds_version)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_datastore_verison_capabilities(self):"},{"line_number":35,"context_line":"        self.datastore_version.capabilities.add(self.cap1, enabled\u003dFalse)"},{"line_number":36,"context_line":"        test_filtered_capabilities \u003d self.capability_name_filter("},{"line_number":37,"context_line":"            self.datastore_version.capabilities)"},{"line_number":38,"context_line":"        self.assertEqual(len(test_filtered_capabilities), 3,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_2c3391f7","line":35,"updated":"2014-05-21 02:46:20.000000000","message":"can you add a check to make sure the capabilities that are loaded for the datastore are set to (dis|en)abled here as well to verify the overrides.","commit_id":"3f1c5210e030a218c663d7e34b259d0393a0a0ee"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"c42eec4ff878b6f90e1b8148de1df3ed64f8f67d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Rackspace"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_adf4a987","line":1,"updated":"2014-05-29 13:02:18.000000000","message":"Please use same headers","commit_id":"3b47be604a58dd0ce983a25421879d21580c88e6"},{"author":{"_account_id":9956,"name":"Kaleb Pomeroy","email":"kaleb.pomeroy@rackspace.com","username":"kpom"},"change_message_id":"be2db9b907d1fe975163ffd30cadf952bd55f0d1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Rackspace"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_449e9757","line":1,"in_reply_to":"3ae8d1ca_adf4a987","updated":"2014-05-29 16:12:17.000000000","message":"Fixed header line.","commit_id":"3b47be604a58dd0ce983a25421879d21580c88e6"},{"author":{"_account_id":9746,"name":"Doug Shelley","email":"dougshelley66@gmail.com","username":"dougshelley"},"change_message_id":"a852c4a0e01c4de6804f1c3749f88a9133207b13","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                          test_filtered_capabilities))"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self.assertIn(self.cap2.name, self.datastore_version.capabilities)"},{"line_number":49,"context_line":"        self.assertNotIn(\"non-existant\", self.datastore_version.capabilities)"},{"line_number":50,"context_line":"        self.assertIn(self.cap1.name, self.datastore_version.capabilities)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_9fc9d07a","line":49,"updated":"2014-05-29 13:27:20.000000000","message":"minor spelling nit - non-existEnt","commit_id":"3b47be604a58dd0ce983a25421879d21580c88e6"}]}
