)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"66a32873e88ca6ca5fb05d7e3550575c5b9f2871","unresolved":false,"context_lines":[{"line_number":18,"context_line":"*) Rename plugin -\u003e configure decorator"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"*) Make configure() and deprecated() work for all objects"},{"line_number":21,"context_line":"  (not only subclasses of Plguin)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"*) Add from_func decorator that makes functional look like plugin"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba7be1f8_9737b24c","line":21,"updated":"2015-03-03 12:04:55.000000000","message":"Plguin","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":18,"context_line":"*) Rename plugin -\u003e configure decorator"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"*) Make configure() and deprecated() work for all objects"},{"line_number":21,"context_line":"  (not only subclasses of Plguin)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"*) Add from_func decorator that makes functional look like plugin"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a80dd14_25ce495b","line":21,"in_reply_to":"ba7be1f8_9737b24c","updated":"2015-03-04 23:10:05.000000000","message":"Done","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"6bf99709d63f3dc2b5bc6274136e5feb139e9e43","unresolved":false,"context_lines":[{"line_number":20,"context_line":"*) Make configure() and deprecated() work for all objects"},{"line_number":21,"context_line":"  (not only subclasses of Plugin)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"*) Add from_func decorator that makes functional look like plugin"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: I160a0021bc0e2da9aa43e26286c4e0491340fa51"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"9a80dd14_b2accfee","line":23,"updated":"2015-03-19 10:57:05.000000000","message":"s/functional/function/","commit_id":"a918307f6710d5ac6a4400ceca51fa28cbdfb3ac"},{"author":{"_account_id":8507,"name":"Mikhail Dubov","email":"mdubov@mirantis.com","username":"msdubov"},"change_message_id":"53f106581554b835c8a916a19a5de349b427a1c3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Boris Pavlovic \u003cboris@pavlovic.me\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-06-09 15:04:45 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Future improvment of plugin base"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"*) Introduce meta class that allows to bind meta data to class"},{"line_number":10,"context_line":"   Like we have for context order and hidden, for scenarios validation"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3afb71cf_c0ed5bb8","line":7,"updated":"2015-06-09 13:03:06.000000000","message":"Why \"Future improvment\"? Did you mean \"Further improvement\"?","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"336b14201bc5b56395fd8d311e7e31447b3129f3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Boris Pavlovic \u003cboris@pavlovic.me\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-06-09 15:04:45 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Future improvment of plugin base"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"*) Introduce meta class that allows to bind meta data to class"},{"line_number":10,"context_line":"   Like we have for context order and hidden, for scenarios validation"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3afb71cf_6615a047","line":7,"in_reply_to":"3afb71cf_c0ed5bb8","updated":"2015-06-09 13:31:00.000000000","message":"Done","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"}],"rally/common/plugin.py":[{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"3e8b65c990072a7ffb0b7e5addaef0fcdf3388e5","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    \"\"\"Put this decorator on function or class to mark plugin as deprecated."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    :param reason: Message that describes reason of plugin deprecation"},{"line_number":24,"context_line":"    :param rally_version: since this version of Rally plugin is deprecated"},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    def decorator(plugin):"},{"line_number":27,"context_line":"        plugin._set_deprecated(reason, rally_version)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_ee5bb751","line":24,"updated":"2015-03-03 14:28:29.000000000","message":"how about \"Deprecated since this version of Rally\"?","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    \"\"\"Put this decorator on function or class to mark plugin as deprecated."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    :param reason: Message that describes reason of plugin deprecation"},{"line_number":24,"context_line":"    :param rally_version: since this version of Rally plugin is deprecated"},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    def decorator(plugin):"},{"line_number":27,"context_line":"        plugin._set_deprecated(reason, rally_version)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_ba800bc0","line":24,"in_reply_to":"ba7be1f8_ee5bb751","updated":"2015-03-04 23:10:05.000000000","message":"yep sounds better","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"66a32873e88ca6ca5fb05d7e3550575c5b9f2871","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def from_func(func):"},{"line_number":47,"context_line":"    \"\"\"Adds behavior of plugin to any function."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    :param func: function that should have plugin behavior"},{"line_number":50,"context_line":"    :returns: Original but modified func"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_b7267614","line":47,"updated":"2015-03-03 12:04:55.000000000","message":"what?","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def from_func(func):"},{"line_number":47,"context_line":"    \"\"\"Adds behavior of plugin to any function."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    :param func: function that should have plugin behavior"},{"line_number":50,"context_line":"    :returns: Original but modified func"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_7ac85322","line":47,"in_reply_to":"ba7be1f8_89f075fe","updated":"2015-03-04 23:10:05.000000000","message":"what? \u003d) \n\nI will add bigger description here.","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"3e8b65c990072a7ffb0b7e5addaef0fcdf3388e5","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def from_func(func):"},{"line_number":47,"context_line":"    \"\"\"Adds behavior of plugin to any function."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    :param func: function that should have plugin behavior"},{"line_number":50,"context_line":"    :returns: Original but modified func"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_89f075fe","line":47,"in_reply_to":"ba7be1f8_b7267614","updated":"2015-03-03 14:28:29.000000000","message":"+what?","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"3e8b65c990072a7ffb0b7e5addaef0fcdf3388e5","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    \"\"\"Adds behavior of plugin to any function."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    :param func: function that should have plugin behavior"},{"line_number":50,"context_line":"    :returns: Original but modified func"},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    # It\u0027s better to bind new class for every function"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_e96f3190","line":50,"updated":"2015-03-03 14:28:29.000000000","message":"either original, or modified. can\u0027t be both","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    \"\"\"Adds behavior of plugin to any function."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    :param func: function that should have plugin behavior"},{"line_number":50,"context_line":"    :returns: Original but modified func"},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    # It\u0027s better to bind new class for every function"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_dad3ffd2","line":50,"in_reply_to":"ba7be1f8_e96f3190","updated":"2015-03-04 23:10:05.000000000","message":"I will rephrase thsi","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"3e8b65c990072a7ffb0b7e5addaef0fcdf3388e5","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    # It\u0027s better to bind new class for every function"},{"line_number":54,"context_line":"    # And avoid problems with not proper written plugins that"},{"line_number":55,"context_line":"    # changes directly meta."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @configure(name\u003dfunc.__name__)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_e992d155","line":54,"updated":"2015-03-03 14:28:29.000000000","message":"s/not proper/improperly/","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"66a32873e88ca6ca5fb05d7e3550575c5b9f2871","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    # It\u0027s better to bind new class for every function"},{"line_number":54,"context_line":"    # And avoid problems with not proper written plugins that"},{"line_number":55,"context_line":"    # changes directly meta."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @configure(name\u003dfunc.__name__)"},{"line_number":58,"context_line":"    class FuncPlugin(Plugin):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_5718dad2","line":55,"updated":"2015-03-03 12:04:55.000000000","message":"meta directly","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"3e8b65c990072a7ffb0b7e5addaef0fcdf3388e5","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    func._plugin \u003d FuncPlugin()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    for field in dir(func._plugin):"},{"line_number":64,"context_line":"        if not field.startswith(\"__\"):"},{"line_number":65,"context_line":"            obj \u003d getattr(func._plugin, field)"},{"line_number":66,"context_line":"            if callable(obj):"},{"line_number":67,"context_line":"                setattr(func, field, obj)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_a9b8d975","line":64,"updated":"2015-03-03 14:28:29.000000000","message":"for field in dir(func._plugin) if not field.startswith(\"__\"):","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    func._plugin \u003d FuncPlugin()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    for field in dir(func._plugin):"},{"line_number":64,"context_line":"        if not field.startswith(\"__\"):"},{"line_number":65,"context_line":"            obj \u003d getattr(func._plugin, field)"},{"line_number":66,"context_line":"            if callable(obj):"},{"line_number":67,"context_line":"                setattr(func, field, obj)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_9ac267e7","line":64,"in_reply_to":"ba7be1f8_a9b8d975","updated":"2015-03-04 23:10:05.000000000","message":"it\u0027s invalid syntax. \n\nYou can\u0027t just put this in for. \n\n\n  for field in [dir(func._plugin) if not field.startswith(\"__\")]:\n    pass\n\nbut it doesn\u0027t look nice. \n\nSo I will keep old code","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"3e8b65c990072a7ffb0b7e5addaef0fcdf3388e5","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    return func"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class MetaMixin(object):"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @classmethod"},{"line_number":75,"context_line":"    def _meta_init(cls):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_7b7064a4","line":72,"updated":"2015-03-03 14:28:29.000000000","message":"some docstring would be appreciated.\nMeta stuff is highly non-trivial","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"3e8b65c990072a7ffb0b7e5addaef0fcdf3388e5","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @classmethod"},{"line_number":75,"context_line":"    def _meta_init(cls):"},{"line_number":76,"context_line":"        cls._meta \u003d {}"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @classmethod"},{"line_number":79,"context_line":"    def _meta_is_inited(cls):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_dbeeb0b4","line":76,"updated":"2015-03-03 14:28:29.000000000","message":"IIUC, you could do:\n\n    cls._meta_set \u003d cls._meta.__setitem__\n    cls._meta_get \u003d cls._meta.get\n\nAnd avoid L86-L95 (including the ReferenceError)\n\nAlso, why not use _meta dict directly instead of define new methods to a dict API?\nboth _meta and _meta_set/get are \"private\"","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @classmethod"},{"line_number":75,"context_line":"    def _meta_init(cls):"},{"line_number":76,"context_line":"        cls._meta \u003d {}"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @classmethod"},{"line_number":79,"context_line":"    def _meta_is_inited(cls):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_ecd6dec4","line":76,"in_reply_to":"ba7be1f8_dbeeb0b4","updated":"2015-03-04 23:10:05.000000000","message":"Nope we can\u0027t use such approach. \n\nI added docstrings that explains why.","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"3e8b65c990072a7ffb0b7e5addaef0fcdf3388e5","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        if not hasattr(cls, \"_meta\"):"},{"line_number":81,"context_line":"            return False"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        return not (cls._meta is getattr(super(cls, cls), \"_meta\", None))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @classmethod"},{"line_number":86,"context_line":"    def _meta_get(cls, key, default\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_7bcce4bb","line":83,"updated":"2015-03-03 14:28:29.000000000","message":"None is default of getattr.\nI don\u0027t understand the logic here.\ncould you please add doc?","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        if not hasattr(cls, \"_meta\"):"},{"line_number":81,"context_line":"            return False"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        return not (cls._meta is getattr(super(cls, cls), \"_meta\", None))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @classmethod"},{"line_number":86,"context_line":"    def _meta_get(cls, key, default\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_6c74aefd","line":83,"in_reply_to":"ba7be1f8_7bcce4bb","updated":"2015-03-04 23:10:05.000000000","message":"Done","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":8507,"name":"Mikhail Dubov","email":"mdubov@mirantis.com","username":"msdubov"},"change_message_id":"b2aa1dd51ebd58f98fe1e57c1e188338562e83f2","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @classmethod"},{"line_number":86,"context_line":"    def _meta_get(cls, key, default\u003dNone):"},{"line_number":87,"context_line":"        return cls._meta.get(key, default)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @classmethod"},{"line_number":90,"context_line":"    def _meta_set(cls, key, value):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_df6e3696","line":87,"updated":"2015-03-04 12:11:47.000000000","message":"I think the cls._meta_is_inited() check should be here too","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @classmethod"},{"line_number":86,"context_line":"    def _meta_get(cls, key, default\u003dNone):"},{"line_number":87,"context_line":"        return cls._meta.get(key, default)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @classmethod"},{"line_number":90,"context_line":"    def _meta_set(cls, key, value):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_2c6ab61a","line":87,"in_reply_to":"9a80dd14_df6e3696","updated":"2015-03-04 23:10:05.000000000","message":"Done","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":8507,"name":"Mikhail Dubov","email":"mdubov@mirantis.com","username":"msdubov"},"change_message_id":"b2aa1dd51ebd58f98fe1e57c1e188338562e83f2","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def _configure(cls, name):"},{"line_number":103,"context_line":"        cls._meta_init()"},{"line_number":104,"context_line":"        cls._meta_set(\"name\", name)"},{"line_number":105,"context_line":"        return cls"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @classmethod"},{"line_number":108,"context_line":"    def _set_deprecated(cls, reason, rally_version):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_ffc3fa35","line":105,"updated":"2015-03-04 12:11:47.000000000","message":"Why do you need to return cls? This is not used anywhere as far as I can see","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def _configure(cls, name):"},{"line_number":103,"context_line":"        cls._meta_init()"},{"line_number":104,"context_line":"        cls._meta_set(\"name\", name)"},{"line_number":105,"context_line":"        return cls"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @classmethod"},{"line_number":108,"context_line":"    def _set_deprecated(cls, reason, rally_version):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_4cfc4a3f","line":105,"in_reply_to":"9a80dd14_ffc3fa35","updated":"2015-03-04 23:10:05.000000000","message":"It\u0027s just nice pattern. Maybe someday we will need this.","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":8507,"name":"Mikhail Dubov","email":"mdubov@mirantis.com","username":"msdubov"},"change_message_id":"b2aa1dd51ebd58f98fe1e57c1e188338562e83f2","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            \"reason\": reason,"},{"line_number":111,"context_line":"            \"rally_version\": rally_version"},{"line_number":112,"context_line":"        })"},{"line_number":113,"context_line":"        return cls"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @classmethod"},{"line_number":116,"context_line":"    def get(cls, name):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_1fc1ae2e","line":113,"updated":"2015-03-04 12:11:47.000000000","message":"Same here","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            \"reason\": reason,"},{"line_number":111,"context_line":"            \"rally_version\": rally_version"},{"line_number":112,"context_line":"        })"},{"line_number":113,"context_line":"        return cls"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @classmethod"},{"line_number":116,"context_line":"    def get(cls, name):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_ac9a2612","line":113,"in_reply_to":"9a80dd14_1fc1ae2e","updated":"2015-03-04 23:10:05.000000000","message":"Same here","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"3e8b65c990072a7ffb0b7e5addaef0fcdf3388e5","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        return list(utils.itersubclasses(cls))"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    @classmethod"},{"line_number":128,"context_line":"    def get_name(cls):"},{"line_number":129,"context_line":"        return cls._meta_get(\"name\")"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_1b4be887","line":128,"updated":"2015-03-03 14:28:29.000000000","message":"please move get_name above \"get()\" to avoid unnecessary diff","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        return list(utils.itersubclasses(cls))"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    @classmethod"},{"line_number":128,"context_line":"    def get_name(cls):"},{"line_number":129,"context_line":"        return cls._meta_get(\"name\")"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_2cad5632","line":128,"in_reply_to":"ba7be1f8_1b4be887","updated":"2015-03-04 23:10:05.000000000","message":"I really would like to keep such order of methods. It\u0027s not so big change to make separated change for just moving this method.","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbce838252f311c973c9bfbf11b7f84bb0966c84","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def decorator(plugin):"},{"line_number":40,"context_line":"        plugin._configure(name)"},{"line_number":41,"context_line":"        return plugin"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    return decorator"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_005e93e6","line":40,"updated":"2015-03-04 23:31:11.000000000","message":"_configure returns the class.\n\nreturn plugin._configure(name)","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"df65853e2e38d3eba2aecb46e43cc0c51763c7b0","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def decorator(plugin):"},{"line_number":40,"context_line":"        plugin._configure(name)"},{"line_number":41,"context_line":"        return plugin"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    return decorator"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_566cd19c","line":40,"in_reply_to":"9a80dd14_005e93e6","updated":"2015-03-05 00:21:43.000000000","message":"This won\u0027t work in case of @plugin.from_func","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbce838252f311c973c9bfbf11b7f84bb0966c84","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    For example,"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @from_func"},{"line_number":67,"context_line":"    def my_plugin_like_func(a, b):"},{"line_number":68,"context_line":"        pass"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_e0589ffc","line":66,"updated":"2015-03-04 23:31:11.000000000","message":"Please @plugin.from_func.","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"df65853e2e38d3eba2aecb46e43cc0c51763c7b0","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    For example,"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @from_func"},{"line_number":67,"context_line":"    def my_plugin_like_func(a, b):"},{"line_number":68,"context_line":"        pass"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_9674899d","line":66,"in_reply_to":"9a80dd14_e0589ffc","updated":"2015-03-05 00:21:43.000000000","message":"Done","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbce838252f311c973c9bfbf11b7f84bb0966c84","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    So the simplest way to understand issue is next:"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        \u003e class A(object):"},{"line_number":112,"context_line":"        \u003e     _meta \u003d {}"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_a074e79c","line":111,"updated":"2015-03-04 23:31:11.000000000","message":"Please use \u0027\u003e\u003e\u003e\u0027.","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"df65853e2e38d3eba2aecb46e43cc0c51763c7b0","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    So the simplest way to understand issue is next:"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        \u003e class A(object):"},{"line_number":112,"context_line":"        \u003e     _meta \u003d {}"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_b6a0adf5","line":111,"in_reply_to":"9a80dd14_a074e79c","updated":"2015-03-05 00:21:43.000000000","message":"Done","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbce838252f311c973c9bfbf11b7f84bb0966c84","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    @classmethod"},{"line_number":136,"context_line":"    def _meta_is_inited(cls):"},{"line_number":137,"context_line":"        \"\"\"Check is meta initialized."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        It means that this class has own cls._meta object (not pointer"},{"line_number":140,"context_line":"        to parent cls._meta)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_801a836c","line":137,"updated":"2015-03-04 23:31:11.000000000","message":"\u0027check if meta is\u0027","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"df65853e2e38d3eba2aecb46e43cc0c51763c7b0","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    @classmethod"},{"line_number":136,"context_line":"    def _meta_is_inited(cls):"},{"line_number":137,"context_line":"        \"\"\"Check is meta initialized."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        It means that this class has own cls._meta object (not pointer"},{"line_number":140,"context_line":"        to parent cls._meta)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_16afb9e4","line":137,"in_reply_to":"9a80dd14_801a836c","updated":"2015-03-05 00:21:43.000000000","message":"Done","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbce838252f311c973c9bfbf11b7f84bb0966c84","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        To do this we should check 2 things:"},{"line_number":143,"context_line":"        1) cls has attribute _meta"},{"line_number":144,"context_line":"        2) meta is not"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"         that cls._meta is not the same object"},{"line_number":147,"context_line":"        as parent cls._meta."},{"line_number":148,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_2041d739","line":145,"updated":"2015-03-04 23:31:11.000000000","message":"?","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"df65853e2e38d3eba2aecb46e43cc0c51763c7b0","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        To do this we should check 2 things:"},{"line_number":143,"context_line":"        1) cls has attribute _meta"},{"line_number":144,"context_line":"        2) meta is not"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"         that cls._meta is not the same object"},{"line_number":147,"context_line":"        as parent cls._meta."},{"line_number":148,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_d67c4175","line":145,"in_reply_to":"9a80dd14_2041d739","updated":"2015-03-05 00:21:43.000000000","message":"Done","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"fbce838252f311c973c9bfbf11b7f84bb0966c84","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        :param name: Plugin\u0027s name"},{"line_number":211,"context_line":"        \"\"\""},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        plugins \u003d []"},{"line_number":214,"context_line":"        for plugin in cls.get_all():"},{"line_number":215,"context_line":"            if plugin.get_name() \u003d\u003d name:"},{"line_number":216,"context_line":"                plugins.append(plugin)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_4506dd21","line":213,"updated":"2015-03-04 23:31:11.000000000","message":"comprehension?","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"df65853e2e38d3eba2aecb46e43cc0c51763c7b0","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        :param name: Plugin\u0027s name"},{"line_number":211,"context_line":"        \"\"\""},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        plugins \u003d []"},{"line_number":214,"context_line":"        for plugin in cls.get_all():"},{"line_number":215,"context_line":"            if plugin.get_name() \u003d\u003d name:"},{"line_number":216,"context_line":"                plugins.append(plugin)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_96e9e91c","line":213,"in_reply_to":"9a80dd14_4506dd21","updated":"2015-03-05 00:21:43.000000000","message":"Done","commit_id":"00204e7fb381587cc8b78450e7df748d1c940f5b"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"b0b9b9c02f856c0ff9b4f43d707495f918ff4437","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    return decorator"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def configure(name):"},{"line_number":34,"context_line":"    \"\"\"Use this decorator to configure plugin."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    :param name: name of plugin that is used for searching purpose"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_e1a097a7","line":33,"updated":"2015-03-11 14:24:25.000000000","message":"IMHO this decorator is not required at all.\nSince we use instantiation at line 90, we can put configuration directly to Plugin.__init__(), for example:\n\nline 90:\n func._plugin \u003d FuncPlugin(name\u003dfunc.__name__)","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    return decorator"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def configure(name):"},{"line_number":34,"context_line":"    \"\"\"Use this decorator to configure plugin."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    :param name: name of plugin that is used for searching purpose"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_1053653a","line":33,"in_reply_to":"9a80dd14_14ca47a1","updated":"2015-03-16 23:33:03.000000000","message":"What? Did you even read code before writing this? \n\nPlease do next things:\n\n  1) Read full commit message\n  2) Try to understand task\n  3) Read code changes from begging to end. \n  4) Compare what you understand and what you read to understand all use cases that we need to cover. \n\nOnly after  you finish all those 4 steps, start suggesting people how to refactor fully their code to make something that doesn\u0027t resolve any of their use cases.","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"08bd39d029884987c4cff4ac5bcf0e4c6eb2b3ba","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    return decorator"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def configure(name):"},{"line_number":34,"context_line":"    \"\"\"Use this decorator to configure plugin."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    :param name: name of plugin that is used for searching purpose"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_14ca47a1","line":33,"in_reply_to":"9a80dd14_e1a097a7","updated":"2015-03-11 14:33:11.000000000","message":"To implement the above, MetaMixin.__new__() is enough:\n\n class MetaMixin(object):\n    def __new__(cls, *args, **kwargs):\n        cls._configure(**kwargs)\n        return cls","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def configure(name):"},{"line_number":34,"context_line":"    \"\"\"Use this decorator to configure plugin."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    :param name: name of plugin that is used for searching purpose"},{"line_number":37,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_eb155b49","line":34,"updated":"2015-03-08 11:36:51.000000000","message":"this is less informative than previous version.\nMaybe:\n   \"...configure plugin\u0027s attributes\"","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def configure(name):"},{"line_number":34,"context_line":"    \"\"\"Use this decorator to configure plugin."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    :param name: name of plugin that is used for searching purpose"},{"line_number":37,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_c9e128fe","line":34,"in_reply_to":"9a80dd14_eb155b49","updated":"2015-03-16 23:33:03.000000000","message":"Done","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def from_func(func):"},{"line_number":47,"context_line":"    \"\"\"Adds behavior of plugin to function."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    Rally benchmark scenarios are different from all other plugins in Rally."},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_ae2d3197","line":47,"updated":"2015-03-08 11:36:51.000000000","message":"Maybe - \"Converts function/method to plugin\"?\nIf this is wrong, then I\u0027ve completely misread the doc, and one of us (me or the docstring) should be replaced :)","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def from_func(func):"},{"line_number":47,"context_line":"    \"\"\"Adds behavior of plugin to function."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    Rally benchmark scenarios are different from all other plugins in Rally."},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_1fefe9ea","line":47,"in_reply_to":"9a80dd14_ae2d3197","updated":"2015-03-16 23:33:03.000000000","message":"let me try one more try to rephrase.","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    1 class can contain any amount of scenarios that are just methods"},{"line_number":54,"context_line":"    of this class."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    To make code of Rally cleaner these methods should look/work like other"},{"line_number":57,"context_line":"    Plugins."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    This decorator makes all dirty work for us, it creates dynamically new"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_4b04a717","line":56,"updated":"2015-03-08 11:36:51.000000000","message":"\"To make Rally code cleaner...\"","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    1 class can contain any amount of scenarios that are just methods"},{"line_number":54,"context_line":"    of this class."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    To make code of Rally cleaner these methods should look/work like other"},{"line_number":57,"context_line":"    Plugins."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    This decorator makes all dirty work for us, it creates dynamically new"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_a9923456","line":56,"in_reply_to":"9a80dd14_4b04a717","updated":"2015-03-16 23:33:03.000000000","message":"Done","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    This decorator makes all dirty work for us, it creates dynamically new"},{"line_number":60,"context_line":"    class, adds plugin instance and aliases for all non-private methods of"},{"line_number":61,"context_line":"    Plugin instance to passed function."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    For example,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_2e122157","line":61,"updated":"2015-03-08 11:36:51.000000000","message":"sentence is unclear","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    This decorator makes all dirty work for us, it creates dynamically new"},{"line_number":60,"context_line":"    class, adds plugin instance and aliases for all non-private methods of"},{"line_number":61,"context_line":"    Plugin instance to passed function."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    For example,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_3fecadf3","line":61,"in_reply_to":"9a80dd14_2e122157","updated":"2015-03-16 23:33:03.000000000","message":"Done","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    # It\u0027s better to bind new class for every function"},{"line_number":83,"context_line":"    # And avoid problems with not proper written plugins that"},{"line_number":84,"context_line":"    # changes directly meta."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @configure(name\u003dfunc.__name__)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_2e406133","line":83,"updated":"2015-03-08 11:36:51.000000000","message":"from patchset #3: s/not proper/improperly/\n?","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    # It\u0027s better to bind new class for every function"},{"line_number":83,"context_line":"    # And avoid problems with not proper written plugins that"},{"line_number":84,"context_line":"    # changes directly meta."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @configure(name\u003dfunc.__name__)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_a9795432","line":83,"in_reply_to":"9a80dd14_2e406133","updated":"2015-03-16 23:33:03.000000000","message":"Done","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    # It\u0027s better to bind new class for every function"},{"line_number":83,"context_line":"    # And avoid problems with not proper written plugins that"},{"line_number":84,"context_line":"    # changes directly meta."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @configure(name\u003dfunc.__name__)"},{"line_number":87,"context_line":"    class FuncPlugin(Plugin):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_8e4f8d6a","line":84,"updated":"2015-03-08 11:36:51.000000000","message":"see @Pavel\u0027s comment - \"meta directly\"","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    # It\u0027s better to bind new class for every function"},{"line_number":83,"context_line":"    # And avoid problems with not proper written plugins that"},{"line_number":84,"context_line":"    # changes directly meta."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @configure(name\u003dfunc.__name__)"},{"line_number":87,"context_line":"    class FuncPlugin(Plugin):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_298d642b","line":84,"in_reply_to":"9a80dd14_8e4f8d6a","updated":"2015-03-16 23:33:03.000000000","message":"Done","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    # And avoid problems with not proper written plugins that"},{"line_number":84,"context_line":"    # changes directly meta."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @configure(name\u003dfunc.__name__)"},{"line_number":87,"context_line":"    class FuncPlugin(Plugin):"},{"line_number":88,"context_line":"        pass"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_bc38ab3e","line":86,"updated":"2015-03-16 23:33:03.000000000","message":"Replaced this code to not call @configure. \n\nWe have only one place where we should use this (benchmark scenarios) and we will need to use there another name. (\u003ccls_name\u003e.\u003cmethod_name\u003e)","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    func._plugin \u003d FuncPlugin()"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    for field in dir(func._plugin):"},{"line_number":93,"context_line":"        if not field.startswith(\"__\"):"},{"line_number":94,"context_line":"            obj \u003d getattr(func._plugin, field)"},{"line_number":95,"context_line":"            if callable(obj):"},{"line_number":96,"context_line":"                setattr(func, field, obj)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_ce6c25d3","line":93,"updated":"2015-03-08 11:36:51.000000000","message":"I like the list comprehension option better. But no reason to nit","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    func._plugin \u003d FuncPlugin()"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    for field in dir(func._plugin):"},{"line_number":93,"context_line":"        if not field.startswith(\"__\"):"},{"line_number":94,"context_line":"            obj \u003d getattr(func._plugin, field)"},{"line_number":95,"context_line":"            if callable(obj):"},{"line_number":96,"context_line":"                setattr(func, field, obj)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_4907f881","line":93,"in_reply_to":"9a80dd14_ce6c25d3","updated":"2015-03-16 23:33:03.000000000","message":"I have 2 rules when I don\u0027t use list comprehensions: \n\n  - I don\u0027t use generated results (like here) \n  - A lot of conditions that makes code unreadable (like here) \n\nSo I would prefer to keep old style \"for\" here","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":101,"context_line":"class MetaMixin(object):"},{"line_number":102,"context_line":"    \"\"\"Safe way to store meta information related to class object."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    We are storing information to class object not instance."},{"line_number":105,"context_line":"    This is the reason why we are not using just directly dict instance bind"},{"line_number":106,"context_line":"    to class and need this MetaMixn."},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_0e6abdb2","line":104,"updated":"2015-03-08 11:36:51.000000000","message":"s/\"class object not instance\"/\"class object instead of the instance\"","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":101,"context_line":"class MetaMixin(object):"},{"line_number":102,"context_line":"    \"\"\"Safe way to store meta information related to class object."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    We are storing information to class object not instance."},{"line_number":105,"context_line":"    This is the reason why we are not using just directly dict instance bind"},{"line_number":106,"context_line":"    to class and need this MetaMixn."},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_c9392841","line":104,"in_reply_to":"9a80dd14_0e6abdb2","updated":"2015-03-16 23:33:03.000000000","message":"Done","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    We are storing information to class object not instance."},{"line_number":105,"context_line":"    This is the reason why we are not using just directly dict instance bind"},{"line_number":106,"context_line":"    to class and need this MetaMixn."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    So the simplest way to understand issue is next:"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_2e6781ea","line":106,"updated":"2015-03-08 11:36:51.000000000","message":"these to lines are unclear","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    We are storing information to class object not instance."},{"line_number":105,"context_line":"    This is the reason why we are not using just directly dict instance bind"},{"line_number":106,"context_line":"    to class and need this MetaMixn."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    So the simplest way to understand issue is next:"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_5fe086cc","line":106,"in_reply_to":"9a80dd14_2e6781ea","updated":"2015-03-16 23:33:03.000000000","message":"Done","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"b0b9b9c02f856c0ff9b4f43d707495f918ff4437","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    \"\"\""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @classmethod"},{"line_number":131,"context_line":"    def _meta_init(cls):"},{"line_number":132,"context_line":"        \"\"\"Initialize meta for this class.\"\"\""},{"line_number":133,"context_line":"        cls._meta \u003d {}"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_6a2481c6","line":131,"updated":"2015-03-11 14:24:25.000000000","message":"There are redundant code, I propose to get rid of `_met_init\u0027 and `_meta_is_inited\u0027 at all:\n\n    @classmethod\n    def _meta_ensure_is_inited(cls):\n        \"\"\"Guarantee that meta is initialized.\n\n        It means that this class has own cls._meta object (not pointer\n        to parent cls._meta)\n\n        To do this we should check 2 things:\n        1) cls has attribute _meta\n        2) cls._meta is not pointer to parent._meta\n        \"\"\"\n        if (not hasattr(cls, \"_meta\")\n                or (cls._meta is getattr(super(cls, cls), \"_meta\", None))):\n            cls._meta \u003d {}","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    \"\"\""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @classmethod"},{"line_number":131,"context_line":"    def _meta_init(cls):"},{"line_number":132,"context_line":"        \"\"\"Initialize meta for this class.\"\"\""},{"line_number":133,"context_line":"        cls._meta \u003d {}"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_dc3c7f33","line":131,"in_reply_to":"9a80dd14_6a2481c6","updated":"2015-03-16 23:33:03.000000000","message":"Methods are not redundant at all. \n\nI don\u0027t want to add implicit behavior that hides bugs in code. \n\nIf you didn\u0027t call _meta_init() it means that you didn\u0027t call configure()","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        if not hasattr(cls, \"_meta\"):"},{"line_number":148,"context_line":"            return False"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        return not (cls._meta is getattr(super(cls, cls), \"_meta\", None))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @classmethod"},{"line_number":153,"context_line":"    def _meta_ensure_is_inited(cls):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_eea809dd","line":150,"updated":"2015-03-08 11:36:51.000000000","message":"Never would have figured this out alone. tnx for the doc","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        if not hasattr(cls, \"_meta\"):"},{"line_number":148,"context_line":"            return False"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        return not (cls._meta is getattr(super(cls, cls), \"_meta\", None))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @classmethod"},{"line_number":153,"context_line":"    def _meta_ensure_is_inited(cls):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_1fd60ef2","line":150,"in_reply_to":"9a80dd14_eea809dd","updated":"2015-03-16 23:33:03.000000000","message":"np","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"b0b9b9c02f856c0ff9b4f43d707495f918ff4437","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    \"\"\"Base class for all Plugins in Rally.\"\"\""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    @classmethod"},{"line_number":176,"context_line":"    def _configure(cls, name):"},{"line_number":177,"context_line":"        \"\"\"Init plugin and set common meta information."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        For now it sets only name of plguin, that is actually identifier."}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_c130f3ea","line":176,"updated":"2015-03-11 14:24:25.000000000","message":"This signature is not flexible. If we decide to configure more parameters, then positional arguments look not a good approach.\n\nI propose using **kwargs for that:\n\n    @classmethod\n    def _configure(cls, **kwargs):\n        \"\"\"Init plugin and set common meta information.\n\n        For now it sets only name of plguin, that is actually identifier.\n\n        :param **kwargs: configuration parameters:\n                         name: Plugin name str (mandatory)\n        \"\"\"\n        cls._meta_set(\"name\", kwargs[\"name\"])\n        return cls","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    \"\"\"Base class for all Plugins in Rally.\"\"\""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    @classmethod"},{"line_number":176,"context_line":"    def _configure(cls, name):"},{"line_number":177,"context_line":"        \"\"\"Init plugin and set common meta information."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        For now it sets only name of plguin, that is actually identifier."}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_9f0af977","line":176,"in_reply_to":"9a80dd14_c130f3ea","updated":"2015-03-16 23:33:03.000000000","message":"Alex, \n\nPositional argument for REQUIRED arguments are the BEST SOLUTION that is possible. Because it is the code that is tested on module load (so you even don\u0027t need to write unit tests) \n\n\nThere are 2 serious reasons why I don\u0027t want to add **kwargs:\n\n  - We don\u0027t need them\n  - We can add them in any moment of time with keeping old signature\n\nPlease take a look at this video: \n\n   http://www.youtube.com/watch?v\u003do9pEzgHorH0","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    def _configure(cls, name):"},{"line_number":177,"context_line":"        \"\"\"Init plugin and set common meta information."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        For now it sets only name of plguin, that is actually identifier."},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        :param name: Plugin name"},{"line_number":182,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_eef649f8","line":179,"updated":"2015-03-08 11:36:51.000000000","message":"plugin","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    def _configure(cls, name):"},{"line_number":177,"context_line":"        \"\"\"Init plugin and set common meta information."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        For now it sets only name of plguin, that is actually identifier."},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        :param name: Plugin name"},{"line_number":182,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_5f5ec17a","line":179,"in_reply_to":"9a80dd14_eef649f8","updated":"2015-03-16 23:33:03.000000000","message":"Done","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"b0b9b9c02f856c0ff9b4f43d707495f918ff4437","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        :param name: Plugin name"},{"line_number":182,"context_line":"        \"\"\""},{"line_number":183,"context_line":"        cls._meta_init()"},{"line_number":184,"context_line":"        cls._meta_set(\"name\", name)"},{"line_number":185,"context_line":"        return cls"},{"line_number":186,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_be479a4a","line":183,"updated":"2015-03-11 14:24:25.000000000","message":"if my comment above (line 131) is applied, then this line can be removed","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        :param name: Plugin name"},{"line_number":182,"context_line":"        \"\"\""},{"line_number":183,"context_line":"        cls._meta_init()"},{"line_number":184,"context_line":"        cls._meta_set(\"name\", name)"},{"line_number":185,"context_line":"        return cls"},{"line_number":186,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_7f7c65ec","line":183,"in_reply_to":"9a80dd14_be479a4a","updated":"2015-03-16 23:33:03.000000000","message":"Read my comment above.","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"279847a0dcb382122285d2ba1e6cbdad7707457b","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        :param name: Plugin\u0027s name"},{"line_number":209,"context_line":"        \"\"\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        plugins \u003d [p for p in cls.get_all() if p.get_name() \u003d\u003d name]"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        if not plugins:"},{"line_number":214,"context_line":"            raise exceptions.NoSuchPlugin(name\u003dname)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_d0070d1c","line":211,"updated":"2015-03-10 16:29:05.000000000","message":"What if we have plugins with identical names?","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"3c35fe0ef43213576083beb79d06a66037f929d7","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        :param name: Plugin\u0027s name"},{"line_number":209,"context_line":"        \"\"\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        plugins \u003d [p for p in cls.get_all() if p.get_name() \u003d\u003d name]"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        if not plugins:"},{"line_number":214,"context_line":"            raise exceptions.NoSuchPlugin(name\u003dname)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_eb3ff784","line":211,"in_reply_to":"9a80dd14_d0070d1c","updated":"2015-03-15 08:12:57.000000000","message":"+1\ncould be enforced in init?","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        :param name: Plugin\u0027s name"},{"line_number":209,"context_line":"        \"\"\""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        plugins \u003d [p for p in cls.get_all() if p.get_name() \u003d\u003d name]"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        if not plugins:"},{"line_number":214,"context_line":"            raise exceptions.NoSuchPlugin(name\u003dname)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_fc9dc358","line":211,"in_reply_to":"9a80dd14_eb3ff784","updated":"2015-03-16 23:33:03.000000000","message":"@Sergey, @Yair \n\nOkay replaced this code. Now it\u0027s impossible to call _configure 2 times with the same name.","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    @classmethod"},{"line_number":221,"context_line":"    def get_all(cls):"},{"line_number":222,"context_line":"        \"\"\"Return all plugins.\"\"\""},{"line_number":223,"context_line":"        return list(utils.itersubclasses(cls))"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_6e725912","line":222,"updated":"2015-03-08 11:36:51.000000000","message":"wouldn\u0027t this return only plugins that subclass this plugin? not all rally plugins.","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    @classmethod"},{"line_number":221,"context_line":"    def get_all(cls):"},{"line_number":222,"context_line":"        \"\"\"Return all plugins.\"\"\""},{"line_number":223,"context_line":"        return list(utils.itersubclasses(cls))"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_7ce0f3cc","line":222,"in_reply_to":"9a80dd14_6e725912","updated":"2015-03-16 23:33:03.000000000","message":"Yep that is the idea of isolation between: \n\nscenario, context, runners, sla, and other pluigns in rally.","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    @classmethod"},{"line_number":221,"context_line":"    def get_all(cls):"},{"line_number":222,"context_line":"        \"\"\"Return all plugins.\"\"\""},{"line_number":223,"context_line":"        return list(utils.itersubclasses(cls))"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    @classmethod"},{"line_number":226,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_1c7537fa","line":223,"updated":"2015-03-16 23:33:03.000000000","message":"I added condition (to skip all non-initialized plugins)","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"6bf99709d63f3dc2b5bc6274136e5feb139e9e43","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def deprecated(reason, rally_version):"},{"line_number":21,"context_line":"    \"\"\"Marks plugin as deprecated."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    :param reason: Message that describes reason of plugin deprecation"},{"line_number":24,"context_line":"    :param rally_version: Deprecated since this version of Rally"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_1283db56","line":21,"updated":"2015-03-19 10:57:05.000000000","message":"s/Marks/Mark/   (ref. PEP257)","commit_id":"a918307f6710d5ac6a4400ceca51fa28cbdfb3ac"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"6bf99709d63f3dc2b5bc6274136e5feb139e9e43","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        \u003e\u003e\u003e class A(MetaMixin):"},{"line_number":120,"context_line":"        \u003e\u003e\u003e    pass"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        A.set_meta()   #  Raises reference error"},{"line_number":123,"context_line":"    \"\"\""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_35bc49bb","line":122,"range":{"start_line":122,"start_character":8,"end_line":122,"end_character":21},"updated":"2015-03-19 10:57:05.000000000","message":"A._meta_set(\"foo\", \"bar\") # or A._meta_get(\"foo\")","commit_id":"a918307f6710d5ac6a4400ceca51fa28cbdfb3ac"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"744542c7180bf5d10943fbefcf733f52a1d34ca2","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    @classmethod"},{"line_number":155,"context_line":"    def _meta_get(cls, key, default\u003dNone):"},{"line_number":156,"context_line":"        \"\"\"Get value corresponding to key in meta data.\"\"\""},{"line_number":157,"context_line":"        cls._meta_ensure_is_inited()"},{"line_number":158,"context_line":"        return cls._meta.get(key, default)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_6b299e9a","line":157,"updated":"2015-03-18 21:20:47.000000000","message":"here we got error \"_meta_set() was called before...\" but we are calling meta_get()\n\nmethods _ensure_is_inited are usually not raising any exceptions, they are checking if inited, and initing if not inited.\n\nimo we shoud do either:\n make if-not-raise block in both _meta_get and _meta_set\nor\n make _meta_is_inited raise exception with common error message like \"trying to access non-inited meta\"","commit_id":"a918307f6710d5ac6a4400ceca51fa28cbdfb3ac"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"360b37d3006f8a9c367d8aae89252293aba345b7","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    @classmethod"},{"line_number":155,"context_line":"    def _meta_get(cls, key, default\u003dNone):"},{"line_number":156,"context_line":"        \"\"\"Get value corresponding to key in meta data.\"\"\""},{"line_number":157,"context_line":"        cls._meta_ensure_is_inited()"},{"line_number":158,"context_line":"        return cls._meta.get(key, default)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_3aa0cd8f","line":157,"in_reply_to":"9a80dd14_6b299e9a","updated":"2015-03-18 23:11:45.000000000","message":"Yep good catch. Going to remove _ensure and make _meta_is_inited raise exception","commit_id":"a918307f6710d5ac6a4400ceca51fa28cbdfb3ac"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"744542c7180bf5d10943fbefcf733f52a1d34ca2","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        cls._meta_init()"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        try:"},{"line_number":182,"context_line":"            Plugin.get(name)"},{"line_number":183,"context_line":"        except exceptions.PluginNotFound:"},{"line_number":184,"context_line":"            cls._meta_set(\"name\", name)"},{"line_number":185,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_57d71cee","line":182,"updated":"2015-03-18 21:20:47.000000000","message":"Not sure if this thread safe. (And not sure if this should be thread safe)","commit_id":"a918307f6710d5ac6a4400ceca51fa28cbdfb3ac"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"360b37d3006f8a9c367d8aae89252293aba345b7","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        cls._meta_init()"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        try:"},{"line_number":182,"context_line":"            Plugin.get(name)"},{"line_number":183,"context_line":"        except exceptions.PluginNotFound:"},{"line_number":184,"context_line":"            cls._meta_set(\"name\", name)"},{"line_number":185,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_86440448","line":182,"in_reply_to":"9a80dd14_57d71cee","updated":"2015-03-18 23:11:45.000000000","message":"We don\u0027t need here thread safety.","commit_id":"a918307f6710d5ac6a4400ceca51fa28cbdfb3ac"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"744542c7180bf5d10943fbefcf733f52a1d34ca2","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        except exceptions.PluginNotFound:"},{"line_number":184,"context_line":"            cls._meta_set(\"name\", name)"},{"line_number":185,"context_line":"        else:"},{"line_number":186,"context_line":"            raise exceptions.PluginWithSuchNameExists(name\u003dname)"},{"line_number":187,"context_line":"        return cls"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_77dee0db","line":186,"updated":"2015-03-18 21:20:47.000000000","message":"There is already too many exceptions in rally. We really need to do something.","commit_id":"a918307f6710d5ac6a4400ceca51fa28cbdfb3ac"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"360b37d3006f8a9c367d8aae89252293aba345b7","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        except exceptions.PluginNotFound:"},{"line_number":184,"context_line":"            cls._meta_set(\"name\", name)"},{"line_number":185,"context_line":"        else:"},{"line_number":186,"context_line":"            raise exceptions.PluginWithSuchNameExists(name\u003dname)"},{"line_number":187,"context_line":"        return cls"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a80dd14_66ed50f0","line":186,"in_reply_to":"9a80dd14_77dee0db","updated":"2015-03-18 23:11:45.000000000","message":"I totally agree that we have a lot of useless exceptions and we should reduce amount of them. \n\nPlugins base adds 2 exceptions but in future removes these 6: \n\nhttps://github.com/stackforge/rally/blob/master/rally/exceptions.py#L122-L143\n\nSo these exceptions are required to reduce total amount of exceptions. \n\n\nBy the way, I started working on special unit test that checks rationallity of exceptions usage: \nhttps://review.openstack.org/#/c/164548/","commit_id":"a918307f6710d5ac6a4400ceca51fa28cbdfb3ac"}],"rally/common/plugin/meta.py":[{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"7b48b82cadb6b2ea5522463570376d403487fbe4","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    load of module, it means that all subclasess of this class will point to"},{"line_number":23,"context_line":"    the same dict object with the information."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    Sample that explains everything:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        \u003e\u003e\u003e class A(object):"},{"line_number":28,"context_line":"        \u003e\u003e\u003e     _meta \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_59775a3a","line":25,"updated":"2015-06-08 14:09:27.000000000","message":"I\u0027ve read through the samples and still don\u0027t understand quantum gravitation. Please fix that.","commit_id":"92f40193802330a14a56065913565c6003b12da5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"eb0ae78a297365c0f939b81cdb56ffc793827b1b","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    load of module, it means that all subclasess of this class will point to"},{"line_number":23,"context_line":"    the same dict object with the information."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    Sample that explains everything:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        \u003e\u003e\u003e class A(object):"},{"line_number":28,"context_line":"        \u003e\u003e\u003e     _meta \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_30b14148","line":25,"in_reply_to":"3afb71cf_59775a3a","updated":"2015-06-08 18:50:59.000000000","message":"Done","commit_id":"92f40193802330a14a56065913565c6003b12da5"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"b82df5c97ecb51092cd655d1e2eaf05166aa9edb","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def _meta_is_inited(cls, raise_exc\u003dTrue):"},{"line_number":53,"context_line":"        \"\"\"Check if meta is initialized."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        It means that this class has own cls._meta object (not pointer"},{"line_number":56,"context_line":"        to parent cls._meta)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        To do this we should check 2 things:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3afb71cf_33101901","line":55,"updated":"2015-06-09 06:36:13.000000000","message":"this explanation is better than L25","commit_id":"499a0fdf53f9c2a50c45d16e4f1462839b748841"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"25b07e1cdfe4c1b90e2409def851ded6d07c5de9","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def _meta_is_inited(cls, raise_exc\u003dTrue):"},{"line_number":53,"context_line":"        \"\"\"Check if meta is initialized."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        It means that this class has own cls._meta object (not pointer"},{"line_number":56,"context_line":"        to parent cls._meta)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        To do this we should check 2 things:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3afb71cf_4f23dea7","line":55,"in_reply_to":"3afb71cf_33101901","updated":"2015-06-09 12:07:08.000000000","message":"I fixed sample.. Now it\u0027s clear..","commit_id":"499a0fdf53f9c2a50c45d16e4f1462839b748841"},{"author":{"_account_id":8507,"name":"Mikhail Dubov","email":"mdubov@mirantis.com","username":"msdubov"},"change_message_id":"53f106581554b835c8a916a19a5de349b427a1c3","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    load of module, it means that all subclasess of this class will point to"},{"line_number":23,"context_line":"    the same dict object with the information."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    Sample that explains why it\u0027s import to use MetaMixin:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        \u003e\u003e\u003e # Using direct fields"},{"line_number":28,"context_line":"        \u003e\u003e\u003e"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_6612400b","line":25,"updated":"2015-06-09 13:03:06.000000000","message":"s/import/important","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"336b14201bc5b56395fd8d311e7e31447b3129f3","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    load of module, it means that all subclasess of this class will point to"},{"line_number":23,"context_line":"    the same dict object with the information."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    Sample that explains why it\u0027s import to use MetaMixin:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        \u003e\u003e\u003e # Using direct fields"},{"line_number":28,"context_line":"        \u003e\u003e\u003e"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_06570c27","line":25,"in_reply_to":"3afb71cf_6612400b","updated":"2015-06-09 13:31:00.000000000","message":"Done","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"}],"rally/common/plugin/plugin.py":[{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"b82df5c97ecb51092cd655d1e2eaf05166aa9edb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"3afb71cf_93e34d33","updated":"2015-06-09 06:36:13.000000000","message":"why not use  \"wraps\" in all the decorators?","commit_id":"499a0fdf53f9c2a50c45d16e4f1462839b748841"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"25b07e1cdfe4c1b90e2409def851ded6d07c5de9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"3afb71cf_f4dc9d74","in_reply_to":"3afb71cf_93e34d33","updated":"2015-06-09 12:07:08.000000000","message":"wraps assumes that you are returning another function.. and it\u0027s not true for all the cases","commit_id":"499a0fdf53f9c2a50c45d16e4f1462839b748841"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"b82df5c97ecb51092cd655d1e2eaf05166aa9edb","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    As a result adding plugin behavior for benchmark scenarios fully unifies"},{"line_number":78,"context_line":"    work with benchmark scenarios and other kinds of plugins."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    :param func: function that should be used as plugin"},{"line_number":81,"context_line":"    :returns: Modified func"},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3afb71cf_53e155cf","line":80,"updated":"2015-06-09 06:36:13.000000000","message":"\"func\" isn\u0027t an argument here.","commit_id":"499a0fdf53f9c2a50c45d16e4f1462839b748841"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"25b07e1cdfe4c1b90e2409def851ded6d07c5de9","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    As a result adding plugin behavior for benchmark scenarios fully unifies"},{"line_number":78,"context_line":"    work with benchmark scenarios and other kinds of plugins."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    :param func: function that should be used as plugin"},{"line_number":81,"context_line":"    :returns: Modified func"},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3afb71cf_afd2525a","line":80,"in_reply_to":"3afb71cf_53e155cf","updated":"2015-06-09 12:07:08.000000000","message":"Done","commit_id":"499a0fdf53f9c2a50c45d16e4f1462839b748841"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"b82df5c97ecb51092cd655d1e2eaf05166aa9edb","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        return cls"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    @classmethod"},{"line_number":156,"context_line":"    def get(cls, name, namespace\u003dNone):"},{"line_number":157,"context_line":"        \"\"\"Return plugin by it\u0027s name from specified namespace."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        This method iterates over all subclasses of cls and returns plugin"}],"source_content_type":"text/x-python","patch_set":13,"id":"3afb71cf_d321c5b5","line":156,"updated":"2015-06-09 06:36:13.000000000","message":"Is None a valid namespace?","commit_id":"499a0fdf53f9c2a50c45d16e4f1462839b748841"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"25b07e1cdfe4c1b90e2409def851ded6d07c5de9","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        return cls"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    @classmethod"},{"line_number":156,"context_line":"    def get(cls, name, namespace\u003dNone):"},{"line_number":157,"context_line":"        \"\"\"Return plugin by it\u0027s name from specified namespace."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        This method iterates over all subclasses of cls and returns plugin"}],"source_content_type":"text/x-python","patch_set":13,"id":"3afb71cf_8a2d4497","line":156,"in_reply_to":"3afb71cf_d321c5b5","updated":"2015-06-09 12:07:08.000000000","message":"yep","commit_id":"499a0fdf53f9c2a50c45d16e4f1462839b748841"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"b82df5c97ecb51092cd655d1e2eaf05166aa9edb","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    @classmethod"},{"line_number":156,"context_line":"    def get(cls, name, namespace\u003dNone):"},{"line_number":157,"context_line":"        \"\"\"Return plugin by it\u0027s name from specified namespace."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        This method iterates over all subclasses of cls and returns plugin"},{"line_number":160,"context_line":"        by name."}],"source_content_type":"text/x-python","patch_set":13,"id":"3afb71cf_ae1ee260","line":157,"updated":"2015-06-09 06:36:13.000000000","message":"should add that if no namespace is defined, will return from all namespaces","commit_id":"499a0fdf53f9c2a50c45d16e4f1462839b748841"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"25b07e1cdfe4c1b90e2409def851ded6d07c5de9","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    @classmethod"},{"line_number":156,"context_line":"    def get(cls, name, namespace\u003dNone):"},{"line_number":157,"context_line":"        \"\"\"Return plugin by it\u0027s name from specified namespace."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        This method iterates over all subclasses of cls and returns plugin"},{"line_number":160,"context_line":"        by name."}],"source_content_type":"text/x-python","patch_set":13,"id":"3afb71cf_6a1e8860","line":157,"in_reply_to":"3afb71cf_ae1ee260","updated":"2015-06-09 12:07:08.000000000","message":"done","commit_id":"499a0fdf53f9c2a50c45d16e4f1462839b748841"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"cf67dfa4a56f23fdc302a41c72357c208e11443f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    As a result adding plugin behavior for benchmark scenarios fully unifies"},{"line_number":78,"context_line":"    work with benchmark scenarios and other kinds of plugins."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    :param plugin_baseclass: if specified subclass of this class will be used"},{"line_number":81,"context_line":"                             to add behavior of plugin to function. If this"},{"line_number":82,"context_line":"                             argument is not specified subclass of Plugin"},{"line_number":83,"context_line":"                             will be used."}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_6a10c859","line":80,"updated":"2015-06-09 12:26:59.000000000","message":"a little punctuation should make this clearer:\n\n  \"if specified, subclass...\"","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"336b14201bc5b56395fd8d311e7e31447b3129f3","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    As a result adding plugin behavior for benchmark scenarios fully unifies"},{"line_number":78,"context_line":"    work with benchmark scenarios and other kinds of plugins."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    :param plugin_baseclass: if specified subclass of this class will be used"},{"line_number":81,"context_line":"                             to add behavior of plugin to function. If this"},{"line_number":82,"context_line":"                             argument is not specified subclass of Plugin"},{"line_number":83,"context_line":"                             will be used."}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_c6dfb40b","line":80,"in_reply_to":"3afb71cf_6a10c859","updated":"2015-06-09 13:31:00.000000000","message":"Done","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"cf67dfa4a56f23fdc302a41c72357c208e11443f","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    work with benchmark scenarios and other kinds of plugins."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    :param plugin_baseclass: if specified subclass of this class will be used"},{"line_number":81,"context_line":"                             to add behavior of plugin to function. If this"},{"line_number":82,"context_line":"                             argument is not specified subclass of Plugin"},{"line_number":83,"context_line":"                             will be used."},{"line_number":84,"context_line":"    :returns: Function decorator that adds to function plugin behavior"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_6507d918","line":81,"updated":"2015-06-09 12:26:59.000000000","message":"s/\"if this argument is not specifie\"/\"else, ...\"","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"336b14201bc5b56395fd8d311e7e31447b3129f3","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    work with benchmark scenarios and other kinds of plugins."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    :param plugin_baseclass: if specified subclass of this class will be used"},{"line_number":81,"context_line":"                             to add behavior of plugin to function. If this"},{"line_number":82,"context_line":"                             argument is not specified subclass of Plugin"},{"line_number":83,"context_line":"                             will be used."},{"line_number":84,"context_line":"    :returns: Function decorator that adds to function plugin behavior"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_e6d630f0","line":81,"in_reply_to":"3afb71cf_6507d918","updated":"2015-06-09 13:31:00.000000000","message":"Done","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"cf67dfa4a56f23fdc302a41c72357c208e11443f","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                             to add behavior of plugin to function. If this"},{"line_number":82,"context_line":"                             argument is not specified subclass of Plugin"},{"line_number":83,"context_line":"                             will be used."},{"line_number":84,"context_line":"    :returns: Function decorator that adds to function plugin behavior"},{"line_number":85,"context_line":"    \"\"\""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    if plugin_baseclass:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_852d3597","line":84,"updated":"2015-06-09 12:26:59.000000000","message":"adds plugin behavior to function","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"336b14201bc5b56395fd8d311e7e31447b3129f3","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                             to add behavior of plugin to function. If this"},{"line_number":82,"context_line":"                             argument is not specified subclass of Plugin"},{"line_number":83,"context_line":"                             will be used."},{"line_number":84,"context_line":"    :returns: Function decorator that adds to function plugin behavior"},{"line_number":85,"context_line":"    \"\"\""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    if plugin_baseclass:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_c61454a1","line":84,"in_reply_to":"3afb71cf_852d3597","updated":"2015-06-09 13:31:00.000000000","message":"Done","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":8507,"name":"Mikhail Dubov","email":"mdubov@mirantis.com","username":"msdubov"},"change_message_id":"53f106581554b835c8a916a19a5de349b427a1c3","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        If namespace is not specified it will return first found plugin from"},{"line_number":166,"context_line":"        any of namespaces."},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        :param name: Plugin\u0027s name"},{"line_number":169,"context_line":"        \"\"\""},{"line_number":170,"context_line":"        for p in cls.get_all(namespace\u003dnamespace):"},{"line_number":171,"context_line":"            if p.get_name() \u003d\u003d name:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_2028af99","line":168,"updated":"2015-06-09 13:03:06.000000000","message":"Please add :param namespace:","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"336b14201bc5b56395fd8d311e7e31447b3129f3","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        If namespace is not specified it will return first found plugin from"},{"line_number":166,"context_line":"        any of namespaces."},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        :param name: Plugin\u0027s name"},{"line_number":169,"context_line":"        \"\"\""},{"line_number":170,"context_line":"        for p in cls.get_all(namespace\u003dnamespace):"},{"line_number":171,"context_line":"            if p.get_name() \u003d\u003d name:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_86589c8b","line":168,"in_reply_to":"3afb71cf_2028af99","updated":"2015-06-09 13:31:00.000000000","message":"Done","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"4660b83e53c7215c36d2376d74aa3547cd618833","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    work with benchmark scenarios and other kinds of plugins."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    :param plugin_baseclass: if specified, subclass of this class will be used"},{"line_number":81,"context_line":"                             to add behavior of plugin to function, else"},{"line_number":82,"context_line":"                             subclass of Plugin will be used."},{"line_number":83,"context_line":"    :returns: Function decorator adds plugin behavior to function"},{"line_number":84,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"3afb71cf_6c858105","line":81,"updated":"2015-06-09 13:36:34.000000000","message":"\"else,\"","commit_id":"684e3014a35833f25002ddaada4baadbf274fe41"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"a36fc9139a9222db1834398e9c812bb52c1e75c7","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    work with benchmark scenarios and other kinds of plugins."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    :param plugin_baseclass: if specified, subclass of this class will be used"},{"line_number":81,"context_line":"                             to add behavior of plugin to function, else"},{"line_number":82,"context_line":"                             subclass of Plugin will be used."},{"line_number":83,"context_line":"    :returns: Function decorator adds plugin behavior to function"},{"line_number":84,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"3afb71cf_6f5b33f7","line":81,"in_reply_to":"3afb71cf_6c858105","updated":"2015-06-09 13:48:30.000000000","message":"Done","commit_id":"684e3014a35833f25002ddaada4baadbf274fe41"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"4660b83e53c7215c36d2376d74aa3547cd618833","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    :param plugin_baseclass: if specified, subclass of this class will be used"},{"line_number":81,"context_line":"                             to add behavior of plugin to function, else"},{"line_number":82,"context_line":"                             subclass of Plugin will be used."},{"line_number":83,"context_line":"    :returns: Function decorator adds plugin behavior to function"},{"line_number":84,"context_line":"    \"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    if plugin_baseclass:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3afb71cf_eca85179","line":83,"updated":"2015-06-09 13:36:34.000000000","message":"\"that adds\", \"function.\"","commit_id":"684e3014a35833f25002ddaada4baadbf274fe41"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"a36fc9139a9222db1834398e9c812bb52c1e75c7","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    :param plugin_baseclass: if specified, subclass of this class will be used"},{"line_number":81,"context_line":"                             to add behavior of plugin to function, else"},{"line_number":82,"context_line":"                             subclass of Plugin will be used."},{"line_number":83,"context_line":"    :returns: Function decorator adds plugin behavior to function"},{"line_number":84,"context_line":"    \"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    if plugin_baseclass:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3afb71cf_cf07c7c8","line":83,"in_reply_to":"3afb71cf_eca85179","updated":"2015-06-09 13:48:30.000000000","message":"please write complete sentence.","commit_id":"684e3014a35833f25002ddaada4baadbf274fe41"}],"rally/exceptions.py":[{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"f617f5c5570dcb0c113b47816c81687f216f0a0f","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    msg_fmt \u003d _(\"There is no plugin with name: `%(name)s`.\")"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"class MultiplePluginsFound(NotFoundException):"},{"line_number":123,"context_line":"    msg_fmt \u003d _(\"There are multiple plugins: `%(plugins)s` with the same \""},{"line_number":124,"context_line":"                \"name: `%(name)s`.\")"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_4e4cb5c8","line":122,"updated":"2015-03-08 11:36:51.000000000","message":"NotFound is not an exact fit here.\nI suggest having MultipleMatchesFound as a new base.","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"aeb7b1e153bff7f4d54a8809e30177382dbca80a","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    msg_fmt \u003d _(\"There is no plugin with name: `%(name)s`.\")"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"class MultiplePluginsFound(NotFoundException):"},{"line_number":123,"context_line":"    msg_fmt \u003d _(\"There are multiple plugins: `%(plugins)s` with the same \""},{"line_number":124,"context_line":"                \"name: `%(name)s`.\")"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a80dd14_9f24b961","line":122,"in_reply_to":"9a80dd14_4e4cb5c8","updated":"2015-03-16 23:33:03.000000000","message":"Done","commit_id":"fc53a9ed146cc1570e21801ee316e3ecee104ba1"},{"author":{"_account_id":8507,"name":"Mikhail Dubov","email":"mdubov@mirantis.com","username":"msdubov"},"change_message_id":"53f106581554b835c8a916a19a5de349b427a1c3","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    msg_fmt \u003d _(\"Not found.\")"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"class PluginNotFound(RallyException):"},{"line_number":119,"context_line":"    msg_fmt \u003d _(\"There is no plugin with name: `%(name)s`.\")"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_e65d1016","line":118,"updated":"2015-06-09 13:03:06.000000000","message":"Why not derive from NotFoundException? Just looks strange to me","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"336b14201bc5b56395fd8d311e7e31447b3129f3","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    msg_fmt \u003d _(\"Not found.\")"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"class PluginNotFound(RallyException):"},{"line_number":119,"context_line":"    msg_fmt \u003d _(\"There is no plugin with name: `%(name)s`.\")"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_c928e788","line":118,"in_reply_to":"3afb71cf_e65d1016","updated":"2015-06-09 13:31:00.000000000","message":"I would like to get rid of it.","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":8507,"name":"Mikhail Dubov","email":"mdubov@mirantis.com","username":"msdubov"},"change_message_id":"53f106581554b835c8a916a19a5de349b427a1c3","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    msg_fmt \u003d _(\"There is no plugin with name: `%(name)s`.\")"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"class PluginWithSuchNameExists(RallyException):"},{"line_number":123,"context_line":"    msg_fmt \u003d _(\"Plugin with such name: `%(name)s` already exists\")"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_867adc75","line":122,"updated":"2015-06-09 13:03:06.000000000","message":"better: PluginAlreadyExists","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"336b14201bc5b56395fd8d311e7e31447b3129f3","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    msg_fmt \u003d _(\"There is no plugin with name: `%(name)s`.\")"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"class PluginWithSuchNameExists(RallyException):"},{"line_number":123,"context_line":"    msg_fmt \u003d _(\"Plugin with such name: `%(name)s` already exists\")"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_29689bb8","line":122,"in_reply_to":"3afb71cf_867adc75","updated":"2015-06-09 13:31:00.000000000","message":"I disagree with this, my exception is self documented. It says that with such name plugin exists, and your doesn\u0027t say anything and required documentation..","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"},{"author":{"_account_id":8507,"name":"Mikhail Dubov","email":"mdubov@mirantis.com","username":"msdubov"},"change_message_id":"53f106581554b835c8a916a19a5de349b427a1c3","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"class PluginWithSuchNameExists(RallyException):"},{"line_number":123,"context_line":"    msg_fmt \u003d _(\"Plugin with such name: `%(name)s` already exists\")"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"class NoSuchEngine(NotFoundException):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afb71cf_46cd0465","line":123,"updated":"2015-06-09 13:03:06.000000000","message":"I think this should also mention the namespace where the plugin is defined","commit_id":"7bf955b30228d5d62baf7893ef3bcaeabfcf0bbe"}],"tests/unit/common/plugin/test_plugin.py":[{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"7b48b82cadb6b2ea5522463570376d403487fbe4","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.assertEqual(\"configure_func_plugin_test\", func.get_name())"},{"line_number":44,"context_line":"        self.assertEqual(42, func(42))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def test_configure_with_base_cls(self):"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        class BaseA(object):"},{"line_number":49,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_d9b6aa89","line":46,"updated":"2015-06-08 14:09:27.000000000","message":"What is this?","commit_id":"92f40193802330a14a56065913565c6003b12da5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"eb0ae78a297365c0f939b81cdb56ffc793827b1b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.assertEqual(\"configure_func_plugin_test\", func.get_name())"},{"line_number":44,"context_line":"        self.assertEqual(42, func(42))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def test_configure_with_base_cls(self):"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        class BaseA(object):"},{"line_number":49,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_50f71df5","line":46,"in_reply_to":"3afb71cf_d9b6aa89","updated":"2015-06-08 18:50:59.000000000","message":"I forgot to remove it...","commit_id":"92f40193802330a14a56065913565c6003b12da5"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"7b48b82cadb6b2ea5522463570376d403487fbe4","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def test_get_all(self):"},{"line_number":154,"context_line":"        self.assertEqual(set([SomePlugin, DeprecatedPlugin]),"},{"line_number":155,"context_line":"                         set(BasePlugin.get_all()))"},{"line_number":156,"context_line":"        self.assertEqual([], SomePlugin.get_all())"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def test_is_deprecated(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_b93e4ed8","line":155,"updated":"2015-06-08 14:09:27.000000000","message":"Well, this name is not clear.\n\nPlease name it `get_all_subplugins\u0027 or something like that.","commit_id":"92f40193802330a14a56065913565c6003b12da5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"eb0ae78a297365c0f939b81cdb56ffc793827b1b","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def test_get_all(self):"},{"line_number":154,"context_line":"        self.assertEqual(set([SomePlugin, DeprecatedPlugin]),"},{"line_number":155,"context_line":"                         set(BasePlugin.get_all()))"},{"line_number":156,"context_line":"        self.assertEqual([], SomePlugin.get_all())"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def test_is_deprecated(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_b03891a1","line":155,"in_reply_to":"3afb71cf_b93e4ed8","updated":"2015-06-08 18:50:59.000000000","message":"So this is how plugin get_all works, it finds all subplugins...This is really too long name for such common operation..","commit_id":"92f40193802330a14a56065913565c6003b12da5"}],"tests/unit/common/test_plugin.py":[{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"66a32873e88ca6ca5fb05d7e3550575c5b9f2871","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        Meta._meta_init()"},{"line_number":38,"context_line":"        Meta._meta_set(\"aaa\", 42)"},{"line_number":39,"context_line":"        self.assertEqual(Meta._meta_get(\"aaa\"), 42)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def test_meta_get_default(self):"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_77e5dea2","line":39,"updated":"2015-03-03 12:04:55.000000000","message":"wrong order.","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b7c9133c7bb1d0afb58c5ec66de5c35dd6fe263b","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        Meta._meta_init()"},{"line_number":38,"context_line":"        Meta._meta_set(\"aaa\", 42)"},{"line_number":39,"context_line":"        self.assertEqual(Meta._meta_get(\"aaa\"), 42)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def test_meta_get_default(self):"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_e5ec31ca","line":39,"in_reply_to":"ba7be1f8_77e5dea2","updated":"2015-03-04 23:10:05.000000000","message":"it\u0027s proper order","commit_id":"dba16e5b89894d1e641c7758fdb8de2b09c68a50"}]}
