)]}'
{"ceilometer/api/controllers/v2.py":[{"author":{"_account_id":236,"name":"Monsyne Dragon","email":"mdragon@rackspace.com","username":"mdragon"},"change_message_id":"9f1df93d1863ef1b869e4b36ee104ad2c95f5be4","unresolved":false,"context_lines":[{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"    timestamp_fields \u003d [\"timestamp\", \"state_timestamp\"]"},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"    def __init__(self, query, db_model, internal_keys\u003dNone):"},{"line_number":1069,"context_line":"        if internal_keys is None:"},{"line_number":1070,"context_line":"            internal_keys \u003d []"},{"line_number":1071,"context_line":"        valid_keys \u003d inspect.getargspec(db_model)[0]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2FnxQ%3D","line":1068,"updated":"2014-02-11 23:03:03.000000000","message":"internal_keys is not really being passed in from anywhere. Also db_model is really being passed the __init__ from the model class, which is a bit confusing, and a bit too dependent of the implementations for the model classes, if someone uses *args or **kw args in a model class __init__, for some reason, it will break. \n\nA suggestion for a better way to do this: Have the actual model class passed in as the db_model arg, then call a classmethod on it, say db_model.get_field_names(), to get the valid_keys. You can add a default implementation of this classmethod to the storage.models.Model class that uses this inspect trick on the classes __init__, and filters out the \u0027self\u0027 arg. This way the code reliant on the way the models work is in the Model base class, where it should be, and anyone who adds a model class that does something strange can just override the classmethod in their model class to match (eliminating the need for internal_keys)","commit_id":"bd6e056f0d83ae401671cd99dc0bfae8fa89788c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bade98849f9758cd89621b616dd5d19218be785d","unresolved":false,"context_lines":[{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"    timestamp_fields \u003d [\"timestamp\", \"state_timestamp\"]"},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"    def __init__(self, query, db_model, internal_keys\u003dNone):"},{"line_number":1069,"context_line":"        if internal_keys is None:"},{"line_number":1070,"context_line":"            internal_keys \u003d []"},{"line_number":1071,"context_line":"        valid_keys \u003d inspect.getargspec(db_model)[0]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2FjZk%3D","line":1068,"in_reply_to":"AAAAUX%2F%2FnxQ%3D","updated":"2014-02-12 12:12:48.000000000","message":"Done","commit_id":"bd6e056f0d83ae401671cd99dc0bfae8fa89788c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6bd360bcba1a9061a70bed46c9f682f22c3d7950","unresolved":false,"context_lines":[{"line_number":999,"context_line":"    return regexp"},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"def _list_to_case_insensitive_regexp(items):"},{"line_number":1003,"context_line":"    regexp \u003d _list_to_regexp(items)"},{"line_number":1004,"context_line":"    regexp \u003d \"(?i)\" + regexp"},{"line_number":1005,"context_line":"    return regexp"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FR4w%3D","line":1002,"updated":"2014-02-14 09:33:05.000000000","message":"No need for two separate methods here I think, just parameterize the case sensitivity e.g.:\n\n  def _list_to_regexp(items, case_insensitive\u003dFalse):\n      regexp \u003d [\u0027^%s$\u0027 % item for item in items]\n      return (\u0027(?i)\u0027 if case_insensitive else \u0027\u0027) +\u0027|\u0027.join(regexp)","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0a66c134fc14e672da88a7b785aaf21eac6e23d2","unresolved":false,"context_lines":[{"line_number":999,"context_line":"    return regexp"},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"def _list_to_case_insensitive_regexp(items):"},{"line_number":1003,"context_line":"    regexp \u003d _list_to_regexp(items)"},{"line_number":1004,"context_line":"    regexp \u003d \"(?i)\" + regexp"},{"line_number":1005,"context_line":"    return regexp"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FRBg%3D","line":1002,"in_reply_to":"AAAAUX%2F%2FR4w%3D","updated":"2014-02-15 06:18:30.000000000","message":"It seems better to avoid Boolean parameters (it is not clean code ;) ), but I will add a regexp_prefix with \"\" as default parameter and it will solve the two functions problem.","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"9375088b8297ad1cccdd7309dadc99a6e28b1849","unresolved":false,"context_lines":[{"line_number":999,"context_line":"    return regexp"},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"def _list_to_case_insensitive_regexp(items):"},{"line_number":1003,"context_line":"    regexp \u003d _list_to_regexp(items)"},{"line_number":1004,"context_line":"    regexp \u003d \"(?i)\" + regexp"},{"line_number":1005,"context_line":"    return regexp"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FIGU%3D","line":1002,"in_reply_to":"AAAAUX%2F%2FRBg%3D","updated":"2014-02-16 19:49:10.000000000","message":"Yeap, that\u0027s better.","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6bd360bcba1a9061a70bed46c9f682f22c3d7950","unresolved":false,"context_lines":[{"line_number":1010,"context_line":"    order_directions \u003d [\"asc\", \"desc\"]"},{"line_number":1011,"context_line":"    simple_ops \u003d [\"\u003d\", \"!\u003d\", \"\u003c\", \"\u003e\", \"\u003c\u003d\", \"\u003d\u003c\", \"\u003e\u003d\", \"\u003d\u003e\"]"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"    complex_ops \u003d _list_to_case_insensitive_regexp(complex_operators)"},{"line_number":1014,"context_line":"    simple_ops \u003d _list_to_case_insensitive_regexp(simple_ops)"},{"line_number":1015,"context_line":"    order_directions \u003d _list_to_case_insensitive_regexp(order_directions)"},{"line_number":1016,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FR4Q%3D","line":1013,"updated":"2014-02-14 09:33:05.000000000","message":"complex_ops \u003d _list_to_regexp(complex_operators, case_insensitive\u003dTrue)","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0a66c134fc14e672da88a7b785aaf21eac6e23d2","unresolved":false,"context_lines":[{"line_number":1010,"context_line":"    order_directions \u003d [\"asc\", \"desc\"]"},{"line_number":1011,"context_line":"    simple_ops \u003d [\"\u003d\", \"!\u003d\", \"\u003c\", \"\u003e\", \"\u003c\u003d\", \"\u003d\u003c\", \"\u003e\u003d\", \"\u003d\u003e\"]"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"    complex_ops \u003d _list_to_case_insensitive_regexp(complex_operators)"},{"line_number":1014,"context_line":"    simple_ops \u003d _list_to_case_insensitive_regexp(simple_ops)"},{"line_number":1015,"context_line":"    order_directions \u003d _list_to_case_insensitive_regexp(order_directions)"},{"line_number":1016,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FRA0%3D","line":1013,"in_reply_to":"AAAAUX%2F%2FR4Q%3D","updated":"2014-02-15 06:18:30.000000000","message":"complex_ops \u003d _list_to_regexp(complex_operators, regexp_prefix\u003d\"(?i)\")\n\nDone","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6bd360bcba1a9061a70bed46c9f682f22c3d7950","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"    simple_ops \u003d [\"\u003d\", \"!\u003d\", \"\u003c\", \"\u003e\", \"\u003c\u003d\", \"\u003d\u003c\", \"\u003e\u003d\", \"\u003d\u003e\"]"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"    complex_ops \u003d _list_to_case_insensitive_regexp(complex_operators)"},{"line_number":1014,"context_line":"    simple_ops \u003d _list_to_case_insensitive_regexp(simple_ops)"},{"line_number":1015,"context_line":"    order_directions \u003d _list_to_case_insensitive_regexp(order_directions)"},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"    schema_value \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FR4E%3D","line":1014,"updated":"2014-02-14 09:33:05.000000000","message":"Similarly.","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0a66c134fc14e672da88a7b785aaf21eac6e23d2","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"    simple_ops \u003d [\"\u003d\", \"!\u003d\", \"\u003c\", \"\u003e\", \"\u003c\u003d\", \"\u003d\u003c\", \"\u003e\u003d\", \"\u003d\u003e\"]"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"    complex_ops \u003d _list_to_case_insensitive_regexp(complex_operators)"},{"line_number":1014,"context_line":"    simple_ops \u003d _list_to_case_insensitive_regexp(simple_ops)"},{"line_number":1015,"context_line":"    order_directions \u003d _list_to_case_insensitive_regexp(order_directions)"},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"    schema_value \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FQ%2F4%3D","line":1014,"in_reply_to":"AAAAUX%2F%2FR4E%3D","updated":"2014-02-15 06:18:30.000000000","message":"Done","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6bd360bcba1a9061a70bed46c9f682f22c3d7950","unresolved":false,"context_lines":[{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"    complex_ops \u003d _list_to_case_insensitive_regexp(complex_operators)"},{"line_number":1014,"context_line":"    simple_ops \u003d _list_to_case_insensitive_regexp(simple_ops)"},{"line_number":1015,"context_line":"    order_directions \u003d _list_to_case_insensitive_regexp(order_directions)"},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"    schema_value \u003d {"},{"line_number":1018,"context_line":"        \"oneOf\": [{\"type\": \"string\"},"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FR38%3D","line":1015,"updated":"2014-02-14 09:33:05.000000000","message":"Similarly.","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0a66c134fc14e672da88a7b785aaf21eac6e23d2","unresolved":false,"context_lines":[{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"    complex_ops \u003d _list_to_case_insensitive_regexp(complex_operators)"},{"line_number":1014,"context_line":"    simple_ops \u003d _list_to_case_insensitive_regexp(simple_ops)"},{"line_number":1015,"context_line":"    order_directions \u003d _list_to_case_insensitive_regexp(order_directions)"},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"    schema_value \u003d {"},{"line_number":1018,"context_line":"        \"oneOf\": [{\"type\": \"string\"},"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FQ%2Fw%3D","line":1015,"in_reply_to":"AAAAUX%2F%2FR38%3D","updated":"2014-02-15 06:18:30.000000000","message":"Done","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6bd360bcba1a9061a70bed46c9f682f22c3d7950","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"    timestamp_fields \u003d [\"timestamp\", \"state_timestamp\"]"},{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":"    def __init__(self, query, db_model):"},{"line_number":1072,"context_line":"        valid_keys \u003d db_model.get_field_names()"},{"line_number":1073,"context_line":"        valid_fields \u003d _list_to_regexp(valid_keys)"},{"line_number":1074,"context_line":""},{"line_number":1075,"context_line":"        self.schema_field[\"patternProperties\"] \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FR2E%3D","line":1072,"updated":"2014-02-14 09:33:05.000000000","message":"Hmmm, in the simple query case we do a few field name translations for clarity, to allow a queries be expressed in slightly simpler form e.g.:\n\n  $ ceilometer sample-list -q project\u003dadmin\n\nas opposed to:\n\n  $ ceilometer sample-list -q project_id\u003dadmin\n\nSee [1] for a full list of the translated field names. Is this logic being mirrored in the complex query case? If not, should it be?\n\n[1] https://github.com/openstack/ceilometer/blob/master/ceilometer/api/controllers/v2.py#L323","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0a66c134fc14e672da88a7b785aaf21eac6e23d2","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"    timestamp_fields \u003d [\"timestamp\", \"state_timestamp\"]"},{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":"    def __init__(self, query, db_model):"},{"line_number":1072,"context_line":"        valid_keys \u003d db_model.get_field_names()"},{"line_number":1073,"context_line":"        valid_fields \u003d _list_to_regexp(valid_keys)"},{"line_number":1074,"context_line":""},{"line_number":1075,"context_line":"        self.schema_field[\"patternProperties\"] \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FRC4%3D","line":1072,"in_reply_to":"AAAAUX%2F%2FR2E%3D","updated":"2014-02-15 06:18:30.000000000","message":"Yes, for long term it would be better to support this too. I will add this to the next version of this patch.","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"9375088b8297ad1cccdd7309dadc99a6e28b1849","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"    timestamp_fields \u003d [\"timestamp\", \"state_timestamp\"]"},{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":"    def __init__(self, query, db_model):"},{"line_number":1072,"context_line":"        valid_keys \u003d db_model.get_field_names()"},{"line_number":1073,"context_line":"        valid_fields \u003d _list_to_regexp(valid_keys)"},{"line_number":1074,"context_line":""},{"line_number":1075,"context_line":"        self.schema_field[\"patternProperties\"] \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FIGQ%3D","line":1072,"in_reply_to":"AAAAUX%2F%2FRC4%3D","updated":"2014-02-16 19:49:10.000000000","message":"OK, it\u0027s fine to push that out to a subsequent patch as long as it lands for i3.","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"}],"ceilometer/storage/models.py":[{"author":{"_account_id":7763,"name":"Alexei Kornienko","email":"akornienko@mirantis.com","username":"akornienko"},"change_message_id":"18eda74707c82f051b8222265eaace6e76f5d47a","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get_field_names(cls):"},{"line_number":50,"context_line":"        fields \u003d inspect.getargspec(cls.__init__)[0]"},{"line_number":51,"context_line":"        return set(fields) - set([\"self\"])"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FhVM%3D","line":50,"updated":"2014-02-12 16:26:19.000000000","message":"I don\u0027t think that this is a reliable way of determining actual names.\n\nAt least you should add a test that makes sure that this method will return the same fields as in the resulting model.","commit_id":"b6fa62d732d787f53a6e2035c022b40cf5563514"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cd2d5c48bf75387510fea581eae6aad40c041260","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get_field_names(cls):"},{"line_number":50,"context_line":"        fields \u003d inspect.getargspec(cls.__init__)[0]"},{"line_number":51,"context_line":"        return set(fields) - set([\"self\"])"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FYRE%3D","line":50,"in_reply_to":"AAAAUX%2F%2FhVM%3D","updated":"2014-02-13 16:07:37.000000000","message":"Done. I will add unit tests in the next patch set.","commit_id":"b6fa62d732d787f53a6e2035c022b40cf5563514"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"6bd360bcba1a9061a70bed46c9f682f22c3d7950","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return self.as_dict() \u003d\u003d other.as_dict()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get_field_names(cls):"},{"line_number":50,"context_line":"        fields \u003d inspect.getargspec(cls.__init__)[0]"},{"line_number":51,"context_line":"        return set(fields) - set([\"self\"])"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FRxQ%3D","line":49,"updated":"2014-02-14 09:33:05.000000000","message":"Should this new method be parameterized with internal_keys so that it could be re-used here:\n\n  https://github.com/openstack/ceilometer/blob/master/ceilometer/api/controllers/v2.py#L365","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"9375088b8297ad1cccdd7309dadc99a6e28b1849","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return self.as_dict() \u003d\u003d other.as_dict()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get_field_names(cls):"},{"line_number":50,"context_line":"        fields \u003d inspect.getargspec(cls.__init__)[0]"},{"line_number":51,"context_line":"        return set(fields) - set([\"self\"])"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FIGM%3D","line":49,"in_reply_to":"AAAAUX%2F%2FRHQ%3D","updated":"2014-02-16 19:49:10.000000000","message":"Ack.","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0a66c134fc14e672da88a7b785aaf21eac6e23d2","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return self.as_dict() \u003d\u003d other.as_dict()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get_field_names(cls):"},{"line_number":50,"context_line":"        fields \u003d inspect.getargspec(cls.__init__)[0]"},{"line_number":51,"context_line":"        return set(fields) - set([\"self\"])"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FRHQ%3D","line":49,"in_reply_to":"AAAAUX%2F%2FRxQ%3D","updated":"2014-02-15 06:18:30.000000000","message":"We used the internal_keys, but we used it just for removing self and we got a comment on it, so we removed it finally. We will refactor it later, if we need.","commit_id":"f9da4fd75a4176b3e9cb41f31bc13db2e9e97c62"}]}
