)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"406e1488b42eaf8993da22ee96c8f24d23d659f4","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Contains a set of classes for the base Keystone domain model, a"},{"line_number":12,"context_line":"builder object, and a sample director for creating the access info"},{"line_number":13,"context_line":"from the python objects produced by json parsing."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I8f7ccb015dde1d80dd868d9b1add3a26c211305f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7a016987_8aff9600","line":14,"updated":"2015-05-28 13:35:27.000000000","message":"no bp?","commit_id":"d2d0b4bba50a4dd8a980e31f630d1261fc6b9850"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"798b67f4a70dc4a94d86514ac17eb6fedc536ec0","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Contains a set of classes for the base Keystone domain model, a"},{"line_number":12,"context_line":"builder object, and a sample director for creating the access info"},{"line_number":13,"context_line":"from the python objects produced by json parsing."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I8f7ccb015dde1d80dd868d9b1add3a26c211305f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a50d1a3_f120c34b","line":14,"updated":"2015-07-20 15:49:26.000000000","message":"So is there a bp for this?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"}],"keystone/models/builder.py":[{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"dcea5d23d1f66a6dbcd32e529da92426e731e553","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.services_list \u003d []"},{"line_number":48,"context_line":"        self.federation \u003d None"},{"line_number":49,"context_line":"        self.audit_ids \u003d []"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self.trust \u003d None"},{"line_number":52,"context_line":"        self.oauth \u003d None"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_1b760c3e","line":50,"updated":"2015-05-21 22:04:51.000000000","message":"nit: remove this whiteline.","commit_id":"a8bf091e5442624bc3375657266661da42f69dbd"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"406e1488b42eaf8993da22ee96c8f24d23d659f4","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.roles \u003d []"},{"line_number":45,"context_line":"        self.scope \u003d None"},{"line_number":46,"context_line":"        self.services \u003d None"},{"line_number":47,"context_line":"        self.services_list \u003d []"},{"line_number":48,"context_line":"        self.federation \u003d None"},{"line_number":49,"context_line":"        self.audit_ids \u003d []"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_87954fe5","line":47,"updated":"2015-05-28 13:35:27.000000000","message":"what about service_providers?","commit_id":"d2d0b4bba50a4dd8a980e31f630d1261fc6b9850"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b39af952eabb2ba53695ac9bf08b281e52b14f60","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import six"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone import exception"},{"line_number":19,"context_line":"from keystone.models import core"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# Access Info is version agnostic.  The builder code is version aware."}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_0b2fa988","line":19,"updated":"2015-08-31 14:42:49.000000000","message":"Don\u0027t we usually import an API with dependency.requires?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b39af952eabb2ba53695ac9bf08b281e52b14f60","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def enforce_datetime(value):"},{"line_number":29,"context_line":"    if type(value) \u003d\u003d datetime:"},{"line_number":30,"context_line":"        if value.tzinfo is None:"},{"line_number":31,"context_line":"            raise ValueError(\u0027\u0027)"},{"line_number":32,"context_line":"        return value"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_207bacc2","line":29,"updated":"2015-08-31 14:42:49.000000000","message":"I think you can use isinstance here.","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b39af952eabb2ba53695ac9bf08b281e52b14f60","unresolved":false,"context_lines":[{"line_number":28,"context_line":"def enforce_datetime(value):"},{"line_number":29,"context_line":"    if type(value) \u003d\u003d datetime:"},{"line_number":30,"context_line":"        if value.tzinfo is None:"},{"line_number":31,"context_line":"            raise ValueError(\u0027\u0027)"},{"line_number":32,"context_line":"        return value"},{"line_number":33,"context_line":"    elif isinstance(value, six.string_types):"},{"line_number":34,"context_line":"        return timeutils.parse_isotime(value)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_a0349cfb","line":31,"updated":"2015-08-31 14:42:49.000000000","message":"Should we be giving something useful back to the user?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b39af952eabb2ba53695ac9bf08b281e52b14f60","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    elif isinstance(value, six.string_types):"},{"line_number":34,"context_line":"        return timeutils.parse_isotime(value)"},{"line_number":35,"context_line":"    else:"},{"line_number":36,"context_line":"        raise ValueError(\u0027datetime from unsupported class\u0027)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class Builder(object):"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_a066dc27","line":36,"updated":"2015-08-31 14:42:49.000000000","message":"Does this need to be translated?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        raise ValueError(\u0027datetime from unsupported class\u0027)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class Builder(object):"},{"line_number":40,"context_line":"    def __init__(self):"},{"line_number":41,"context_line":"        self.user_info \u003d None"},{"line_number":42,"context_line":"        self.user_domain \u003d core.Domain(None, None)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_00663fed","line":39,"updated":"2015-07-20 15:33:43.000000000","message":"needs docstring","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b39af952eabb2ba53695ac9bf08b281e52b14f60","unresolved":false,"context_lines":[{"line_number":39,"context_line":"class Builder(object):"},{"line_number":40,"context_line":"    def __init__(self):"},{"line_number":41,"context_line":"        self.user_info \u003d None"},{"line_number":42,"context_line":"        self.user_domain \u003d core.Domain(None, None)"},{"line_number":43,"context_line":"        self.methods \u003d []"},{"line_number":44,"context_line":"        self.roles \u003d []"},{"line_number":45,"context_line":"        self.scope \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_6b566507","line":42,"updated":"2015-08-31 14:42:49.000000000","message":"Don\u0027t we usually import an API with dependency.requires?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self.oauth \u003d None"},{"line_number":53,"context_line":"        self.service_providers \u003d None"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def add_method(self, method):"},{"line_number":56,"context_line":"        self.methods.append(method)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def set_expires_at(self, expires_at):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_dbc12830","line":55,"updated":"2015-07-20 15:33:43.000000000","message":"what\u0027s method? Needs docstring","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b39af952eabb2ba53695ac9bf08b281e52b14f60","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        self.methods.append(method)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def set_expires_at(self, expires_at):"},{"line_number":59,"context_line":"        self.expires_at \u003d enforce_datetime(expires_at)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def set_issued_at(self, issued_at):"},{"line_number":62,"context_line":"        self.issued_at \u003d enforce_datetime(issued_at)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_8bf5f9ed","line":59,"updated":"2015-08-31 14:42:49.000000000","message":"Instead of: \n\n    builder.set_expires_at \u003d \u003csome_time\u003e\n\ncan\u0027t we just do:\n\n    build.expires_at \u003d enforce_datetime(\u003csome_time\u003e) \n\n?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            federation[\u0027identity_provider\u0027], federation[\u0027protocol\u0027],"},{"line_number":70,"context_line":"            core.Groups(groups))"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def add_user_info(self, user_info):"},{"line_number":73,"context_line":"        self.user_info \u003d user_info"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def add_user_domain_info(self, domain_id, domain_name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_5bec38c7","line":72,"updated":"2015-07-20 15:33:43.000000000","message":"what\u0027s user_info? Needs docstring","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b39af952eabb2ba53695ac9bf08b281e52b14f60","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def add_endpoint(self, service_id, endpoint_data):"},{"line_number":130,"context_line":"        # While the spec defines that the Endpoint should have"},{"line_number":131,"context_line":"        # both region and region_id, older servers might not"},{"line_number":132,"context_line":"        # honor that.  Makes these values optional."},{"line_number":133,"context_line":"        self.services[service_id].endpoints.append("},{"line_number":134,"context_line":"            core.V3Endpoint("}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_cb3d3190","line":131,"updated":"2015-08-31 14:42:49.000000000","message":"servers, or services?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b39af952eabb2ba53695ac9bf08b281e52b14f60","unresolved":false,"context_lines":[{"line_number":210,"context_line":"    \u0027\u0027\u0027Determines the version from the deserialized token data."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @param token_data:  the authorization data associated with a token."},{"line_number":213,"context_line":"    @returns the major version number of the token data from the set"},{"line_number":214,"context_line":"    of VERSIONS"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    Since early version of the tokens do not have a version field"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_6bdc2546","line":213,"updated":"2015-08-31 14:42:49.000000000","message":"suggest using the documentation format already established in the project.\n\nhttps://www.python.org/dev/peps/pep-0008/#documentation-strings\n\nhttps://github.com/openstack/keystone/blob/master/keystone/notifications.py#L104-L114","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b39af952eabb2ba53695ac9bf08b281e52b14f60","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            raise exception.UnsupportedTokenVersionException()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"class PythonDirector(object):"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def construct(self, token):"},{"line_number":238,"context_line":"        version \u003d get_token_version(token)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_6baf457d","line":235,"updated":"2015-08-31 14:42:49.000000000","message":"docstrings?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b39af952eabb2ba53695ac9bf08b281e52b14f60","unresolved":false,"context_lines":[{"line_number":242,"context_line":"            return self.construct_core_v3(token[\u0027token\u0027])"},{"line_number":243,"context_line":"        else:"},{"line_number":244,"context_line":"            # Should never reach here, as the exception would be thrown"},{"line_number":245,"context_line":"            # by get_token_version"},{"line_number":246,"context_line":"            raise exception.UnsupportedTokenVersionException()"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def construct_core_v3(self, token_data):"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_cb3771fd","line":245,"updated":"2015-08-31 14:42:49.000000000","message":"we should remove this bit","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def construct_core_v2(self, token, default_domain_id):"},{"line_number":313,"context_line":"        builder \u003d Builder()"},{"line_number":314,"context_line":"        # TODO(ayoung):Get this from somewhere, but where?"},{"line_number":315,"context_line":"        DEFAULT_DOMAIN_ID \u003d \u0027default\u0027"},{"line_number":316,"context_line":"        DEFAULT_DOMAIN_NAME \u003d \u0027Default\u0027"},{"line_number":317,"context_line":"        DEFAULT_DOMAIN \u003d {"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_76ffc901","line":314,"updated":"2015-07-20 15:33:43.000000000","message":"/me doesn\u0027t know","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a149ce7839874979328da309b09b2dc21f385963","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        if self.service_providers is None:"},{"line_number":197,"context_line":"            service_providers \u003d None"},{"line_number":198,"context_line":"        else:"},{"line_number":199,"context_line":"            service_providers \u003d core. ServiceProviders(self.service_providers)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        token \u003d core.Token(user, catalog, tuple(self.roles),"},{"line_number":202,"context_line":"                           self.expires_at, self.issued_at,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a71b18c_64b0abde","line":199,"range":{"start_line":199,"start_character":32,"end_line":199,"end_character":54},"updated":"2016-12-01 22:15:31.000000000","message":"lets see if this is caught by the tests","commit_id":"0a16e34d3b97f6dd42c16be18fe72be05d874323"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8a771ea96baf264f13140b03a6becf27626debc3","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        if self.service_providers is None:"},{"line_number":197,"context_line":"            service_providers \u003d None"},{"line_number":198,"context_line":"        else:"},{"line_number":199,"context_line":"            service_providers \u003d core. ServiceProviders(self.service_providers)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        token \u003d core.Token(user, catalog, tuple(self.roles),"},{"line_number":202,"context_line":"                           self.expires_at, self.issued_at,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a71b18c_d403e371","line":199,"range":{"start_line":199,"start_character":32,"end_line":199,"end_character":54},"in_reply_to":"3a71b18c_518e0579","updated":"2016-12-02 03:52:58.000000000","message":"Its actually legal python. Surprised Pep8 didn\u0027t catch it.","commit_id":"0a16e34d3b97f6dd42c16be18fe72be05d874323"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ab29701d6e01317a055b1d508ae175b620fb5882","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        if self.service_providers is None:"},{"line_number":197,"context_line":"            service_providers \u003d None"},{"line_number":198,"context_line":"        else:"},{"line_number":199,"context_line":"            service_providers \u003d core. ServiceProviders(self.service_providers)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        token \u003d core.Token(user, catalog, tuple(self.roles),"},{"line_number":202,"context_line":"                           self.expires_at, self.issued_at,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a71b18c_518e0579","line":199,"range":{"start_line":199,"start_character":32,"end_line":199,"end_character":54},"in_reply_to":"3a71b18c_64b0abde","updated":"2016-12-02 03:13:59.000000000","message":"looks like it is not, which is indicative of insufficient testing.\n\ni highly recommend breaking this up for easier reviews, it\u0027ll be easier to catch mistakes like this (and appropriate test coverage)","commit_id":"0a16e34d3b97f6dd42c16be18fe72be05d874323"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ab29701d6e01317a055b1d508ae175b620fb5882","unresolved":false,"context_lines":[{"line_number":209,"context_line":"def get_token_version(token_data):"},{"line_number":210,"context_line":"    \"\"\"Determine the version from the deserialized token data."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @param token_data:  the authorization data associated with a token."},{"line_number":213,"context_line":"    @returns the major version number of the token data from the set"},{"line_number":214,"context_line":"    of VERSIONS"},{"line_number":215,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a71b18c_b15839fc","line":212,"range":{"start_line":212,"start_character":4,"end_line":212,"end_character":22},"updated":"2016-12-02 03:13:59.000000000","message":"python isn\u0027t java","commit_id":"0a16e34d3b97f6dd42c16be18fe72be05d874323"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8a771ea96baf264f13140b03a6becf27626debc3","unresolved":false,"context_lines":[{"line_number":209,"context_line":"def get_token_version(token_data):"},{"line_number":210,"context_line":"    \"\"\"Determine the version from the deserialized token data."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @param token_data:  the authorization data associated with a token."},{"line_number":213,"context_line":"    @returns the major version number of the token data from the set"},{"line_number":214,"context_line":"    of VERSIONS"},{"line_number":215,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a71b18c_748f6f23","line":212,"range":{"start_line":212,"start_character":4,"end_line":212,"end_character":22},"in_reply_to":"3a71b18c_b15839fc","updated":"2016-12-02 03:52:58.000000000","message":"The @ signs?  I didn\u0027t even realize I had done that.","commit_id":"0a16e34d3b97f6dd42c16be18fe72be05d874323"}],"keystone/models/core.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"406e1488b42eaf8993da22ee96c8f24d23d659f4","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            self.versionId \u003d versionId"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"class Service(Immutable):"},{"line_number":212,"context_line":"    def __init__(self, id, type, name, endpoints):"},{"line_number":213,"context_line":"        self.id \u003d id"},{"line_number":214,"context_line":"        self.type \u003d type"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_4744f772","line":211,"updated":"2015-05-28 13:35:27.000000000","message":"ServiceProviders too :)","commit_id":"d2d0b4bba50a4dd8a980e31f630d1261fc6b9850"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# gap, in seconds, to determine whether the given token is about to expire"},{"line_number":22,"context_line":"STALE_TOKEN_DURATION \u003d 30"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def assert_string(obj):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_1ba1d094","line":22,"updated":"2015-07-20 15:33:43.000000000","message":"it is not used anywhere in this module","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"def assert_string(obj):"},{"line_number":26,"context_line":"    if not isinstance(obj, six.string_types):"},{"line_number":27,"context_line":"        raise ValueError(\u0027%s not a string\u0027 % obj)"},{"line_number":28,"context_line":"    return obj"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def assert_class(cls, obj):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_c055b71d","line":28,"updated":"2015-07-20 15:33:43.000000000","message":"you return obj here, but for not in assert_datetime. Why?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class DateString(six.text_type):"},{"line_number":50,"context_line":"    def __init__(self, value):"},{"line_number":51,"context_line":"        assert_datetime(value)"},{"line_number":52,"context_line":"        self.value \u003d value"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def __new__(cls, value):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_60186385","line":51,"updated":"2015-07-20 15:33:43.000000000","message":"see above comment about return in assert_datetime","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        # return super().__new__(cls, value)"},{"line_number":57,"context_line":"        # But that will not work for Python 2.7."},{"line_number":58,"context_line":"        # The following works for both."},{"line_number":59,"context_line":"        strval \u003d timeutils.strtime(value)"},{"line_number":60,"context_line":"        return six.text_type.__new__(cls, strval)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def __eq__(self, other):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_9b52c012","line":59,"updated":"2015-07-20 15:33:43.000000000","message":"Deprecated since version \u003e: 1.5.0 Use utcnow(), datetime.datetime.isoformat() or datetime.strftime() instead.\n\nAlso I suggest to perform timeutils.strtime() lazily. It is pretty slow and I don\u0027t want it to run without a reason. Though it\u0027s not a blocker for the first iteration, TODO(breton): ... would be enough","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def __setattr__(self, att, v):"},{"line_number":90,"context_line":"        if self._is_immutable is False:"},{"line_number":91,"context_line":"            super(Immutable, self).__setattr__(att, v)"},{"line_number":92,"context_line":"        else:"},{"line_number":93,"context_line":"            raise AttributeError(\u0027Attempt to modify immutable object.\u0027)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_808d6f33","line":91,"updated":"2015-07-20 15:33:43.000000000","message":"I dislike this mangling with internal python properties and suggest to just have a self._dict.","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def get(self, attr, default\u003dNone):"},{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            return self.__dict__[attr]"},{"line_number":98,"context_line":"        except KeyError:"},{"line_number":99,"context_line":"            return default"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_20ca5ba2","line":97,"updated":"2015-07-20 15:33:43.000000000","message":"return self.__dict__.get(attr)","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"abd6ebbd01d0dbdce9dda844527a0af2d5e1eed0","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def get(self, attr, default\u003dNone):"},{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            return self.__dict__[attr]"},{"line_number":98,"context_line":"        except KeyError:"},{"line_number":99,"context_line":"            return default"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_9bddd944","line":97,"in_reply_to":"3a50d1a3_20ca5ba2","updated":"2015-07-20 17:33:17.000000000","message":"return self.__dict__.get(attr, default)","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"966e5c6a4d9b891d628ce053183aaf8b055bea1d","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def get(self, attr, default\u003dNone):"},{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            return self.__dict__[attr]"},{"line_number":98,"context_line":"        except KeyError:"},{"line_number":99,"context_line":"            return default"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_e6e244d5","line":97,"in_reply_to":"3a50d1a3_9bddd944","updated":"2015-07-20 17:39:09.000000000","message":"++, you are right.","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    def __getitem__(self, attr):"},{"line_number":102,"context_line":"        return self.__dict__[attr]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def lock(self):"},{"line_number":105,"context_line":"        self._is_immutable \u003d True"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def iteritems(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_1b6b1020","line":104,"updated":"2015-07-20 15:33:43.000000000","message":"Everyone is going to forget to lock it. Maybe it should lock automatically on __init__? This could be controlled by lock\u003dTrue parameter.\n\nlock() is used only once in the builder. Do you even need it?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        super(SubclassList, self).append(item)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"class Domain(Immutable):"},{"line_number":151,"context_line":"    def __init__(self, id, name):"},{"line_number":152,"context_line":"        self.id \u003d id"},{"line_number":153,"context_line":"        self.name \u003d name"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_a090ab96","line":150,"updated":"2015-07-20 15:33:43.000000000","message":"needs docstring.\n\nAlso, why only these 2 parameters?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"}],"keystone/tests/unit/test_access_info.py":[{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"dcea5d23d1f66a6dbcd32e529da92426e731e553","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            domain.name \u003d \"should not work\""},{"line_number":53,"context_line":"            self.fail()"},{"line_number":54,"context_line":"        except AttributeError:"},{"line_number":55,"context_line":"            pass"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_builder_unscoped(self):"},{"line_number":58,"context_line":"        director \u003d builder.PythonDirector()"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_7b118003","line":55,"updated":"2015-05-21 22:04:51.000000000","message":"can use self.assertRaise() here, instead force a error?","commit_id":"a8bf091e5442624bc3375657266661da42f69dbd"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"dcea5d23d1f66a6dbcd32e529da92426e731e553","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    def _user_domain(self):"},{"line_number":120,"context_line":"        dom_data \u003d access_data_unscoped[\u0027token\u0027][\u0027user\u0027][\u0027domain\u0027]"},{"line_number":121,"context_line":"        domain \u003d access_info.Domain(dom_data[\u0027id\u0027], dom_data[\u0027name\u0027])"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        return domain"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def test_encode_domain(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_3be66815","line":122,"updated":"2015-05-21 22:04:51.000000000","message":"why not return directly\n return access_info.Domain(dom_data[\u0027id\u0027], dom_data[\u0027name\u0027])","commit_id":"a8bf091e5442624bc3375657266661da42f69dbd"}],"keystone/tests/unit/test_model.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"3a50d1a3_36ddc142","updated":"2015-07-20 15:33:43.000000000","message":"everywhere (expected, actual) should be used","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import testtools"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from keystone.models import builder"},{"line_number":22,"context_line":"from keystone.models import core"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class ModelTestCase(testtools.TestCase):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_dbee08ec","line":22,"updated":"2015-07-20 15:33:43.000000000","message":"core_models would be a better name","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from keystone.models import core"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class ModelTestCase(testtools.TestCase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        super(ModelTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_dbc5a85b","line":25,"updated":"2015-07-20 15:33:43.000000000","message":"this should be inherited from oslotest","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def test_create_user(self):"},{"line_number":34,"context_line":"        domain \u003d core.Domain(self.dom_id, uuid.uuid4().hex)"},{"line_number":35,"context_line":"        user \u003d core.User(self.user_id, uuid.uuid4().hex, domain)"},{"line_number":36,"context_line":"        self.assertEqual(user[\u0027id\u0027], self.user_id)"},{"line_number":37,"context_line":"        self.assertEqual(user[\u0027domain\u0027][\u0027id\u0027], self.dom_id)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_class(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_fb7c2422","line":36,"updated":"2015-07-20 15:33:43.000000000","message":"argument order should be (expected, actual)","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def test_class(self):"},{"line_number":40,"context_line":"        try:"},{"line_number":41,"context_line":"            core.Role(\u0027u2\u0027, 4)"},{"line_number":42,"context_line":"            self.fail()"},{"line_number":43,"context_line":"        except ValueError:"},{"line_number":44,"context_line":"            pass"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_5bb0b8f4","line":42,"updated":"2015-07-20 15:33:43.000000000","message":"use assertRaises here","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        try:"},{"line_number":48,"context_line":"            domain \u003d core.Domain(\u0027id\u0027, \u0027name\u0027)"},{"line_number":49,"context_line":"            domain.lock()"},{"line_number":50,"context_line":"            domain.name \u003d \"should not work\""},{"line_number":51,"context_line":"            self.fail()"},{"line_number":52,"context_line":"        except AttributeError:"},{"line_number":53,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_fbe74410","line":50,"updated":"2015-07-20 15:33:43.000000000","message":"use assertRaises here","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        for item in first:"},{"line_number":78,"context_line":"            if isinstance(item, six.string_types):"},{"line_number":79,"context_line":"                a.append(item)"},{"line_number":80,"context_line":"                b.append(second[index])"},{"line_number":81,"context_line":"            else:"},{"line_number":82,"context_line":"                a.append(item[\u0027id\u0027])"},{"line_number":83,"context_line":"                b.append(second[index][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_d6b6dd3c","line":80,"updated":"2015-07-20 15:33:43.000000000","message":"why no i1, i2 in zip(first, second)?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            self.assert_list_match(first[i][\u0027endpoints\u0027],"},{"line_number":94,"context_line":"                                   second[i][\u0027endpoints\u0027])"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def assert_deep_match(self, first, second):"},{"line_number":97,"context_line":"        for k, v in six.iteritems(first):"},{"line_number":98,"context_line":"            if isinstance(v, six.string_types):"},{"line_number":99,"context_line":"                if isinstance(v, core.DateString):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_963cd594","line":96,"updated":"2015-07-20 15:33:43.000000000","message":"needs docstring","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                except KeyError:"},{"line_number":112,"context_line":"                    print(\u0027failed testing %s\u0027 % k)"},{"line_number":113,"context_line":"                    raise"},{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                self.assert_deep_match(v, second[k])"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _user_domain(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_56cf2db0","line":114,"updated":"2015-07-20 15:33:43.000000000","message":"`elif isinstance(v, dict)` or something like that would be more explicit","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"adb97d5b6316beeaeecb278b1c3ad22f3ff7978f","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                         access_data_v2_scoped[\u0027access\u0027][\u0027token\u0027][\u0027audit_ids\u0027])"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"access_data_v2_scoped \u003d {"},{"line_number":180,"context_line":"    \"access\": {"},{"line_number":181,"context_line":"        \"token\": {"},{"line_number":182,"context_line":"            \"audit_ids\": ["}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_360f01e3","line":179,"updated":"2015-07-20 15:33:43.000000000","message":"this and below should be capslocked","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b39af952eabb2ba53695ac9bf08b281e52b14f60","unresolved":false,"context_lines":[{"line_number":278,"context_line":"}"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"access_data_unscoped \u003d {"},{"line_number":282,"context_line":"    \"token\": {"},{"line_number":283,"context_line":"        \"expires_at\": \"2013-02-27T18:30:59.999999Z\","},{"line_number":284,"context_line":"        \"issued_at\": \"2013-02-27T16:30:59.999999Z\","}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_c68e882d","line":281,"updated":"2015-08-31 14:42:49.000000000","message":"can\u0027t these be broken out into fixtures?","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"cd44dbc4db31390200a9bfd8fd8a40de6bfe8180","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        },"},{"line_number":429,"context_line":"        \"service_providers\": ["},{"line_number":430,"context_line":"            {"},{"line_number":431,"context_line":"                \"auth_url\": \"https://example.com:5000/v3/OS-FEDERATION/\" +"},{"line_number":432,"context_line":"                \"identity_providers/acme/protocols/saml2/auth\","},{"line_number":433,"context_line":"                \"id\": \"sp1\","},{"line_number":434,"context_line":"                \"sp_url\": \"https://example.com:5000/Shibboleth.sso/\" +"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_3b584cfa","line":431,"updated":"2015-07-20 15:16:34.000000000","message":"the + isn\u0027t necessary","commit_id":"6c03ee6fb28e84317c8a6f86df27df5da7c32d86"}]}
