)]}'
{"ceilometer/storage/impl_sqlalchemy.py":[{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"c236b382c7d7e022f8ab63726b41c394a9fab820","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        return Connection(conf)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def apply_metaquery_filter(session, query, metaquery):"},{"line_number":108,"context_line":"    \"\"\"Apply provided metaquery filter to existing query."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    :param session: session used for original query"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATH%2F%2F%2BQo%3D","line":107,"updated":"2013-10-07 08:52:25.000000000","message":"On the API part the metadata value can be a boolean,\nShould this method handle boolean too ?","commit_id":"8110f3526929b48755ac1340ce27ae4275a28583"},{"author":{"_account_id":2860,"name":"litong01","email":"email4tong@yahoo.com","username":"litong01"},"change_message_id":"f849010d5c740eb1feb0047cd805aeee0ccbfe90","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        return Connection(conf)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def apply_metaquery_filter(session, query, metaquery):"},{"line_number":108,"context_line":"    \"\"\"Apply provided metaquery filter to existing query."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    :param session: session used for original query"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATH%2F%2F8qg%3D","line":107,"updated":"2013-10-07 16:08:10.000000000","message":"seems to me that the behavior or the format of the query will be different.\nOn mongodb, the values of keys can be object as well, here, not really. \nOther than handling boolean, should there be a catch all case? what happens\nwhen the value is none of the conditions, seems the code suggest to siliently\ndrop them, very much like to have some sort of catch all or exception cases in\nthe code.","commit_id":"8110f3526929b48755ac1340ce27ae4275a28583"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"08e6d51e2da3055e0c9f14a13e6e7a4688c23832","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        return Connection(conf)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def apply_metaquery_filter(session, query, metaquery):"},{"line_number":108,"context_line":"    \"\"\"Apply provided metaquery filter to existing query."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    :param session: session used for original query"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATH%2F%2F8ko%3D","line":107,"in_reply_to":"AAAATH%2F%2F8qg%3D","updated":"2013-10-07 16:27:51.000000000","message":"so the reason boolean works fine is this: isinstance(True/False, int) is True. i guess it\u0027ll trigger false positives if you ever search for 0 and the value is False. i\u0027ll add boolean table\n\nif i remember correctly, a notification is serialized so we don\u0027t really need to deal with objects (i\u0027m not sure how you\u0027d accurately query on it with our api anyways).\n\ni\u0027ll add a clause to raise notimplemented(?) for any items not: text, int, float or boolean.","commit_id":"8110f3526929b48755ac1340ce27ae4275a28583"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"c236b382c7d7e022f8ab63726b41c394a9fab820","unresolved":false,"context_lines":[{"line_number":253,"context_line":"            if rmetadata:"},{"line_number":254,"context_line":"                if isinstance(rmetadata, dict):"},{"line_number":255,"context_line":"                    for key, v in utils.dict_to_keyval(rmetadata):"},{"line_number":256,"context_line":"                        if isinstance(v, basestring) or v is None:"},{"line_number":257,"context_line":"                            session.add(MetaText(id\u003dmeter.id,"},{"line_number":258,"context_line":"                                                 meta_key\u003dkey,"},{"line_number":259,"context_line":"                                                 value\u003dv))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATH%2F%2F%2BQk%3D","line":256,"updated":"2013-10-07 08:52:25.000000000","message":"Same here","commit_id":"8110f3526929b48755ac1340ce27ae4275a28583"},{"author":{"_account_id":4491,"name":"Lianhao Lu","email":"llh_misc@outlook.com","username":"lianhao-lu"},"change_message_id":"687f444304763d3ae5ab7e783eaecf0af0c85516","unresolved":false,"context_lines":[{"line_number":257,"context_line":"            meter.counter_volume \u003d data[\u0027counter_volume\u0027]"},{"line_number":258,"context_line":"            meter.message_signature \u003d data[\u0027message_signature\u0027]"},{"line_number":259,"context_line":"            meter.message_id \u003d data[\u0027message_id\u0027]"},{"line_number":260,"context_line":"            session.flush()"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"            if rmetadata:"},{"line_number":263,"context_line":"                if isinstance(rmetadata, dict):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FwiA%3D","line":260,"updated":"2013-10-10 09:18:13.000000000","message":"Is this necessary? Ln 282 has it.","commit_id":"301f4b075791270bb87be1850a86be665970e899"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"5ed96a24c49f139cebbbf52a9ff3be9649a44ef8","unresolved":false,"context_lines":[{"line_number":257,"context_line":"            meter.counter_volume \u003d data[\u0027counter_volume\u0027]"},{"line_number":258,"context_line":"            meter.message_signature \u003d data[\u0027message_signature\u0027]"},{"line_number":259,"context_line":"            meter.message_id \u003d data[\u0027message_id\u0027]"},{"line_number":260,"context_line":"            session.flush()"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"            if rmetadata:"},{"line_number":263,"context_line":"                if isinstance(rmetadata, dict):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FvX0%3D","line":260,"in_reply_to":"AAAATH%2F%2FwiA%3D","updated":"2013-10-10 13:22:38.000000000","message":"it is needed. the metadata tables below have a foreign key on the meter record. the foreign key constraint will fail if we don\u0027t have this flush because the database doesn\u0027t know about meter record until flush is called","commit_id":"301f4b075791270bb87be1850a86be665970e899"},{"author":{"_account_id":7368,"name":"Thomas Maddox","email":"me@thomasem.net","username":"thomasm"},"change_message_id":"d685c31387b6a126c8f3e010bc42cdeca65080d2","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    :param query: Query instance"},{"line_number":113,"context_line":"    :param metaquery: dict with metadata to match on."},{"line_number":114,"context_line":"    \"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    for k, v in metaquery.iteritems():"},{"line_number":117,"context_line":"        key \u003d k[9:]  # strip out \u0027metadata.\u0027 prefix"},{"line_number":118,"context_line":"        if isinstance(v, basestring):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FisA%3D","line":115,"updated":"2013-10-14 19:23:06.000000000","message":"What about looking these up in a dict rather than using a switch and repeating the pattern?\n\nSomething like:\n\ntype_dict \u003d {\n    bool: MetaBool,\n    basestring: MetaText,\n    int: MetaInt,\n    long: MetaInt,\n    ...\n}\n\n_model \u003d type_dict[type(v)]\n\nmeta_q \u003d session.query(_model].filter(_model.meta_key \u003d\u003d key, _model.value \u003d\u003d v).subquery()","commit_id":"a30805564a8fc2ed2f50ca5c07985cc3442901fb"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"332e83cdf170726e7bb73404db1f13607c5909fe","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    :param query: Query instance"},{"line_number":113,"context_line":"    :param metaquery: dict with metadata to match on."},{"line_number":114,"context_line":"    \"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    for k, v in metaquery.iteritems():"},{"line_number":117,"context_line":"        key \u003d k[9:]  # strip out \u0027metadata.\u0027 prefix"},{"line_number":118,"context_line":"        if isinstance(v, basestring):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FhvM%3D","line":115,"in_reply_to":"AAAATH%2F%2FisA%3D","updated":"2013-10-15 04:17:37.000000000","message":"i wanted to simplify this code but was too mindnumb to figure out the correct solution. i was waiting for someone to tell me exactly this. :)","commit_id":"a30805564a8fc2ed2f50ca5c07985cc3442901fb"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c837ac782371df5ad6515dfef93556f201a56937","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    \"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    for k, v in metaquery.iteritems():"},{"line_number":117,"context_line":"        key \u003d k[9:]  # strip out \u0027metadata.\u0027 prefix"},{"line_number":118,"context_line":"        if isinstance(v, basestring):"},{"line_number":119,"context_line":"            meta_q \u003d session.query(MetaText).\\"},{"line_number":120,"context_line":"                filter(and_(MetaText.meta_key \u003d\u003d key,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FkWE%3D","line":117,"updated":"2013-10-14 13:06:26.000000000","message":"I\u0027ve a big doubt here, as I recently added the abilty to use resource_metadata. as a prefix too in the API. Is this covered?","commit_id":"a30805564a8fc2ed2f50ca5c07985cc3442901fb"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"332e83cdf170726e7bb73404db1f13607c5909fe","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    \"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    for k, v in metaquery.iteritems():"},{"line_number":117,"context_line":"        key \u003d k[9:]  # strip out \u0027metadata.\u0027 prefix"},{"line_number":118,"context_line":"        if isinstance(v, basestring):"},{"line_number":119,"context_line":"            meta_q \u003d session.query(MetaText).\\"},{"line_number":120,"context_line":"                filter(and_(MetaText.meta_key \u003d\u003d key,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2Fhvs%3D","line":117,"in_reply_to":"AAAATH%2F%2FkWE%3D","updated":"2013-10-15 04:17:37.000000000","message":"this shouldn\u0027t be an issue. _query_to_kwargs strips it down to \"metadata.\" prefix \n\nhttps://github.com/openstack/ceilometer/blob/master/ceilometer/api/controllers/v2.py#L404","commit_id":"a30805564a8fc2ed2f50ca5c07985cc3442901fb"},{"author":{"_account_id":7368,"name":"Thomas Maddox","email":"me@thomasem.net","username":"thomasm"},"change_message_id":"d685c31387b6a126c8f3e010bc42cdeca65080d2","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            session.flush()"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"            if rmetadata:"},{"line_number":264,"context_line":"                if isinstance(rmetadata, dict):"},{"line_number":265,"context_line":"                    for key, v in utils.dict_to_keyval(rmetadata):"},{"line_number":266,"context_line":"                        if isinstance(v, basestring) or v is None:"},{"line_number":267,"context_line":"                            session.add(MetaText(id\u003dmeter.id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2Firs%3D","line":264,"updated":"2013-10-14 19:23:06.000000000","message":"Same question as line 115","commit_id":"a30805564a8fc2ed2f50ca5c07985cc3442901fb"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"332e83cdf170726e7bb73404db1f13607c5909fe","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            session.flush()"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"            if rmetadata:"},{"line_number":264,"context_line":"                if isinstance(rmetadata, dict):"},{"line_number":265,"context_line":"                    for key, v in utils.dict_to_keyval(rmetadata):"},{"line_number":266,"context_line":"                        if isinstance(v, basestring) or v is None:"},{"line_number":267,"context_line":"                            session.add(MetaText(id\u003dmeter.id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2Fhbg%3D","line":264,"in_reply_to":"AAAATH%2F%2Firs%3D","updated":"2013-10-15 04:17:37.000000000","message":"will do","commit_id":"a30805564a8fc2ed2f50ca5c07985cc3442901fb"},{"author":{"_account_id":4491,"name":"Lianhao Lu","email":"llh_misc@outlook.com","username":"lianhao-lu"},"change_message_id":"c37ad722e025e2e790e6f92ed21e4d64d340ff1d","unresolved":false,"context_lines":[{"line_number":44,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaText"},{"line_number":45,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaBool"},{"line_number":46,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaInt"},{"line_number":47,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaFloat"},{"line_number":48,"context_line":"from ceilometer.storage.sqlalchemy.models import Project"},{"line_number":49,"context_line":"from ceilometer.storage.sqlalchemy.models import Resource"},{"line_number":50,"context_line":"from ceilometer.storage.sqlalchemy.models import Source"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2F67c%3D","line":47,"updated":"2013-10-25 07:43:22.000000000","message":"nitpicking, import order?","commit_id":"5d4602188d79da099bd9944221e7c2834478d5cd"},{"author":{"_account_id":5313,"name":"David Peraza","email":"david_peraza@persistentsys.com","username":"dperaza"},"change_message_id":"07010875d40b9ad70c0a3bd81ab14954cb0c666d","unresolved":false,"context_lines":[{"line_number":44,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaText"},{"line_number":45,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaBool"},{"line_number":46,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaInt"},{"line_number":47,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaFloat"},{"line_number":48,"context_line":"from ceilometer.storage.sqlalchemy.models import Project"},{"line_number":49,"context_line":"from ceilometer.storage.sqlalchemy.models import Resource"},{"line_number":50,"context_line":"from ceilometer.storage.sqlalchemy.models import Source"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2F5ds%3D","line":47,"in_reply_to":"AAAATn%2F%2F67c%3D","updated":"2013-10-25 15:02:32.000000000","message":"I agree, wonder why flake8 did not catch","commit_id":"5d4602188d79da099bd9944221e7c2834478d5cd"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"0af70fc25a6e0b34bfae6ae5221a1409ec5de8c7","unresolved":false,"context_lines":[{"line_number":44,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaText"},{"line_number":45,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaBool"},{"line_number":46,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaInt"},{"line_number":47,"context_line":"from ceilometer.storage.sqlalchemy.models import MetaFloat"},{"line_number":48,"context_line":"from ceilometer.storage.sqlalchemy.models import Project"},{"line_number":49,"context_line":"from ceilometer.storage.sqlalchemy.models import Resource"},{"line_number":50,"context_line":"from ceilometer.storage.sqlalchemy.models import Source"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2F6Kw%3D","line":47,"in_reply_to":"AAAATn%2F%2F67c%3D","updated":"2013-10-25 15:31:11.000000000","message":"we ignore some flake8 rules... i\u0027ll change this.","commit_id":"5d4602188d79da099bd9944221e7c2834478d5cd"},{"author":{"_account_id":4491,"name":"Lianhao Lu","email":"llh_misc@outlook.com","username":"lianhao-lu"},"change_message_id":"c37ad722e025e2e790e6f92ed21e4d64d340ff1d","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                        try:"},{"line_number":264,"context_line":"                            _model \u003d META_TYPE_MAP[type(v)]"},{"line_number":265,"context_line":"                        except KeyError:"},{"line_number":266,"context_line":"                            pass"},{"line_number":267,"context_line":"                        else:"},{"line_number":268,"context_line":"                            session.add(_model(id\u003dmeter.id,"},{"line_number":269,"context_line":"                                               meta_key\u003dkey,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2F67k%3D","line":266,"updated":"2013-10-25 07:43:22.000000000","message":"Should we just silent drop the unsupported data or at least LOG.warn?","commit_id":"5d4602188d79da099bd9944221e7c2834478d5cd"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"0af70fc25a6e0b34bfae6ae5221a1409ec5de8c7","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                        try:"},{"line_number":264,"context_line":"                            _model \u003d META_TYPE_MAP[type(v)]"},{"line_number":265,"context_line":"                        except KeyError:"},{"line_number":266,"context_line":"                            pass"},{"line_number":267,"context_line":"                        else:"},{"line_number":268,"context_line":"                            session.add(_model(id\u003dmeter.id,"},{"line_number":269,"context_line":"                                               meta_key\u003dkey,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2F6Ks%3D","line":266,"in_reply_to":"AAAATn%2F%2F67k%3D","updated":"2013-10-25 15:31:11.000000000","message":"sure. why not.","commit_id":"5d4602188d79da099bd9944221e7c2834478d5cd"}],"ceilometer/storage/sqlalchemy/migrate_repo/versions/018_add_metadata_tables.py":[{"author":{"_account_id":4491,"name":"Lianhao Lu","email":"llh_misc@outlook.com","username":"lianhao-lu"},"change_message_id":"687f444304763d3ae5ab7e783eaecf0af0c85516","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                    meta_float.insert().values(id\u003dmeter_id,"},{"line_number":102,"context_line":"                                               meta_key\u003dkey,"},{"line_number":103,"context_line":"                                               value\u003dv)"},{"line_number":104,"context_line":"        except Exception:"},{"line_number":105,"context_line":"            pass"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FwnI%3D","line":104,"updated":"2013-10-10 09:18:13.000000000","message":"what\u0027s the exception for?","commit_id":"301f4b075791270bb87be1850a86be665970e899"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"5ed96a24c49f139cebbbf52a9ff3be9649a44ef8","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                    meta_float.insert().values(id\u003dmeter_id,"},{"line_number":102,"context_line":"                                               meta_key\u003dkey,"},{"line_number":103,"context_line":"                                               value\u003dv)"},{"line_number":104,"context_line":"        except Exception:"},{"line_number":105,"context_line":"            pass"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FvWY%3D","line":104,"in_reply_to":"AAAATH%2F%2FwnI%3D","updated":"2013-10-10 13:22:38.000000000","message":"this probably isn\u0027t necessary now that i think about it. i put it in as a safety clause in case for some reason json.loads failed but since resource_metadata column is JSONEncodedDict type, i guess i could pull this catch out","commit_id":"301f4b075791270bb87be1850a86be665970e899"}],"ceilometer/utils.py":[{"author":{"_account_id":4491,"name":"Lianhao Lu","email":"llh_misc@outlook.com","username":"lianhao-lu"},"change_message_id":"687f444304763d3ae5ab7e783eaecf0af0c85516","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                    yield key_gen, v"},{"line_number":96,"context_line":"            else:"},{"line_number":97,"context_line":"                yield key_gen, v"},{"line_number":98,"context_line":"    elif isinstance(value, list):"},{"line_number":99,"context_line":"        for i, v in enumerate(value):"},{"line_number":100,"context_line":"            key_gen \u003d key_base + \u0027[%d]\u0027 % i"},{"line_number":101,"context_line":"            if isinstance(v, dict) or isinstance(v, list):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2Fwiw%3D","line":98,"updated":"2013-10-10 09:18:13.000000000","message":"Is it possible that in the future the metadata value is a tuple not list? In that case, we may also need to handle type here. Pls see recursive_keypairs() function above.","commit_id":"301f4b075791270bb87be1850a86be665970e899"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"5ed96a24c49f139cebbbf52a9ff3be9649a44ef8","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                    yield key_gen, v"},{"line_number":96,"context_line":"            else:"},{"line_number":97,"context_line":"                yield key_gen, v"},{"line_number":98,"context_line":"    elif isinstance(value, list):"},{"line_number":99,"context_line":"        for i, v in enumerate(value):"},{"line_number":100,"context_line":"            key_gen \u003d key_base + \u0027[%d]\u0027 % i"},{"line_number":101,"context_line":"            if isinstance(v, dict) or isinstance(v, list):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FvVk%3D","line":98,"in_reply_to":"AAAATH%2F%2Fwiw%3D","updated":"2013-10-10 13:22:38.000000000","message":"good catch, i\u0027ll add tuple.","commit_id":"301f4b075791270bb87be1850a86be665970e899"},{"author":{"_account_id":7368,"name":"Thomas Maddox","email":"me@thomasem.net","username":"thomasm"},"change_message_id":"d685c31387b6a126c8f3e010bc42cdeca65080d2","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Generated keys are fully qualified, delimited using dot notation."},{"line_number":88,"context_line":"    ie. key \u003d \u0027key.child_key.grandchild_key[0]\u0027"},{"line_number":89,"context_line":"    \"\"\""},{"line_number":90,"context_line":"    if isinstance(value, dict):"},{"line_number":91,"context_line":"        for k, v in value.iteritems():"},{"line_number":92,"context_line":"            key_gen \u003d key_base + \u0027.\u0027 + k if key_base else k"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2Fioc%3D","line":89,"updated":"2013-10-14 19:23:06.000000000","message":"This looks like it could be refactored to be DRY by grabbing your iterator \u0026 key_gen function based on the type? Not sure if that\u0027d negatively impact readability, so just throwing the thought out there. \u003d]\n\n\niterator, key_func \u003d None, None\nif type(value) is dict:\n    iterator \u003d value.iteritems()\n    key_func \u003d lambda key: \u003creturn value for key_gen\u003e\nelse:\n    iterator \u003d enumerate(value)\n    key_func \u003d lambda key: \u003creturn value for key_gen\u003e\n\nfor k, v in iterator:\n   ...","commit_id":"a30805564a8fc2ed2f50ca5c07985cc3442901fb"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"332e83cdf170726e7bb73404db1f13607c5909fe","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Generated keys are fully qualified, delimited using dot notation."},{"line_number":88,"context_line":"    ie. key \u003d \u0027key.child_key.grandchild_key[0]\u0027"},{"line_number":89,"context_line":"    \"\"\""},{"line_number":90,"context_line":"    if isinstance(value, dict):"},{"line_number":91,"context_line":"        for k, v in value.iteritems():"},{"line_number":92,"context_line":"            key_gen \u003d key_base + \u0027.\u0027 + k if key_base else k"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2Fhbk%3D","line":89,"in_reply_to":"AAAATH%2F%2Fioc%3D","updated":"2013-10-15 04:17:37.000000000","message":"you rackspace ppl really love pushing DRY eh?\n\ni\u0027ll give it a try. i don\u0027t think it\u0027ll save any lines of code but will get rid of redundancy.","commit_id":"a30805564a8fc2ed2f50ca5c07985cc3442901fb"}]}
