)]}'
{"oslo_db/sqlalchemy/utils.py":[{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"42a412eeea25c690ed492c90896003daa9d7eb00","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    :return: unique model keys"},{"line_number":75,"context_line":"    \"\"\""},{"line_number":76,"context_line":"    try:"},{"line_number":77,"context_line":"        constraints \u003d model.__table__.constraints"},{"line_number":78,"context_line":"    except AttributeError:"},{"line_number":79,"context_line":"        constraints \u003d []"},{"line_number":80,"context_line":"    return [{c.name for c in constraint.columns}"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_a010885a","line":77,"updated":"2016-08-29 14:21:17.000000000","message":"you probably should filter for PrimaryKeyConstraint / UniqueConstraint here and also this wont get you Index(unique\u003dTrue) objects.","commit_id":"5fa96baa3d1c1dd3ce46781bc548cec25e3aea6c"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"1ee9f5a3686fd3586e1c6161d5fa100d5d73458d","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    except AttributeError:"},{"line_number":88,"context_line":"        indexes \u003d []"},{"line_number":89,"context_line":"    for index in indexes:"},{"line_number":90,"context_line":"        if index.unique:"},{"line_number":91,"context_line":"            yield {c.name for c in index.columns}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_14d408bb","line":90,"updated":"2016-08-29 18:08:22.000000000","message":"that\u0027s great","commit_id":"4d689d9a338bf1782dfea97b16309c7f4371e91a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"714cb1f9e10f22bd05afeedb2fb00ad8dfa9a541","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    except AttributeError:"},{"line_number":88,"context_line":"        indexes \u003d []"},{"line_number":89,"context_line":"    for index in indexes:"},{"line_number":90,"context_line":"        if index.unique:"},{"line_number":91,"context_line":"            yield {c.name for c in index.columns}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_f87bebbb","line":90,"in_reply_to":"fa7ab95a_14d408bb","updated":"2016-08-30 11:15:45.000000000","message":"Yeah, though not really documented.","commit_id":"4d689d9a338bf1782dfea97b16309c7f4371e91a"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"4295344781f888cd67b3b673243045d409252967","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    except AttributeError:"},{"line_number":88,"context_line":"        indexes \u003d []"},{"line_number":89,"context_line":"    for index in indexes:"},{"line_number":90,"context_line":"        if index.unique:"},{"line_number":91,"context_line":"            yield {c.name for c in index.columns}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_58c20cea","line":90,"in_reply_to":"fa7ab95a_f87bebbb","updated":"2016-08-30 13:37:02.000000000","message":"this is a Python thing.  If your object works like this:\n\n    class MyObject(object):\n       def __init__(self, some_public_attribute):\n          self.some_public_attribute \u003d some_public_attribute\n\nHow do you document that?   Basically, assuming Sphinx autogen, you have to take all of them and do something like this:\n\n    class MyObject(object):\n       some_public_attribute \u003d None\n       \"\"\"The public attribute.\"\"\"\n\n       def __init__(self, some_public_attribute):\n          self.some_public_attribute \u003d some_public_attribute\n\nThere is inertia to going throughout all of SQLAlchemy and doing this for all non-underscored attributes everywhere.  Because it is kind of a failure in the Sphinx approach (where for them, \"autodoc\" is just a nice-to-have anyway).   Namely that you have to change the structure/state of the class in order to document an attribute.","commit_id":"4d689d9a338bf1782dfea97b16309c7f4371e91a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"5e04d4343a359bea8a6b03efd6fa9fba204b8fbe","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            yield {c.name for c in index.columns}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def _unstable_sorting_order(model, sort_keys):"},{"line_number":95,"context_line":"    sort_keys_set \u003d set(sort_keys)"},{"line_number":96,"context_line":"    for unique_keys in get_unique_keys(model):"},{"line_number":97,"context_line":"        if unique_keys.issubset(sort_keys_set):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_910ac388","line":94,"updated":"2016-08-30 09:08:00.000000000","message":"IMO it\u0027s better with non-negative logic, i.e. _stable_sorting_order()","commit_id":"4d689d9a338bf1782dfea97b16309c7f4371e91a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"714cb1f9e10f22bd05afeedb2fb00ad8dfa9a541","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            yield {c.name for c in index.columns}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def _unstable_sorting_order(model, sort_keys):"},{"line_number":95,"context_line":"    sort_keys_set \u003d set(sort_keys)"},{"line_number":96,"context_line":"    for unique_keys in get_unique_keys(model):"},{"line_number":97,"context_line":"        if unique_keys.issubset(sort_keys_set):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_36772503","line":94,"in_reply_to":"fa7ab95a_910ac388","updated":"2016-08-30 11:15:45.000000000","message":"Done","commit_id":"4d689d9a338bf1782dfea97b16309c7f4371e91a"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"ac0bec5e753e9b6e410e94fd404900bf932591ac","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    return url"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def get_unique_keys(model):"},{"line_number":70,"context_line":"    \"\"\"Get a list of sets of unique model keys."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param model: the ORM model class"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_20496931","line":69,"range":{"start_line":69,"start_character":4,"end_line":69,"end_character":19},"updated":"2016-08-30 22:22:16.000000000","message":"nit: given that this method is returning the constraint keys info, shouldn\u0027t be better to name it as get_constraint_keys?","commit_id":"db36c72c81509d716ddd2813faa2aa840a3dd43c"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"4742fefa403deaef7d4bac6d4a1cc3bcc0beb9e0","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    return url"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def get_unique_keys(model):"},{"line_number":70,"context_line":"    \"\"\"Get a list of sets of unique model keys."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param model: the ORM model class"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_259ec207","line":69,"range":{"start_line":69,"start_character":4,"end_line":69,"end_character":19},"in_reply_to":"fa7ab95a_20496931","updated":"2016-08-31 09:47:29.000000000","message":"Probably makes sense. I will respin.","commit_id":"db36c72c81509d716ddd2813faa2aa840a3dd43c"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f97bc11746b595e1eb52cb98bdb99ef63afb8e67","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    return url"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def get_unique_keys(model):"},{"line_number":70,"context_line":"    \"\"\"Get a list of sets of unique model keys."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param model: the ORM model class"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_45166656","line":69,"range":{"start_line":69,"start_character":4,"end_line":69,"end_character":19},"in_reply_to":"fa7ab95a_259ec207","updated":"2016-08-31 09:49:34.000000000","message":"Hm, on second thought, it\u0027s not just constraints, its unique constraints. I will instead rename the key in info dict to oslodb_unique_keys.","commit_id":"db36c72c81509d716ddd2813faa2aa840a3dd43c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"f4d8a81408432528cf94431584f524354a20eaea","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    return url"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def get_unique_keys(model):"},{"line_number":70,"context_line":"    \"\"\"Get a list of sets of unique model keys."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param model: the ORM model class"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_9bd43548","line":69,"updated":"2016-08-31 16:05:28.000000000","message":"nit: this can be called concurrently from different threads, but we probably do not care much, if we calculate the return value multiple times","commit_id":"dea700d13e4c152bf1a484b62cc2bce329ef6fa9"}],"oslo_db/tests/sqlalchemy/test_utils.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"f4d8a81408432528cf94431584f524354a20eaea","unresolved":false,"context_lines":[{"line_number":298,"context_line":"                             sort_dirs\u003d[\u0027asc\u0027, \u0027desc\u0027])"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"class Test_UnstableSortingOrder(test_base.BaseTestCase):"},{"line_number":302,"context_line":"    def test_multiple_primary_keys_stable(self):"},{"line_number":303,"context_line":"        self.assertTrue("},{"line_number":304,"context_line":"            utils._stable_sorting_order("}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_c09ec806","line":301,"updated":"2016-08-31 16:05:28.000000000","message":"nit: not sure why _ is in the name","commit_id":"dea700d13e4c152bf1a484b62cc2bce329ef6fa9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3a9e7085d2d4b4389a09f7a86d69f086d3802704","unresolved":false,"context_lines":[{"line_number":298,"context_line":"                             sort_dirs\u003d[\u0027asc\u0027, \u0027desc\u0027])"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"class Test_UnstableSortingOrder(test_base.BaseTestCase):"},{"line_number":302,"context_line":"    def test_multiple_primary_keys_stable(self):"},{"line_number":303,"context_line":"        self.assertTrue("},{"line_number":304,"context_line":"            utils._stable_sorting_order("}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_06afe8e3","line":301,"in_reply_to":"fa7ab95a_c09ec806","updated":"2016-08-31 16:15:40.000000000","message":"oh well, should have been Test_StableSortingOrder now. As for why _, to reflect the function name under test.","commit_id":"dea700d13e4c152bf1a484b62cc2bce329ef6fa9"}]}
