)]}'
{"keystoneauth1/discover.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"be5da64a8ae44a939361b615c27bc0529c2d39e1","unresolved":false,"context_lines":[{"line_number":740,"context_line":"        return \"%s{%s}\" % (self.__class__.__name__, \u0027, \u0027.join("},{"line_number":741,"context_line":"            [\"%s\u003d%s\" % (attr, getattr(self, attr))"},{"line_number":742,"context_line":"             for attr in dir(self) if not attr.startswith(\u0027_\u0027) and"},{"line_number":743,"context_line":"             not callable(getattr(self, attr))]))"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"    @property"},{"line_number":746,"context_line":"    def url(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"df3967d1_d792869f","line":743,"updated":"2017-08-01 13:41:59.000000000","message":"How about just\n\n \"%s{%s}\" % (self.__class__.__name__, \u0027, \u0027.join([\"%s\u003d%s\" % (k,v) for k,v in vars(self).items() if not k.startswith(\u0027_\u0027)]))\n\n?","commit_id":"ad4d1377359a171a83e1ae4edc7924e76fdab301"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"e30a5c4c34aca15a5c743d8dc9e15fbe8994f523","unresolved":false,"context_lines":[{"line_number":740,"context_line":"        return \"%s{%s}\" % (self.__class__.__name__, \u0027, \u0027.join("},{"line_number":741,"context_line":"            [\"%s\u003d%s\" % (attr, getattr(self, attr))"},{"line_number":742,"context_line":"             for attr in dir(self) if not attr.startswith(\u0027_\u0027) and"},{"line_number":743,"context_line":"             not callable(getattr(self, attr))]))"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"    @property"},{"line_number":746,"context_line":"    def url(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_ad3b1ac6","line":743,"in_reply_to":"9f436f4f_ce6b5683","updated":"2017-10-06 14:26:56.000000000","message":"+++","commit_id":"ad4d1377359a171a83e1ae4edc7924e76fdab301"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"afb4a25d506bc3c2bf38b4ffc804a284a08ecbe6","unresolved":false,"context_lines":[{"line_number":740,"context_line":"        return \"%s{%s}\" % (self.__class__.__name__, \u0027, \u0027.join("},{"line_number":741,"context_line":"            [\"%s\u003d%s\" % (attr, getattr(self, attr))"},{"line_number":742,"context_line":"             for attr in dir(self) if not attr.startswith(\u0027_\u0027) and"},{"line_number":743,"context_line":"             not callable(getattr(self, attr))]))"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"    @property"},{"line_number":746,"context_line":"    def url(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f436f4f_ce6b5683","line":743,"in_reply_to":"df3967d1_5d2eb5fa","updated":"2017-08-17 18:51:10.000000000","message":"I\u0027m going to stay stop trying to be too clever here. Inspect each attribute you want explicitly and add it to the list to be joined. This is not really readable and based on Eric\u0027s comments, not meeting the needs.\n\nTL;DR write the code out long-hand and don\u0027t guess if a property or callable (e.g. @property) is what you want to include.","commit_id":"ad4d1377359a171a83e1ae4edc7924e76fdab301"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"abc9e3c410280a5bf2f762c4f8f2976e8fcdf5f2","unresolved":false,"context_lines":[{"line_number":740,"context_line":"        return \"%s{%s}\" % (self.__class__.__name__, \u0027, \u0027.join("},{"line_number":741,"context_line":"            [\"%s\u003d%s\" % (attr, getattr(self, attr))"},{"line_number":742,"context_line":"             for attr in dir(self) if not attr.startswith(\u0027_\u0027) and"},{"line_number":743,"context_line":"             not callable(getattr(self, attr))]))"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"    @property"},{"line_number":746,"context_line":"    def url(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"df3967d1_5d2eb5fa","line":743,"in_reply_to":"df3967d1_d792869f","updated":"2017-08-01 15:00:42.000000000","message":"I knew someone would come up with a better way.\n\nI had tried to use self.__dict__, but ran afoul of a hacking rule.  I forgot / didn\u0027t know that vars *is* the official way to get at __dict__.\n\nProblem #1: Then I\u0027ve got to sort the result (or I can\u0027t test it).  Not a big deal, but probably lose any efficiency I would have gained by getting rid of callable().\n\nProblem #2: I don\u0027t get @property members.  As written, `url` is included in the result; using vars(), it ain\u0027t.  And `url` is arguably the \"attribute\" we care most about.\n\nSo given that, what say you?","commit_id":"ad4d1377359a171a83e1ae4edc7924e76fdab301"}],"keystoneauth1/tests/unit/test_discovery.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9f1313f90b47ca88682cddf8e7ceba4b26724768","unresolved":false,"context_lines":[{"line_number":956,"context_line":"        epd \u003d discover.EndpointData(catalog_url\u003d\u0027abc\u0027, service_type\u003d\u0027123\u0027,"},{"line_number":957,"context_line":"                                    api_version\u003d(2, 3))"},{"line_number":958,"context_line":"        exp \u003d ("},{"line_number":959,"context_line":"            \u0027EndpointData{api_version\u003d(2, 3), catalog_url\u003dabc,\u0027"},{"line_number":960,"context_line":"            \u0027 endpoint_id\u003dNone, interface\u003dNone, major_version\u003dNone,\u0027"},{"line_number":961,"context_line":"            \u0027 max_microversion\u003dNone, min_microversion\u003dNone,\u0027"},{"line_number":962,"context_line":"            \u0027 next_min_version\u003dNone, not_before\u003dNone, raw_endpoint\u003dNone,\u0027"},{"line_number":963,"context_line":"            \u0027 region_name\u003dNone, service_id\u003dNone, service_name\u003dNone,\u0027"},{"line_number":964,"context_line":"            \u0027 service_type\u003d123, service_url\u003dNone, url\u003dabc}\u0027)"},{"line_number":965,"context_line":"        # Works with str()"},{"line_number":966,"context_line":"        self.assertEqual(exp, str(epd))"},{"line_number":967,"context_line":"        # Works with implicit stringification"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f4e5783_22463c23","line":964,"range":{"start_line":959,"start_character":0,"end_line":964,"end_character":60},"updated":"2017-10-11 19:17:49.000000000","message":"Minor suggestion: make this based upon a shared data set from the object (so the str attrs would be referenced) this eliminates needing to update there *and* in the test.","commit_id":"5ac9cde5918e6e440a9fff92306b6a1df1f3040c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"0773a49f43e787038d9e787a52d4a70b23cd6696","unresolved":false,"context_lines":[{"line_number":956,"context_line":"        epd \u003d discover.EndpointData(catalog_url\u003d\u0027abc\u0027, service_type\u003d\u0027123\u0027,"},{"line_number":957,"context_line":"                                    api_version\u003d(2, 3))"},{"line_number":958,"context_line":"        exp \u003d ("},{"line_number":959,"context_line":"            \u0027EndpointData{api_version\u003d(2, 3), catalog_url\u003dabc,\u0027"},{"line_number":960,"context_line":"            \u0027 endpoint_id\u003dNone, interface\u003dNone, major_version\u003dNone,\u0027"},{"line_number":961,"context_line":"            \u0027 max_microversion\u003dNone, min_microversion\u003dNone,\u0027"},{"line_number":962,"context_line":"            \u0027 next_min_version\u003dNone, not_before\u003dNone, raw_endpoint\u003dNone,\u0027"},{"line_number":963,"context_line":"            \u0027 region_name\u003dNone, service_id\u003dNone, service_name\u003dNone,\u0027"},{"line_number":964,"context_line":"            \u0027 service_type\u003d123, service_url\u003dNone, url\u003dabc}\u0027)"},{"line_number":965,"context_line":"        # Works with str()"},{"line_number":966,"context_line":"        self.assertEqual(exp, str(epd))"},{"line_number":967,"context_line":"        # Works with implicit stringification"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f4e5783_56dd7d6e","line":964,"range":{"start_line":959,"start_character":0,"end_line":964,"end_character":60},"in_reply_to":"5f4e5783_02f100ce","updated":"2017-10-11 19:55:50.000000000","message":"I am fine as it is.","commit_id":"5ac9cde5918e6e440a9fff92306b6a1df1f3040c"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0badd0fc264270eb2e980313f5964a3f5da0d15c","unresolved":false,"context_lines":[{"line_number":956,"context_line":"        epd \u003d discover.EndpointData(catalog_url\u003d\u0027abc\u0027, service_type\u003d\u0027123\u0027,"},{"line_number":957,"context_line":"                                    api_version\u003d(2, 3))"},{"line_number":958,"context_line":"        exp \u003d ("},{"line_number":959,"context_line":"            \u0027EndpointData{api_version\u003d(2, 3), catalog_url\u003dabc,\u0027"},{"line_number":960,"context_line":"            \u0027 endpoint_id\u003dNone, interface\u003dNone, major_version\u003dNone,\u0027"},{"line_number":961,"context_line":"            \u0027 max_microversion\u003dNone, min_microversion\u003dNone,\u0027"},{"line_number":962,"context_line":"            \u0027 next_min_version\u003dNone, not_before\u003dNone, raw_endpoint\u003dNone,\u0027"},{"line_number":963,"context_line":"            \u0027 region_name\u003dNone, service_id\u003dNone, service_name\u003dNone,\u0027"},{"line_number":964,"context_line":"            \u0027 service_type\u003d123, service_url\u003dNone, url\u003dabc}\u0027)"},{"line_number":965,"context_line":"        # Works with str()"},{"line_number":966,"context_line":"        self.assertEqual(exp, str(epd))"},{"line_number":967,"context_line":"        # Works with implicit stringification"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f4e5783_02f100ce","line":964,"range":{"start_line":959,"start_character":0,"end_line":964,"end_character":60},"in_reply_to":"5f4e5783_22463c23","updated":"2017-10-11 19:24:12.000000000","message":"So like, pull str_attrs out of __str__ and put it in a class var; then iterate over it in the test and construct the \"expected\" string pretty much the same way as I\u0027m doing it in the __str__ method itself?\n\nKinda narrows the scope of what\u0027s really being tested, if I\u0027m understanding correctly.\n\nSeems like a pretty minor inconvenience to have to update both places on a future change.\n\nAnyone feel strongly either way?","commit_id":"5ac9cde5918e6e440a9fff92306b6a1df1f3040c"}]}
