)]}'
{"etc/keystone.conf.sample":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"43859016b007b25887237ccc48fd94eab83cdd6d","unresolved":false,"context_lines":[{"line_number":218,"context_line":"# user\u0027s name would be:"},{"line_number":219,"context_line":"# user_additional_attribute_mapping \u003d description:name, gecos:name"},{"line_number":220,"context_line":"#"},{"line_number":221,"context_line":"# group_additional_attribute_mapping \u003d None"},{"line_number":222,"context_line":"# role_additional_attribute_mapping \u003d None"},{"line_number":223,"context_line":"# tenant_additional_attribute_mapping \u003d None"},{"line_number":224,"context_line":"# user_additional_attribute_mapping \u003d None"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAOH%2F%2F1Ts%3D","line":221,"updated":"2013-03-25 19:49:25.000000000","message":"remove None from these.","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":7045,"name":"Allan Feid","email":"allanfeid@gmail.com","username":"crazed"},"change_message_id":"fe871db7335c486b3fe0481045c8e1f810f02b01","unresolved":false,"context_lines":[{"line_number":218,"context_line":"# user\u0027s name would be:"},{"line_number":219,"context_line":"# user_additional_attribute_mapping \u003d description:name, gecos:name"},{"line_number":220,"context_line":"#"},{"line_number":221,"context_line":"# group_additional_attribute_mapping \u003d None"},{"line_number":222,"context_line":"# role_additional_attribute_mapping \u003d None"},{"line_number":223,"context_line":"# tenant_additional_attribute_mapping \u003d None"},{"line_number":224,"context_line":"# user_additional_attribute_mapping \u003d None"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAOH%2F%2F1Ig%3D","line":221,"in_reply_to":"AAAAOH%2F%2F1Ts%3D","updated":"2013-03-25 20:53:44.000000000","message":"Done","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"43859016b007b25887237ccc48fd94eab83cdd6d","unresolved":false,"context_lines":[{"line_number":220,"context_line":"#"},{"line_number":221,"context_line":"# group_additional_attribute_mapping \u003d None"},{"line_number":222,"context_line":"# role_additional_attribute_mapping \u003d None"},{"line_number":223,"context_line":"# tenant_additional_attribute_mapping \u003d None"},{"line_number":224,"context_line":"# user_additional_attribute_mapping \u003d None"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"[auth]"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAOH%2F%2F1SM%3D","line":223,"updated":"2013-03-25 19:49:25.000000000","message":"we should be referring to tenants as projects.","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":7045,"name":"Allan Feid","email":"allanfeid@gmail.com","username":"crazed"},"change_message_id":"fe871db7335c486b3fe0481045c8e1f810f02b01","unresolved":false,"context_lines":[{"line_number":220,"context_line":"#"},{"line_number":221,"context_line":"# group_additional_attribute_mapping \u003d None"},{"line_number":222,"context_line":"# role_additional_attribute_mapping \u003d None"},{"line_number":223,"context_line":"# tenant_additional_attribute_mapping \u003d None"},{"line_number":224,"context_line":"# user_additional_attribute_mapping \u003d None"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"[auth]"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAOH%2F%2F1IQ%3D","line":223,"in_reply_to":"AAAAOH%2F%2F1SM%3D","updated":"2013-03-25 20:53:44.000000000","message":"Done","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"43859016b007b25887237ccc48fd94eab83cdd6d","unresolved":false,"context_lines":[{"line_number":221,"context_line":"# group_additional_attribute_mapping \u003d None"},{"line_number":222,"context_line":"# role_additional_attribute_mapping \u003d None"},{"line_number":223,"context_line":"# tenant_additional_attribute_mapping \u003d None"},{"line_number":224,"context_line":"# user_additional_attribute_mapping \u003d None"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"[auth]"},{"line_number":227,"context_line":"methods \u003d password,token"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAOH%2F%2F1SQ%3D","line":224,"updated":"2013-03-25 19:49:25.000000000","message":"don\u0027t forget domains.","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":7045,"name":"Allan Feid","email":"allanfeid@gmail.com","username":"crazed"},"change_message_id":"fe871db7335c486b3fe0481045c8e1f810f02b01","unresolved":false,"context_lines":[{"line_number":221,"context_line":"# group_additional_attribute_mapping \u003d None"},{"line_number":222,"context_line":"# role_additional_attribute_mapping \u003d None"},{"line_number":223,"context_line":"# tenant_additional_attribute_mapping \u003d None"},{"line_number":224,"context_line":"# user_additional_attribute_mapping \u003d None"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"[auth]"},{"line_number":227,"context_line":"methods \u003d password,token"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAOH%2F%2F1Ic%3D","line":224,"in_reply_to":"AAAAOH%2F%2F1SQ%3D","updated":"2013-03-25 20:53:44.000000000","message":"Done","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"}],"keystone/common/ldap/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"04c5477ef5ade44325333345798d4772a59c3e2b","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        for item in option_list:"},{"line_number":164,"context_line":"            ldap_attr, attr_map \u003d item.split(\u0027:\u0027)"},{"line_number":165,"context_line":"            if attr_map not in self.attribute_mapping:"},{"line_number":166,"context_line":"                LOG.warn(\u0027Invalid additional attribute mapping: %s\u0027 % attr_map)"},{"line_number":167,"context_line":"                continue"},{"line_number":168,"context_line":"            mapping[ldap_attr] \u003d attr_map"},{"line_number":169,"context_line":"        return mapping"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOH%2F%2F5Tk%3D","line":166,"updated":"2013-03-21 20:30:08.000000000","message":"wrap in _() for translation. Needs more text to say why it\u0027s invalid.","commit_id":"4d4f97cfb0022c4763c17e3bfc07c54dc6ceb2be"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"43859016b007b25887237ccc48fd94eab83cdd6d","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        for item in option_list:"},{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                ldap_attr, attr_map \u003d item.split(\u0027:\u0027)"},{"line_number":166,"context_line":"            except:"},{"line_number":167,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027 +"},{"line_number":168,"context_line":"                           \u0027Format must be \u0027 +"},{"line_number":169,"context_line":"                           \u0027\u003cldap_attribute\u003e:\u003ckeystone_attribute\u003e\u0027) % item)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOH%2F%2F1TI%3D","line":166,"updated":"2013-03-25 19:49:25.000000000","message":"change to \"except Except:\" or something more specific, see https://github.com/openstack/keystone/blame/master/HACKING.rst#L16","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":7045,"name":"Allan Feid","email":"allanfeid@gmail.com","username":"crazed"},"change_message_id":"fe871db7335c486b3fe0481045c8e1f810f02b01","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        for item in option_list:"},{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                ldap_attr, attr_map \u003d item.split(\u0027:\u0027)"},{"line_number":166,"context_line":"            except:"},{"line_number":167,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027 +"},{"line_number":168,"context_line":"                           \u0027Format must be \u0027 +"},{"line_number":169,"context_line":"                           \u0027\u003cldap_attribute\u003e:\u003ckeystone_attribute\u003e\u0027) % item)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOH%2F%2F1Jw%3D","line":166,"in_reply_to":"AAAAOH%2F%2F1TI%3D","updated":"2013-03-25 20:53:44.000000000","message":"Done","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"43859016b007b25887237ccc48fd94eab83cdd6d","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                ldap_attr, attr_map \u003d item.split(\u0027:\u0027)"},{"line_number":166,"context_line":"            except:"},{"line_number":167,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027 +"},{"line_number":168,"context_line":"                           \u0027Format must be \u0027 +"},{"line_number":169,"context_line":"                           \u0027\u003cldap_attribute\u003e:\u003ckeystone_attribute\u003e\u0027) % item)"},{"line_number":170,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOH%2F%2F1Sc%3D","line":167,"updated":"2013-03-25 19:49:25.000000000","message":"remove the +s since they aren\u0027t necessary.","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":7045,"name":"Allan Feid","email":"allanfeid@gmail.com","username":"crazed"},"change_message_id":"fe871db7335c486b3fe0481045c8e1f810f02b01","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                ldap_attr, attr_map \u003d item.split(\u0027:\u0027)"},{"line_number":166,"context_line":"            except:"},{"line_number":167,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027 +"},{"line_number":168,"context_line":"                           \u0027Format must be \u0027 +"},{"line_number":169,"context_line":"                           \u0027\u003cldap_attribute\u003e:\u003ckeystone_attribute\u003e\u0027) % item)"},{"line_number":170,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOH%2F%2F1Js%3D","line":167,"in_reply_to":"AAAAOH%2F%2F1Sc%3D","updated":"2013-03-25 20:53:44.000000000","message":"Done","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"43859016b007b25887237ccc48fd94eab83cdd6d","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            except:"},{"line_number":167,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027 +"},{"line_number":168,"context_line":"                           \u0027Format must be \u0027 +"},{"line_number":169,"context_line":"                           \u0027\u003cldap_attribute\u003e:\u003ckeystone_attribute\u003e\u0027) % item)"},{"line_number":170,"context_line":"                continue"},{"line_number":171,"context_line":"            if attr_map not in self.attribute_mapping:"},{"line_number":172,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027 +"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOH%2F%2F1S4%3D","line":169,"updated":"2013-03-25 19:49:25.000000000","message":"The description of the config options say \"map internal keystone attributes to ldap attributes\" and this says \"\u003cldap_attribute\u003e:\u003ckeystone_attribute\u003e\"... are the docs saying that this should be \u003ckeystone_attribute\u003e:\u003cldap_attribute\u003e ?","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":7045,"name":"Allan Feid","email":"allanfeid@gmail.com","username":"crazed"},"change_message_id":"fe871db7335c486b3fe0481045c8e1f810f02b01","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            except:"},{"line_number":167,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027 +"},{"line_number":168,"context_line":"                           \u0027Format must be \u0027 +"},{"line_number":169,"context_line":"                           \u0027\u003cldap_attribute\u003e:\u003ckeystone_attribute\u003e\u0027) % item)"},{"line_number":170,"context_line":"                continue"},{"line_number":171,"context_line":"            if attr_map not in self.attribute_mapping:"},{"line_number":172,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027 +"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOH%2F%2F1Jk%3D","line":169,"in_reply_to":"AAAAOH%2F%2F1S4%3D","updated":"2013-03-25 20:53:44.000000000","message":"Ah the docs are confusing, I\u0027ll fix them up, it should be map ldap attributes to internal keystone attributes.","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"43859016b007b25887237ccc48fd94eab83cdd6d","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027 +"},{"line_number":173,"context_line":"                           \u0027Value \"%s\" must use one of %s.\u0027) %"},{"line_number":174,"context_line":"                         (item, attr_map,"},{"line_number":175,"context_line":"                          \u0027\u0027.join(self.attribute_mapping.keys())))"},{"line_number":176,"context_line":"                continue"},{"line_number":177,"context_line":"            mapping[ldap_attr] \u003d attr_map"},{"line_number":178,"context_line":"        return mapping"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOH%2F%2F1R8%3D","line":175,"updated":"2013-03-25 19:49:25.000000000","message":"change \u0027\u0027 to \u0027, \u0027 ?","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":7045,"name":"Allan Feid","email":"allanfeid@gmail.com","username":"crazed"},"change_message_id":"fe871db7335c486b3fe0481045c8e1f810f02b01","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027 +"},{"line_number":173,"context_line":"                           \u0027Value \"%s\" must use one of %s.\u0027) %"},{"line_number":174,"context_line":"                         (item, attr_map,"},{"line_number":175,"context_line":"                          \u0027\u0027.join(self.attribute_mapping.keys())))"},{"line_number":176,"context_line":"                continue"},{"line_number":177,"context_line":"            mapping[ldap_attr] \u003d attr_map"},{"line_number":178,"context_line":"        return mapping"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOH%2F%2F1JY%3D","line":175,"in_reply_to":"AAAAOH%2F%2F1R8%3D","updated":"2013-03-25 20:53:44.000000000","message":"Done","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"43859016b007b25887237ccc48fd94eab83cdd6d","unresolved":false,"context_lines":[{"line_number":299,"context_line":"                    \u0027object_class\u0027: self.object_class})"},{"line_number":300,"context_line":"        try:"},{"line_number":301,"context_line":"            attrs \u003d (self.attribute_mapping.values() +"},{"line_number":302,"context_line":"                     self.extra_attr_mapping.keys())"},{"line_number":303,"context_line":"            res \u003d conn.search_s(self.tree_dn, self.LDAP_SCOPE, query, attrs)"},{"line_number":304,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":305,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOH%2F%2F1Qw%3D","line":302,"updated":"2013-03-25 19:49:25.000000000","message":"should make sure that there\u0027s only 1 instance of each attribute name.","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":7045,"name":"Allan Feid","email":"allanfeid@gmail.com","username":"crazed"},"change_message_id":"fe871db7335c486b3fe0481045c8e1f810f02b01","unresolved":false,"context_lines":[{"line_number":299,"context_line":"                    \u0027object_class\u0027: self.object_class})"},{"line_number":300,"context_line":"        try:"},{"line_number":301,"context_line":"            attrs \u003d (self.attribute_mapping.values() +"},{"line_number":302,"context_line":"                     self.extra_attr_mapping.keys())"},{"line_number":303,"context_line":"            res \u003d conn.search_s(self.tree_dn, self.LDAP_SCOPE, query, attrs)"},{"line_number":304,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":305,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOH%2F%2F1I8%3D","line":302,"in_reply_to":"AAAAOH%2F%2F1Qw%3D","updated":"2013-03-25 20:53:44.000000000","message":"Done","commit_id":"8e2ddd8d9db80b3491fc09a0bcfad46fc8f4d8ab"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4bc2a32187c25708fb2401eda11459ed70485ed5","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        mapping \u003d {}"},{"line_number":163,"context_line":"        for item in option_list:"},{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                ldap_attr, attr_map \u003d item.split(\u0027:\u0027)"},{"line_number":166,"context_line":"            except Exception:"},{"line_number":167,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027"},{"line_number":168,"context_line":"                           \u0027Format must be \u0027 +"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOX%2F%2F8zA%3D","line":165,"updated":"2013-04-04 20:11:55.000000000","message":"suggest use partition rather than split, since expecting exactly 2 results, also add a testcase where have 2 : in item string.","commit_id":"4f0d64014d8ed0b00fdebc734137cfab1ef698a2"},{"author":{"_account_id":7045,"name":"Allan Feid","email":"allanfeid@gmail.com","username":"crazed"},"change_message_id":"6153d2285683bd8c68522f315d14be90625b70cb","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        mapping \u003d {}"},{"line_number":163,"context_line":"        for item in option_list:"},{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                ldap_attr, attr_map \u003d item.split(\u0027:\u0027)"},{"line_number":166,"context_line":"            except Exception:"},{"line_number":167,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027"},{"line_number":168,"context_line":"                           \u0027Format must be \u0027 +"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOX%2F%2F8PE%3D","line":165,"in_reply_to":"AAAAOX%2F%2F8zA%3D","updated":"2013-04-05 01:20:24.000000000","message":"I gave partition a go, but it seemed a bit verbose since you have to raise if ldap_attr or attr_map are not set","commit_id":"4f0d64014d8ed0b00fdebc734137cfab1ef698a2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4bc2a32187c25708fb2401eda11459ed70485ed5","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                continue"},{"line_number":171,"context_line":"            if attr_map not in self.attribute_mapping:"},{"line_number":172,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027"},{"line_number":173,"context_line":"                           \u0027Value \"%s\" must use one of %s.\u0027) %"},{"line_number":174,"context_line":"                         (item, attr_map,"},{"line_number":175,"context_line":"                          \u0027, \u0027.join(self.attribute_mapping.keys())))"},{"line_number":176,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOX%2F%2F8yU%3D","line":173,"updated":"2013-04-04 20:11:55.000000000","message":"for translation, need to name the format patterns. So, change first %s to %(item)s and 2nd to %(attr_map)s, etc; then will have to pass dict rather than tuple.","commit_id":"4f0d64014d8ed0b00fdebc734137cfab1ef698a2"},{"author":{"_account_id":7045,"name":"Allan Feid","email":"allanfeid@gmail.com","username":"crazed"},"change_message_id":"6153d2285683bd8c68522f315d14be90625b70cb","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                continue"},{"line_number":171,"context_line":"            if attr_map not in self.attribute_mapping:"},{"line_number":172,"context_line":"                LOG.warn(_(\u0027Invalid additional attribute mapping: \"%s\". \u0027"},{"line_number":173,"context_line":"                           \u0027Value \"%s\" must use one of %s.\u0027) %"},{"line_number":174,"context_line":"                         (item, attr_map,"},{"line_number":175,"context_line":"                          \u0027, \u0027.join(self.attribute_mapping.keys())))"},{"line_number":176,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOX%2F%2F8O8%3D","line":173,"in_reply_to":"AAAAOX%2F%2F8yU%3D","updated":"2013-04-05 01:20:24.000000000","message":"Done","commit_id":"4f0d64014d8ed0b00fdebc734137cfab1ef698a2"}],"tests/test_backend_ldap.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"04c5477ef5ade44325333345798d4772a59c3e2b","unresolved":false,"context_lines":[{"line_number":365,"context_line":"            identity.backends.ldap.Identity)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    def test_user_extra_attribute_mapping(self):"},{"line_number":368,"context_line":"        CONF.ldap.user_additional_attribute_mapping \u003d [\u0027description:name\u0027]"},{"line_number":369,"context_line":"        self.identity_api \u003d identity.backends.ldap.Identity()"},{"line_number":370,"context_line":"        user \u003d {"},{"line_number":371,"context_line":"            \u0027id\u0027: \u0027extra_attributes\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOH%2F%2F5TI%3D","line":368,"updated":"2013-03-21 20:30:08.000000000","message":"should have tests for correctly parsing different attribute mapping strings, like if it has more than 1, empty string, missing a the :, no first part, no second part, etc.","commit_id":"4d4f97cfb0022c4763c17e3bfc07c54dc6ceb2be"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4bc2a32187c25708fb2401eda11459ed70485ed5","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def test_parse_extra_attribute_mapping(self):"},{"line_number":380,"context_line":"        option_list \u003d [\u0027description:name\u0027, \u0027gecos:password\u0027,"},{"line_number":381,"context_line":"                       \u0027fake:invalid\u0027, \u0027invalid1\u0027, \u0027invalid2:\u0027]"},{"line_number":382,"context_line":"        mapping \u003d self.identity_api.user._parse_extra_attrs(option_list)"},{"line_number":383,"context_line":"        expected_dict \u003d {\u0027description\u0027: \u0027name\u0027, \u0027gecos\u0027: \u0027password\u0027}"},{"line_number":384,"context_line":"        self.assertDictEqual(expected_dict, mapping)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOX%2F%2F8x0%3D","line":381,"updated":"2013-04-04 20:11:55.000000000","message":"as suggested earlier, have a test with 3 :s, e.g., \u0027description:name:something\u0027","commit_id":"4f0d64014d8ed0b00fdebc734137cfab1ef698a2"},{"author":{"_account_id":7045,"name":"Allan Feid","email":"allanfeid@gmail.com","username":"crazed"},"change_message_id":"6153d2285683bd8c68522f315d14be90625b70cb","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def test_parse_extra_attribute_mapping(self):"},{"line_number":380,"context_line":"        option_list \u003d [\u0027description:name\u0027, \u0027gecos:password\u0027,"},{"line_number":381,"context_line":"                       \u0027fake:invalid\u0027, \u0027invalid1\u0027, \u0027invalid2:\u0027]"},{"line_number":382,"context_line":"        mapping \u003d self.identity_api.user._parse_extra_attrs(option_list)"},{"line_number":383,"context_line":"        expected_dict \u003d {\u0027description\u0027: \u0027name\u0027, \u0027gecos\u0027: \u0027password\u0027}"},{"line_number":384,"context_line":"        self.assertDictEqual(expected_dict, mapping)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOX%2F%2F8N8%3D","line":381,"in_reply_to":"AAAAOX%2F%2F8x0%3D","updated":"2013-04-05 01:20:24.000000000","message":"Done","commit_id":"4f0d64014d8ed0b00fdebc734137cfab1ef698a2"}]}
