)]}'
{"etc/keystone.conf.ldap":[{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":22,"context_line":"max_pool_size \u003d 10"},{"line_number":23,"context_line":"pool_timeout \u003d 200"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"[ldap]"},{"line_number":26,"context_line":"url \u003d ldap://localhost"},{"line_number":27,"context_line":"tree_dn \u003d dc\u003dyounglogic,dc\u003dcom"},{"line_number":28,"context_line":"user_tree_dn \u003d ou\u003dUsers,dc\u003dyounglogic,dc\u003dcom"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAEn%2F%2F3g0%3D","line":25,"updated":"2012-02-22 22:18:03.000000000","message":"it would be nice to limit this file to the ldap section and the sections that need to be overridden, looks like identity too (the config files can be stacked)","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"[ldap]"},{"line_number":26,"context_line":"url \u003d ldap://localhost"},{"line_number":27,"context_line":"tree_dn \u003d dc\u003dyounglogic,dc\u003dcom"},{"line_number":28,"context_line":"user_tree_dn \u003d ou\u003dUsers,dc\u003dyounglogic,dc\u003dcom"},{"line_number":29,"context_line":"role_tree_dn \u003d ou\u003dRoles,dc\u003dyounglogic,dc\u003dcom"},{"line_number":30,"context_line":"tenant_tree_dn \u003d ou\u003dGroups,dc\u003dyounglogic,dc\u003dcom"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAEn%2F%2F3gk%3D","line":27,"updated":"2012-02-22 22:18:03.000000000","message":"can these can be changed to something more generic?","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"}],"keystone/common/ldap/__init__.py":[{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import ldap"},{"line_number":2,"context_line":"import logging"},{"line_number":3,"context_line":"import fakeldap"},{"line_number":4,"context_line":"import ast"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3gc%3D","line":1,"updated":"2012-02-22 22:18:03.000000000","message":"instead of putting this in __init__.py, please make a core.py file and possibly import it in this file","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import ldap"},{"line_number":2,"context_line":"import logging"},{"line_number":3,"context_line":"import fakeldap"},{"line_number":4,"context_line":"import ast"},{"line_number":5,"context_line":"from itertools import izip, count"},{"line_number":6,"context_line":"from keystone.common.sql.core import DictBase"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3gE%3D","line":3,"updated":"2012-02-22 22:18:03.000000000","message":"please read the HACKING doc for our code style guidelines, but imports follow the pattern:\n\nstdlib imports\n\\n\nthirdparty imports\n\\n\nimports from keystone\n\\n\n\\n\n... start of the code ...\n\n\nand are alphabetized, examples given in HACKING","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":6,"context_line":"from keystone.common.sql.core import DictBase"},{"line_number":7,"context_line":"import thread"},{"line_number":8,"context_line":"from eventlet import tpool"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"LOG \u003d logging.getLogger(\u0027keystone.common.ldap\u0027)"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"def py2ldap(val):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3gA%3D","line":9,"updated":"2012-02-22 22:18:03.000000000","message":"should be two newlines per HACKING","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":8,"context_line":"from eventlet import tpool"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"LOG \u003d logging.getLogger(\u0027keystone.common.ldap\u0027)"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"def py2ldap(val):"},{"line_number":13,"context_line":"    if isinstance(val, str):"},{"line_number":14,"context_line":"        return val"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3f8%3D","line":11,"updated":"2012-02-22 22:18:03.000000000","message":"two newlines between toplevel elements (per HACKING)","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    else:"},{"line_number":18,"context_line":"        return str(val)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"LDAP_VALUES \u003d {"},{"line_number":21,"context_line":"    \u0027TRUE\u0027: True,"},{"line_number":22,"context_line":"    \u0027FALSE\u0027: False,"},{"line_number":23,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3fw%3D","line":20,"updated":"2012-02-22 22:18:03.000000000","message":"when defining constants, please do them before function and class definitions (adding this to HACKING)","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        yield attrs"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class BaseLdapAPI(object):"},{"line_number":49,"context_line":"    DEFAULT_SUFFIX\u003d\"dc\u003dexample,dc\u003dcom\""},{"line_number":50,"context_line":"    DEFAULT_OU \u003d None"},{"line_number":51,"context_line":"    DEFAULT_STRUCTURAL_CLASSES \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Qw%3D","line":48,"updated":"2012-02-22 22:18:03.000000000","message":"We don\u0027t capitalilze the whole API, this would be BaseLdapApi","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    tree_dn \u003d None"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def __init__(self,  conf):"},{"line_number":63,"context_line":"        #self.api \u003d API(conf)"},{"line_number":64,"context_line":"        self.LDAP_URL \u003d conf.ldap.url"},{"line_number":65,"context_line":"        self.LDAP_USER \u003d conf.ldap.user"},{"line_number":66,"context_line":"        self.LDAP_PASSWORD \u003d conf.ldap.password"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3fk%3D","line":63,"updated":"2012-02-22 22:18:03.000000000","message":"commented out code should either be removed or have a comment next to it explaining why it should remain but be commented out","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            if (self.suffix \u003d\u003d None):"},{"line_number":71,"context_line":"                self.suffix \u003d self.DEFAULT_SUFFIX"},{"line_number":72,"context_line":"            dn \u003d \u0027%s_tree_dn\u0027 % self.options_name"},{"line_number":73,"context_line":"            self.tree_dn \u003d getattr(conf.ldap, dn)            "},{"line_number":74,"context_line":"            if (self.tree_dn \u003d\u003d None):"},{"line_number":75,"context_line":"                self.tree_dn \u003d self.suffix + \u0027,\u0027 + self.DEFAULT_OU"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3fs%3D","line":73,"updated":"2012-02-22 22:18:03.000000000","message":"trailing whitespace","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                self.tree_dn \u003d self.suffix + \u0027,\u0027 + self.DEFAULT_OU"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"            structs \u003d \u0027%s_structural_classes\u0027 % self.options_name"},{"line_number":78,"context_line":"            #lst \u003d conf[structs] or self.DEFAULT_STRUCTURAL_CLASSES"},{"line_number":79,"context_line":"            lst \u003d self.DEFAULT_STRUCTURAL_CLASSES"},{"line_number":80,"context_line":"            self.structural_classes \u003d ast.literal_eval(str(lst))"},{"line_number":81,"context_line":"            idatt \u003d \u0027%s_id_attr\u0027 % self.options_name"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3fc%3D","line":78,"updated":"2012-02-22 22:18:03.000000000","message":"commented out","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            lst \u003d self.DEFAULT_STRUCTURAL_CLASSES"},{"line_number":80,"context_line":"            self.structural_classes \u003d ast.literal_eval(str(lst))"},{"line_number":81,"context_line":"            idatt \u003d \u0027%s_id_attr\u0027 % self.options_name"},{"line_number":82,"context_line":"            #self.id_attr \u003d conf[idatt] or self.DEFAULT_ID_ATTR"},{"line_number":83,"context_line":"            self.id_attr \u003d  self.DEFAULT_ID_ATTR"},{"line_number":84,"context_line":"        #self.use_dumb_member \u003d conf.use_dumb_member or True"},{"line_number":85,"context_line":"        self.use_dumb_member \u003d  True"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3fY%3D","line":82,"updated":"2012-02-22 22:18:03.000000000","message":"commented out","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            idatt \u003d \u0027%s_id_attr\u0027 % self.options_name"},{"line_number":82,"context_line":"            #self.id_attr \u003d conf[idatt] or self.DEFAULT_ID_ATTR"},{"line_number":83,"context_line":"            self.id_attr \u003d  self.DEFAULT_ID_ATTR"},{"line_number":84,"context_line":"        #self.use_dumb_member \u003d conf.use_dumb_member or True"},{"line_number":85,"context_line":"        self.use_dumb_member \u003d  True"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3fM%3D","line":84,"updated":"2012-02-22 22:18:03.000000000","message":"commented out","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.use_dumb_member \u003d  True"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def get_connection(self, user\u003dNone, password\u003dNone):"},{"line_number":90,"context_line":"        if self.LDAP_URL.startswith(\u0027fake://\u0027):"},{"line_number":91,"context_line":"            conn \u003d fakeldap.initialize(self.LDAP_URL)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3fE%3D","line":88,"updated":"2012-02-22 22:18:03.000000000","message":"too many newlines","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        if self.LDAP_URL.startswith(\u0027fake://\u0027):"},{"line_number":91,"context_line":"            conn \u003d fakeldap.initialize(self.LDAP_URL)"},{"line_number":92,"context_line":"        else:"},{"line_number":93,"context_line":"            conn \u003d tpool.Proxy(LDAPWrapper(self.LDAP_URL))            "},{"line_number":94,"context_line":"        if user is None:"},{"line_number":95,"context_line":"            user \u003d self.LDAP_USER"},{"line_number":96,"context_line":"        if password is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3fo%3D","line":93,"updated":"2012-02-22 22:18:03.000000000","message":"trailing whitespace","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        conn.simple_bind_s(user, password)"},{"line_number":99,"context_line":"        return conn"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _id_to_dn(self, id):"},{"line_number":103,"context_line":"        return \u0027%s\u003d%s,%s\u0027 % (self.id_attr, ldap.dn.escape_dn_chars(str(id)),"},{"line_number":104,"context_line":"                                self.tree_dn)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3fA%3D","line":101,"updated":"2012-02-22 22:18:03.000000000","message":"two many newlines","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    # pylint: disable\u003dE1102"},{"line_number":111,"context_line":"    def _ldap_res_to_model(self, res):"},{"line_number":112,"context_line":"        obj \u003d self.model(id\u003dself._dn_to_id(res[0]))"},{"line_number":113,"context_line":"        #obj[\u0027name\u0027] \u003d obj[\u0027id\u0027]"},{"line_number":114,"context_line":"        for k in obj:"},{"line_number":115,"context_line":"            if k in self.attribute_ignore:"},{"line_number":116,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3e4%3D","line":113,"updated":"2012-02-22 22:18:03.000000000","message":"commented out","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                    obj[k] \u003d v[0]"},{"line_number":124,"context_line":"                except IndexError:"},{"line_number":125,"context_line":"                    obj[k] \u003d None"},{"line_number":126,"context_line":"                    "},{"line_number":127,"context_line":"        return obj"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def affirm_unique(self, values):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3e8%3D","line":126,"updated":"2012-02-22 22:18:03.000000000","message":"trailing whitepsace","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                    "},{"line_number":127,"context_line":"        return obj"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def affirm_unique(self, values):"},{"line_number":130,"context_line":"        if (values[\u0027name\u0027] !\u003d None):"},{"line_number":131,"context_line":"            entity \u003d self.get_by_name(values[\u0027name\u0027])"},{"line_number":132,"context_line":"            if ( entity !\u003d None ):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3T4%3D","line":129,"updated":"2012-02-22 22:18:03.000000000","message":"we usually use the word \"ensure\" for this type of method (ensure_unique)","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                raise Exception( \"%s with id %s already exists\" % (self.options_name,values[\u0027id\u0027]))"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    # pylint: disable\u003dE1102"},{"line_number":142,"context_line":"    def create(self, values):"},{"line_number":143,"context_line":"        conn \u003d self.get_connection()"},{"line_number":144,"context_line":"        object_classes \u003d self.structural_classes + [self.object_class]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3ew%3D","line":141,"updated":"2012-02-22 22:18:03.000000000","message":"do you know what this is disabling? it seems to claim that something is not callable but doesn\u0027t seem applicable, could probably be removed","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    # pylint: disable\u003dW0141"},{"line_number":189,"context_line":"    def get_all(self, filter\u003dNone):"},{"line_number":190,"context_line":"        return map(self._ldap_res_to_model, self._ldap_get_all(filter))"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def get_page(self, marker, limit):"},{"line_number":193,"context_line":"        return self._get_page(marker, limit, self.get_all())"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3eo%3D","line":190,"updated":"2012-02-22 22:18:03.000000000","message":"the pylint disabling above can be removed if this is turned into a list comprehension such as\n\n[self._ldap_res_to_model(x) for x in self._ldap_get_all(filter)]\n\nthough filter should probably be named filter_ with a trailing underscore since filter is a built in function","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    # pylint: disable\u003dW0141"},{"line_number":199,"context_line":"    @staticmethod"},{"line_number":200,"context_line":"    def _get_page(marker, limit, lst, key\u003dlambda e: e.id):"},{"line_number":201,"context_line":"        lst.sort(key\u003dkey)"},{"line_number":202,"context_line":"        if not marker:"},{"line_number":203,"context_line":"            return lst[:limit]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3UE%3D","line":200,"updated":"2012-02-22 22:18:03.000000000","message":"most of these page things probably can go away unless it is something very ldap specific, we have naive paging already and this paging code should probably be torn out and re-written anyway","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        if not marker:"},{"line_number":203,"context_line":"            return lst[:limit]"},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            return filter(lambda e: key(e) \u003e marker, lst)[:limit]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @staticmethod"},{"line_number":208,"context_line":"    def _get_page_markers(marker, limit, lst, key\u003dlambda e: e.id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3ek%3D","line":205,"updated":"2012-02-22 22:18:03.000000000","message":"same here, you can do\n\n[x for x in list if key(x) \u003e marker][:limit]\n\nthough i would probably replace the usage of \"e\" with \"x\" everywhere in this function, since \"e\" is commonly used to refer to an exception instance","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":205,"context_line":"            return filter(lambda e: key(e) \u003e marker, lst)[:limit]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @staticmethod"},{"line_number":208,"context_line":"    def _get_page_markers(marker, limit, lst, key\u003dlambda e: e.id):"},{"line_number":209,"context_line":"        if len(lst) \u003c limit:"},{"line_number":210,"context_line":"            return (None, None)"},{"line_number":211,"context_line":"        lst.sort(key\u003dkey)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3eg%3D","line":208,"updated":"2012-02-22 22:18:03.000000000","message":"likewise with these e\u0027s","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                nxt \u003d key(lst[limit])"},{"line_number":217,"context_line":"            return (None, nxt)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        for i, item in izip(count(), lst):"},{"line_number":220,"context_line":"            k \u003d key(item)"},{"line_number":221,"context_line":"            if k \u003e\u003d marker:"},{"line_number":222,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3UQ%3D","line":219,"updated":"2012-02-22 22:18:03.000000000","message":"this could be done as i, item in enumerate(lst):","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            k \u003d key(item)"},{"line_number":221,"context_line":"            if k \u003e\u003d marker:"},{"line_number":222,"context_line":"                break"},{"line_number":223,"context_line":"        # pylint: disable\u003dW0631"},{"line_number":224,"context_line":"        if i \u003c\u003d limit:"},{"line_number":225,"context_line":"            prv \u003d None"},{"line_number":226,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3cc%3D","line":223,"updated":"2012-02-22 22:18:03.000000000","message":"warnings like this tend to mean you are doing something wrong, and should be fixed rather than disabled, in this case it appears that the warning means you are using a fall-through from the for loop to set the value of i, the quick workaround would be to say i \u003d 0 before the for loop above, though since you\u0027re doing a fall-through you should probably comment saying that you expect that variable to be set by the for-loop","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        conn.delete_s(self._id_to_dn(id))"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"class LDAPWrapper(object):"},{"line_number":261,"context_line":"    def __init__(self, url):"},{"line_number":262,"context_line":"        LOG.debug(\"LDAP init: url\u003d%s\", url)"},{"line_number":263,"context_line":"        self.conn \u003d ldap.initialize(url)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Qs%3D","line":260,"updated":"2012-02-22 22:18:03.000000000","message":"this would be LdapWrapper","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":266,"context_line":"        LOG.debug(\"LDAP bind: dn\u003d%s\", user)"},{"line_number":267,"context_line":"        return self.conn.simple_bind_s(user, password)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def add_s(self, dn, attrs):"},{"line_number":270,"context_line":"        ldap_attrs \u003d [(typ, map(py2ldap, safe_iter(values)))"},{"line_number":271,"context_line":"                      for typ, values in attrs]"},{"line_number":272,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Tk%3D","line":269,"updated":"2012-02-22 22:18:03.000000000","message":"what do the _s on all these functions mean?","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        return self.conn.simple_bind_s(user, password)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def add_s(self, dn, attrs):"},{"line_number":270,"context_line":"        ldap_attrs \u003d [(typ, map(py2ldap, safe_iter(values)))"},{"line_number":271,"context_line":"                      for typ, values in attrs]"},{"line_number":272,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"},{"line_number":273,"context_line":"            sane_attrs \u003d [(typ, values if typ !\u003d \u0027userPassword\u0027 else [\u0027****\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3TM%3D","line":270,"updated":"2012-02-22 22:18:03.000000000","message":"this becomes a really difficult to read expression, do you think you could break it up into a couple lines?","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def add_s(self, dn, attrs):"},{"line_number":270,"context_line":"        ldap_attrs \u003d [(typ, map(py2ldap, safe_iter(values)))"},{"line_number":271,"context_line":"                      for typ, values in attrs]"},{"line_number":272,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"},{"line_number":273,"context_line":"            sane_attrs \u003d [(typ, values if typ !\u003d \u0027userPassword\u0027 else [\u0027****\u0027])"},{"line_number":274,"context_line":"                          for typ, values in ldap_attrs]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3S4%3D","line":271,"updated":"2012-02-22 22:18:03.000000000","message":"if \"typ\" means type, you can do \"type_\" or \"kind\" to make this easier to read","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            LOG.debug(\"LDAP search: dn\u003d%s, scope\u003d%s, query\u003d%s\", dn,"},{"line_number":281,"context_line":"                        fakeldap.scope_names[scope], query)"},{"line_number":282,"context_line":"        res \u003d self.conn.search_s(dn, scope, query)"},{"line_number":283,"context_line":"        return [(dn, dict([(typ, map(ldap2py, values))"},{"line_number":284,"context_line":"                           for typ, values in attrs.iteritems()]))"},{"line_number":285,"context_line":"                for dn, attrs in res]"},{"line_number":286,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3TU%3D","line":283,"updated":"2012-02-22 22:18:03.000000000","message":"this becomes a really difficult to read expression, do you think you could break it up into a couple lines?","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                for dn, attrs in res]"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def modify_s(self, dn, modlist):"},{"line_number":288,"context_line":"        ldap_modlist \u003d [(op, typ, None if values is None else"},{"line_number":289,"context_line":"                         map(py2ldap, safe_iter(values)))"},{"line_number":290,"context_line":"                        for op, typ, values in modlist]"},{"line_number":291,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3TY%3D","line":288,"updated":"2012-02-22 22:18:03.000000000","message":"this becomes a really difficult to read expression, do you think you could break it up into a couple lines?","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"}],"keystone/common/ldap/fakeldap.py":[{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":27,"context_line":"import re"},{"line_number":28,"context_line":"import shelve"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"import ldap"},{"line_number":31,"context_line":"from keystone.common import utils"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"scope_names \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3S0%3D","line":30,"updated":"2012-02-22 22:18:03.000000000","message":"new line between third party and project imports","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"import ldap"},{"line_number":31,"context_line":"from keystone.common import utils"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"scope_names \u003d {"},{"line_number":34,"context_line":"    ldap.SCOPE_BASE: \u0027SCOPE_BASE\u0027,"},{"line_number":35,"context_line":"    ldap.SCOPE_ONELEVEL: \u0027SCOPE_ONELEVEL\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Sw%3D","line":32,"updated":"2012-02-22 22:18:03.000000000","message":"needs another newline","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":30,"context_line":"import ldap"},{"line_number":31,"context_line":"from keystone.common import utils"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"scope_names \u003d {"},{"line_number":34,"context_line":"    ldap.SCOPE_BASE: \u0027SCOPE_BASE\u0027,"},{"line_number":35,"context_line":"    ldap.SCOPE_ONELEVEL: \u0027SCOPE_ONELEVEL\u0027,"},{"line_number":36,"context_line":"    ldap.SCOPE_SUBTREE: \u0027SCOPE_SUBTREE\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Ss%3D","line":33,"updated":"2012-02-22 22:18:03.000000000","message":"usually global constants are ALL_CAPS","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        # for serviceId, the backend is returning a list of numbers"},{"line_number":98,"context_line":"        # make sure we convert them to strings first before comparing"},{"line_number":99,"context_line":"        # them"},{"line_number":100,"context_line":"        str_sids \u003d map(lambda x: str(x), attrs[key])"},{"line_number":101,"context_line":"        return str(value) in str_sids"},{"line_number":102,"context_line":"    if key !\u003d \"objectclass\":"},{"line_number":103,"context_line":"        return value in attrs[key]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Sc%3D","line":100,"updated":"2012-02-22 22:18:03.000000000","message":"maps don\u0027t really get used in python, we use list comprehensions instead","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    so subclasses need to be defined manually in the dictionary below."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    \"\"\""},{"line_number":120,"context_line":"    subs \u003d {\u0027groupOfNames\u0027: ["},{"line_number":121,"context_line":"        \u0027keystoneTenant\u0027,"},{"line_number":122,"context_line":"        \u0027keystoneRole\u0027,"},{"line_number":123,"context_line":"        \u0027keystoneTenantRole\u0027]}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3SU%3D","line":120,"updated":"2012-02-22 22:18:03.000000000","message":"this is indented unusually, pls refer to \"Dictionaries/Lists\" in HACKING","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        pass"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"class FakeLDAP(object):"},{"line_number":146,"context_line":"    \"\"\"Fake LDAP connection.\"\"\""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def __init__(self, url):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Qk%3D","line":145,"updated":"2012-02-22 22:18:03.000000000","message":"FakeLdap","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            self.db \u003d shelve.open(url[7:])"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def simple_bind_s(self, dn, password):"},{"line_number":156,"context_line":"        \"\"\"This method is ignored, but provided for compatibility.\"\"\""},{"line_number":157,"context_line":"        if server_fail:"},{"line_number":158,"context_line":"            raise ldap.SERVER_DOWN"},{"line_number":159,"context_line":"        LOG.debug(\"FakeLDAP bind dn\u003d%s\" % (dn,))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3SI%3D","line":156,"updated":"2012-02-22 22:18:03.000000000","message":"is it ignored? it seems to do a lot of stuff","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            attrs \u003d self.db[\"%s%s\" % (self.__prefix, dn)]"},{"line_number":164,"context_line":"        except KeyError:"},{"line_number":165,"context_line":"            LOG.error(\"FakeLDAP bind fail: dn\u003d%s not found\" % (dn,))"},{"line_number":166,"context_line":"            raise ldap.NO_SUCH_OBJECT"},{"line_number":167,"context_line":"        db_passwd \u003d None"},{"line_number":168,"context_line":"        try:"},{"line_number":169,"context_line":"            db_passwd \u003d attrs[\u0027userPassword\u0027][0]            "}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3SA%3D","line":166,"updated":"2012-02-22 22:18:03.000000000","message":"it is usually nice to put a blank newline after control structures, so a newline here, and probably one before the try: above and probably before the next \"if\" below","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            raise ldap.NO_SUCH_OBJECT"},{"line_number":167,"context_line":"        db_passwd \u003d None"},{"line_number":168,"context_line":"        try:"},{"line_number":169,"context_line":"            db_passwd \u003d attrs[\u0027userPassword\u0027][0]            "},{"line_number":170,"context_line":"        except (KeyError, IndexError):"},{"line_number":171,"context_line":"            LOG.error(\"FakeLDAP bind fail: password for dn\u003d%s not found\" % dn)"},{"line_number":172,"context_line":"            raise ldap.INAPPROPRIATE_AUTH"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Sk%3D","line":169,"updated":"2012-02-22 22:18:03.000000000","message":"trailing whitespace","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        if key in self.db:"},{"line_number":191,"context_line":"            LOG.error("},{"line_number":192,"context_line":"                \"FakeLDAP add item failed: dn \u0027%s\u0027 is already in store.\" % dn)"},{"line_number":193,"context_line":"            raise ldap.ALREADY_EXISTS(dn)"},{"line_number":194,"context_line":"        self.db[key] \u003d dict([(k, v if isinstance(v, list) else [v])"},{"line_number":195,"context_line":"                             for k, v in attrs])"},{"line_number":196,"context_line":"        self.db.sync()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Ro%3D","line":193,"updated":"2012-02-22 22:18:03.000000000","message":"a newline after this raise would also be nice","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            del self.db[key]"},{"line_number":207,"context_line":"        except KeyError:"},{"line_number":208,"context_line":"            LOG.error(\"FakeLDAP delete item failed: dn \u0027%s\u0027 not found.\" % dn)"},{"line_number":209,"context_line":"            raise ldap.NO_SUCH_OBJECT"},{"line_number":210,"context_line":"        self.db.sync()"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def modify_s(self, dn, attrs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Rk%3D","line":209,"updated":"2012-02-22 22:18:03.000000000","message":"and after this one","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"}],"keystone/common/utils.py":[{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":25,"context_line":"import sys"},{"line_number":26,"context_line":"import time"},{"line_number":27,"context_line":"import urllib"},{"line_number":28,"context_line":"import passlib.hash"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from keystone import config"},{"line_number":31,"context_line":"from keystone.common import logging"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3RE%3D","line":28,"updated":"2012-02-22 22:18:03.000000000","message":"newline above this shoudl stay","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":156,"context_line":"def ldap_hash_password(password):"},{"line_number":157,"context_line":"    \"\"\"Hash a password. Hard.\"\"\""},{"line_number":158,"context_line":"    password_utf8 \u003d password.encode(\u0027utf-8\u0027)"},{"line_number":159,"context_line":"    h \u003d passlib.hash.ldap_salted_sha1.encrypt(password_utf8)"},{"line_number":160,"context_line":"    return h"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"def ldap_check_password(password, hashed):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Q8%3D","line":159,"updated":"2012-02-22 22:18:03.000000000","message":"is the normal way of hashing an ldap password? seems like we\u0027d just use the normal hash_password call...","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"}],"keystone/identity/backends/ldap/__init__.py":[{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":8,"context_line":"from keystone import identity"},{"line_number":9,"context_line":"from keystone import config"},{"line_number":10,"context_line":"from keystone.common import utils"},{"line_number":11,"context_line":"from  keystone.common.ldap import fakeldap, LDAPWrapper "},{"line_number":12,"context_line":"from  keystone.common.ldap import BaseLdapAPI "},{"line_number":13,"context_line":"from keystone.identity.backends.ldap.user import UserAPI"},{"line_number":14,"context_line":"from keystone.identity.backends.ldap.tenant import TenantAPI"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Q0%3D","line":11,"updated":"2012-02-22 22:18:03.000000000","message":"lots of trailing whitespace thorughout this file, and this line has extra whitespace and is import objects instead of modules (refer ot HACKING)","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":10,"context_line":"from keystone.common import utils"},{"line_number":11,"context_line":"from  keystone.common.ldap import fakeldap, LDAPWrapper "},{"line_number":12,"context_line":"from  keystone.common.ldap import BaseLdapAPI "},{"line_number":13,"context_line":"from keystone.identity.backends.ldap.user import UserAPI"},{"line_number":14,"context_line":"from keystone.identity.backends.ldap.tenant import TenantAPI"},{"line_number":15,"context_line":"from keystone.identity.backends.ldap.role import RoleAPI"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3PQ%3D","line":13,"updated":"2012-02-22 22:18:03.000000000","message":"import modules not objects (per HACKING)","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from keystone.identity.backends.ldap.tenant import TenantAPI"},{"line_number":15,"context_line":"from keystone.identity.backends.ldap.role import RoleAPI"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"CONF \u003d config.CONF"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3PU%3D","line":17,"updated":"2012-02-22 22:18:03.000000000","message":"too many newlines","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    if user_ref:"},{"line_number":24,"context_line":"        user_ref.pop(\u0027password\u0027, None)"},{"line_number":25,"context_line":"    return user_ref"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class Identity(identity.Driver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    "}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3PY%3D","line":26,"updated":"2012-02-22 22:18:03.000000000","message":"extra newline here","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class Identity(identity.Driver):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    "},{"line_number":30,"context_line":"    def __init__(self):"},{"line_number":31,"context_line":"        super(Identity, self).__init__()"},{"line_number":32,"context_line":"        self.LDAP_URL \u003d CONF.ldap.url "}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Pc%3D","line":29,"updated":"2012-02-22 22:18:03.000000000","message":"these newlines are not needed","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    "},{"line_number":30,"context_line":"    def __init__(self):"},{"line_number":31,"context_line":"        super(Identity, self).__init__()"},{"line_number":32,"context_line":"        self.LDAP_URL \u003d CONF.ldap.url "},{"line_number":33,"context_line":"        self.LDAP_USER \u003d CONF.ldap.user "},{"line_number":34,"context_line":"        self.LDAP_PASSWORD \u003d CONF.ldap.password"},{"line_number":35,"context_line":"        self.suffix \u003d CONF.ldap.suffix"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Qc%3D","line":32,"updated":"2012-02-22 22:18:03.000000000","message":"perhaps just use the CONF.ldap.url instead of assigning to an instance attribute as well","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.LDAP_PASSWORD \u003d CONF.ldap.password"},{"line_number":35,"context_line":"        self.suffix \u003d CONF.ldap.suffix"},{"line_number":36,"context_line":"        "},{"line_number":37,"context_line":"        self.user \u003d UserAPI(CONF)"},{"line_number":38,"context_line":"        self.tenant \u003d TenantAPI(CONF)"},{"line_number":39,"context_line":"        self.role \u003d RoleAPI(CONF)"},{"line_number":40,"context_line":"        "}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3QQ%3D","line":37,"updated":"2012-02-22 22:18:03.000000000","message":"CONF doesn\u0027t need to be passed, it is available globally","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.tenant \u003d TenantAPI(CONF)"},{"line_number":39,"context_line":"        self.role \u003d RoleAPI(CONF)"},{"line_number":40,"context_line":"        "},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def get_connection(self, user\u003dNone, password\u003dNone):"},{"line_number":43,"context_line":"        if self.LDAP_URL.startswith(\u0027fake://\u0027):"},{"line_number":44,"context_line":"            conn \u003d fakeldap.initialize(self.LDAP_URL)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3QM%3D","line":41,"updated":"2012-02-22 22:18:03.000000000","message":"only one newline needed","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        conn.simple_bind_s(user, password)"},{"line_number":52,"context_line":"        return conn"},{"line_number":53,"context_line":"    "},{"line_number":54,"context_line":" "},{"line_number":55,"context_line":"    def get_user(self, user_id):"},{"line_number":56,"context_line":"        user_ref \u003d self._get_user(user_id)"},{"line_number":57,"context_line":"        if (not user_ref):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3QI%3D","line":54,"updated":"2012-02-22 22:18:03.000000000","message":"only one newline needed","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    def get_user(self, user_id):"},{"line_number":56,"context_line":"        user_ref \u003d self._get_user(user_id)"},{"line_number":57,"context_line":"        if (not user_ref):"},{"line_number":58,"context_line":"                return None"},{"line_number":59,"context_line":"        return _filter_user (user_ref)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _get_user(self, user_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3QA%3D","line":58,"updated":"2012-02-22 22:18:03.000000000","message":"this looks indented oddly","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        for tenant in tenants:"},{"line_number":68,"context_line":"            user_ref[\u0027tenants\u0027].append(tenant.id)"},{"line_number":69,"context_line":"        return user_ref"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def authenticate(self, user_id\u003dNone, tenant_id\u003dNone, password\u003dNone):"},{"line_number":73,"context_line":"        \"\"\"Authenticate based on a user, tenant and password."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3QE%3D","line":70,"updated":"2012-02-22 22:18:03.000000000","message":"only one newline needed","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            if (not found):"},{"line_number":98,"context_line":"                raise AssertionError(\u0027Invalid tenant\u0027)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        #user_ref[\u0027tenant_id\u0027] \u003d tenant_id"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        tenant_ref \u003d self.tenant.get(tenant_id)"},{"line_number":103,"context_line":"        metadata_ref \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3P8%3D","line":100,"updated":"2012-02-22 22:18:03.000000000","message":"commented out code (and below)","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        roles \u003d[] "},{"line_number":134,"context_line":"        for assignment in assignments:"},{"line_number":135,"context_line":"            if assignment.user_id \u003d\u003d user_id:"},{"line_number":136,"context_line":"                roles.append(assignment.role_id)        "},{"line_number":137,"context_line":"        return roles"},{"line_number":138,"context_line":"    "},{"line_number":139,"context_line":"    def add_role_for_user_and_tenant(self, user_id, tenant_id, role_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Pw%3D","line":136,"updated":"2012-02-22 22:18:03.000000000","message":"this might look easier as \n\nroles \u003d [x.role_id for x in assignments if x.user_id \u003d\u003d user_id]","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    def get_tenants_for_user(self, user_id):"},{"line_number":155,"context_line":"        tenant_list \u003d []"},{"line_number":156,"context_line":"        for tenant in self.tenant.get_user_tenants(user_id):"},{"line_number":157,"context_line":"            tenant_list.append(tenant.id)"},{"line_number":158,"context_line":"        return tenant_list"},{"line_number":159,"context_line":"        "},{"line_number":160,"context_line":"    def update_user(self, user_id, user):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Ps%3D","line":157,"updated":"2012-02-22 22:18:03.000000000","message":"tenant_list \u003d [x.id for x in self.tenant.get_user_tenants(user_id)]","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        return self.tenant.update(tenant_id, tenant)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def get_metadata(self, user_id, tenant_id):"},{"line_number":167,"context_line":"        if (not self.get_tenant(tenant_id)):"},{"line_number":168,"context_line":"            return None"},{"line_number":169,"context_line":"        if (not self.get_user(user_id)):"},{"line_number":170,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Pk%3D","line":167,"updated":"2012-02-22 22:18:03.000000000","message":"no outer parens necessary","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"},{"author":{"_account_id":494,"name":"termie","email":"termie@openstack.org","username":"termie"},"change_message_id":"d198b9ba4bb7c368e2cb65e4c291c0fe93105fb1","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    def get_metadata(self, user_id, tenant_id):"},{"line_number":167,"context_line":"        if (not self.get_tenant(tenant_id)):"},{"line_number":168,"context_line":"            return None"},{"line_number":169,"context_line":"        if (not self.get_user(user_id)):"},{"line_number":170,"context_line":"            return None"},{"line_number":171,"context_line":"        "},{"line_number":172,"context_line":"        metadata_ref \u003d self.get_roles_for_user_and_tenant( user_id, tenant_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F3Pg%3D","line":169,"updated":"2012-02-22 22:18:03.000000000","message":"likewise","commit_id":"d678c53ee936fea79aeb2fa838ce8e8eab34cef6"}]}
