)]}'
{"taskflow/openstack/common/jsonutils.py":[{"author":{"_account_id":8895,"name":"Stanislav Kudriashev","email":"stas.kudriashev@gmail.com","username":"skudriashev"},"change_message_id":"e1098fb056512006ecfd8f2dd4f18e06fcd15b50","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"import six"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"import taskflow"},{"line_number":52,"context_line":"from taskflow.openstack.common import gettextutils"},{"line_number":53,"context_line":"from taskflow.openstack.common import importutils"},{"line_number":54,"context_line":"from taskflow.openstack.common import timeutils"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAWH%2F%2F%2FDo%3D","line":51,"updated":"2014-03-12 15:04:26.000000000","message":"Maybe it is better to import:\n\n    from taskflow.utils import misc\n    from taskflow.utils import persistence_utils as pu","commit_id":"1e4e0b3acdf0bbfff865395c46c0547aa9a875b9"}],"taskflow/persistence/backends/impl_sqlalchemy.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"cf76478d2746518ba31801dc7fd7bd14aecfa6c1","unresolved":false,"context_lines":[{"line_number":469,"context_line":"    # Convert from sqlalchemy model -\u003e external model, this allows us"},{"line_number":470,"context_line":"    # to change the internal sqlalchemy model easily by forcing a defined"},{"line_number":471,"context_line":"    # interface (that isn\u0027t the sqlalchemy model itself)."},{"line_number":472,"context_line":"    if td.atom_type \u003d\u003d logbook.TASK_DETAIL:"},{"line_number":473,"context_line":"        td_c \u003d logbook.TaskDetail(td.name, uuid\u003dtd.uuid)"},{"line_number":474,"context_line":"    else:"},{"line_number":475,"context_line":"        td_c \u003d logbook.RetryDetail(td.name, uuid\u003dtd.uuid)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FxcE%3D","line":472,"updated":"2014-02-10 21:55:51.000000000","message":"Another place that it seems could just use the importutils concept of just importing the class and passing it kwargs when creating it.","commit_id":"c02dfa1a68dbbaeb4bc6ef95b479f77cfb5e8255"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"c8e510cc0282654492fa60235b3f4d129f6c92a5","unresolved":false,"context_lines":[{"line_number":469,"context_line":"    # Convert from sqlalchemy model -\u003e external model, this allows us"},{"line_number":470,"context_line":"    # to change the internal sqlalchemy model easily by forcing a defined"},{"line_number":471,"context_line":"    # interface (that isn\u0027t the sqlalchemy model itself)."},{"line_number":472,"context_line":"    if td.atom_type \u003d\u003d logbook.TASK_DETAIL:"},{"line_number":473,"context_line":"        td_c \u003d logbook.TaskDetail(td.name, uuid\u003dtd.uuid)"},{"line_number":474,"context_line":"    else:"},{"line_number":475,"context_line":"        td_c \u003d logbook.RetryDetail(td.name, uuid\u003dtd.uuid)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2Fqfk%3D","line":472,"in_reply_to":"AAAAUX%2F%2FxcE%3D","updated":"2014-02-12 09:19:03.000000000","message":"Done","commit_id":"c02dfa1a68dbbaeb4bc6ef95b479f77cfb5e8255"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"a0f369aaa38b825d07429c3cdc78133fe15c1cc4","unresolved":false,"context_lines":[{"line_number":455,"context_line":"    results \u003d td.results"},{"line_number":456,"context_line":"    if td.atom_type \u003d\u003d logbook.RETRY_DETAIL:"},{"line_number":457,"context_line":"        results \u003d persistence_utils.encode_retry_results("},{"line_number":458,"context_line":"            copy.deepcopy(results))"},{"line_number":459,"context_line":"    return models.TaskDetail(name\u003dtd.name, uuid\u003dtd.uuid,"},{"line_number":460,"context_line":"                             atom_type\u003dtd.atom_type,"},{"line_number":461,"context_line":"                             state\u003dtd.state, results\u003dresults,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAWH%2F%2Fyks%3D","line":458,"updated":"2014-03-13 19:51:28.000000000","message":"Why deepcopy? Deep copying failures (especially if they have tracebacks) likely won\u0027t work correctly at all. See http://paste.openstack.org/show/73451/ for what happens.","commit_id":"b3500e6f17842b26aa5b11033e855b9fec582c5a"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"005e70bf69f1af6cee52fa128c318d510000fc2f","unresolved":false,"context_lines":[{"line_number":455,"context_line":"    results \u003d td.results"},{"line_number":456,"context_line":"    if td.atom_type \u003d\u003d logbook.RETRY_DETAIL:"},{"line_number":457,"context_line":"        results \u003d persistence_utils.encode_retry_results("},{"line_number":458,"context_line":"            copy.deepcopy(results))"},{"line_number":459,"context_line":"    return models.TaskDetail(name\u003dtd.name, uuid\u003dtd.uuid,"},{"line_number":460,"context_line":"                             atom_type\u003dtd.atom_type,"},{"line_number":461,"context_line":"                             state\u003dtd.state, results\u003dresults,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAWH%2F%2FtqI%3D","line":458,"in_reply_to":"AAAAWH%2F%2Fyks%3D","updated":"2014-03-14 09:42:17.000000000","message":"Done","commit_id":"b3500e6f17842b26aa5b11033e855b9fec582c5a"}],"taskflow/persistence/backends/sqlalchemy/alembic/versions/84d6e888850_add_task_detail_type.py":[{"author":{"_account_id":7366,"name":"Ivan Melnikov","email":"imelnikov@griddynamics.com","username":"imelnikov"},"change_message_id":"3aa1850416b1d515b5bada2be55aeadc8ed8752a","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def downgrade():"},{"line_number":47,"context_line":"    op.drop_column(\u0027taskdetails\u0027, \u0027atom_type\u0027)"},{"line_number":48,"context_line":"    op.drop_table(\u0027atom_types\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FD74%3D","line":48,"updated":"2014-02-17 11:45:08.000000000","message":"I might be missing something, but drop_table looks wrong here...","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"c50f9bc6674064814ce95985554030ad76dbb9c1","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def downgrade():"},{"line_number":47,"context_line":"    op.drop_column(\u0027taskdetails\u0027, \u0027atom_type\u0027)"},{"line_number":48,"context_line":"    op.drop_table(\u0027atom_types\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FC9g%3D","line":48,"in_reply_to":"AAAAUX%2F%2FD74%3D","updated":"2014-02-17 13:14:03.000000000","message":"Done","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"}],"taskflow/persistence/backends/sqlalchemy/models.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"97a38c4a3acbe36d3adb2042c25d018c2f4abeb4","unresolved":false,"context_lines":[{"line_number":108,"context_line":"class TaskDetail(BASE, ModelBase):"},{"line_number":109,"context_line":"    __tablename__ \u003d \u0027taskdetails\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    atom_type \u003d Column(String)"},{"line_number":112,"context_line":"    # Member variables"},{"line_number":113,"context_line":"    state \u003d Column(String)"},{"line_number":114,"context_line":"    results \u003d Column(Json)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2Bs%2Fo%3D","line":111,"updated":"2014-01-23 01:03:53.000000000","message":"What do u think about using the following type, seems like this is an enumeration and not really a string so might be useful just to use the enum type then?\n\nhttp://docs.sqlalchemy.org/en/rel_0_9/core/types.html#sqlalchemy.types.Enum","commit_id":"c10e43e7f77d73d70f69d104a7b95c651d8a2735"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"e5b475564dfbf08a13b60a4df65d0163a6f6ff29","unresolved":false,"context_lines":[{"line_number":108,"context_line":"class TaskDetail(BASE, ModelBase):"},{"line_number":109,"context_line":"    __tablename__ \u003d \u0027taskdetails\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    atom_type \u003d Column(String)"},{"line_number":112,"context_line":"    # Member variables"},{"line_number":113,"context_line":"    state \u003d Column(String)"},{"line_number":114,"context_line":"    results \u003d Column(Json)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BqPA%3D","line":111,"in_reply_to":"AAAAUH%2F%2Bs%2Fo%3D","updated":"2014-01-23 13:10:45.000000000","message":"Done","commit_id":"c10e43e7f77d73d70f69d104a7b95c651d8a2735"}],"taskflow/persistence/logbook.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"4e41709df2d744e2650a92d9acdb5e4c86891ee5","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    storage in real time. The data in this class will only be guaranteed to be"},{"line_number":147,"context_line":"    persisted when a save/update occurs via some backend connection."},{"line_number":148,"context_line":"    \"\"\""},{"line_number":149,"context_line":"    def __init__(self, name, uuid, atom_type\u003dTASK_DETAIL):"},{"line_number":150,"context_line":"        self._uuid \u003d uuid"},{"line_number":151,"context_line":"        self._name \u003d name"},{"line_number":152,"context_line":"        self._atom_type \u003d atom_type"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2F%2BMQ%3D","line":149,"updated":"2014-02-08 03:55:29.000000000","message":"I\u0027ve been thinking about this and am wondering if we should really have this structured differently. Why can\u0027t we just have an abstract class AtomDetail(object) and have TaskDetail derive from it and add its derived attributes on and add a new RetryDetail type and add its own specific derived attributes. Then in the flow detail we can just have new functions that allow for separate atom types to be saved independently (instead of shoving them all under the existing taskdetails code). \n\nSomething still doesn\u0027t seem right with how we are doing this kind of atom_type via property/string to do what object types (and object hierarchies) already provide.","commit_id":"208b4cd033a9c97c21e121e0f05d3cb076ee089a"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"3b60fe9a3b652f04a04cdd3732ce26ed5ce59a94","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    storage in real time. The data in this class will only be guaranteed to be"},{"line_number":147,"context_line":"    persisted when a save/update occurs via some backend connection."},{"line_number":148,"context_line":"    \"\"\""},{"line_number":149,"context_line":"    def __init__(self, name, uuid, atom_type\u003dTASK_DETAIL):"},{"line_number":150,"context_line":"        self._uuid \u003d uuid"},{"line_number":151,"context_line":"        self._name \u003d name"},{"line_number":152,"context_line":"        self._atom_type \u003d atom_type"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2F29w%3D","line":149,"in_reply_to":"AAAAUX%2F%2F%2BMQ%3D","updated":"2014-02-10 13:08:53.000000000","message":"Done","commit_id":"208b4cd033a9c97c21e121e0f05d3cb076ee089a"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"cf76478d2746518ba31801dc7fd7bd14aecfa6c1","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        return TASK_DETAIL"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"class RetryDetail(AtomDetail):"},{"line_number":218,"context_line":"    \"\"\"This class contains an entry that contains the persistence of a task"},{"line_number":219,"context_line":"    after or before (or during) it is running including any results it may have"},{"line_number":220,"context_line":"    produced, any state that it may be in (failed for example), any exception"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2Fxgc%3D","line":217,"updated":"2014-02-10 21:55:51.000000000","message":"Thanks! Although it looks like the docstring doesn\u0027t make sense anymore (since that looks like the task docstring). Maybe clean that up (or just remove and I can fix it when this code goes in)?","commit_id":"c02dfa1a68dbbaeb4bc6ef95b479f77cfb5e8255"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"c8e510cc0282654492fa60235b3f4d129f6c92a5","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        return TASK_DETAIL"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"class RetryDetail(AtomDetail):"},{"line_number":218,"context_line":"    \"\"\"This class contains an entry that contains the persistence of a task"},{"line_number":219,"context_line":"    after or before (or during) it is running including any results it may have"},{"line_number":220,"context_line":"    produced, any state that it may be in (failed for example), any exception"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FqhY%3D","line":217,"in_reply_to":"AAAAUX%2F%2Fxgc%3D","updated":"2014-02-12 09:19:03.000000000","message":"Done","commit_id":"c02dfa1a68dbbaeb4bc6ef95b479f77cfb5e8255"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"f67ac75864d783e9d79d169027a008145e20d5a3","unresolved":false,"context_lines":[{"line_number":216,"context_line":"def get_atom_detail_class(atom_type):"},{"line_number":217,"context_line":"    if atom_type \u003d\u003d TASK_DETAIL:"},{"line_number":218,"context_line":"        return TaskDetail"},{"line_number":219,"context_line":"    else:"},{"line_number":220,"context_line":"        return RetryDetail"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAVn%2F%2Fo70%3D","line":219,"updated":"2014-03-04 22:18:25.000000000","message":"Can we do the following instead.\n\nelif atom_type \u003d\u003d RETRY_DETAIL:\n  return RetryDetail\nelse:\n raise TypeError(..)","commit_id":"72bb8c380e73dfbf3ce769ea2f0d0337f1d2d2fc"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"844715dc50b6c00e1b49b58aca3e298d3ecf1ec4","unresolved":false,"context_lines":[{"line_number":216,"context_line":"def get_atom_detail_class(atom_type):"},{"line_number":217,"context_line":"    if atom_type \u003d\u003d TASK_DETAIL:"},{"line_number":218,"context_line":"        return TaskDetail"},{"line_number":219,"context_line":"    else:"},{"line_number":220,"context_line":"        return RetryDetail"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAVn%2F%2FkTk%3D","line":219,"in_reply_to":"AAAAVn%2F%2Fo70%3D","updated":"2014-03-05 10:44:14.000000000","message":"Done","commit_id":"72bb8c380e73dfbf3ce769ea2f0d0337f1d2d2fc"},{"author":{"_account_id":8895,"name":"Stanislav Kudriashev","email":"stas.kudriashev@gmail.com","username":"skudriashev"},"change_message_id":"e1098fb056512006ecfd8f2dd4f18e06fcd15b50","unresolved":false,"context_lines":[{"line_number":27,"context_line":"TASK_DETAIL \u003d \u0027TASK_DETAIL\u0027"},{"line_number":28,"context_line":"RETRY_DETAIL \u003d \u0027RETRY_DETAIL\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"ATOM_TYPES \u003d [TASK_DETAIL, RETRY_DETAIL]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class LogBook(object):"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAWH%2F%2F%2B88%3D","line":30,"updated":"2014-03-12 15:04:26.000000000","message":"Is it used?","commit_id":"1e4e0b3acdf0bbfff865395c46c0547aa9a875b9"},{"author":{"_account_id":8895,"name":"Stanislav Kudriashev","email":"stas.kudriashev@gmail.com","username":"skudriashev"},"change_message_id":"e1098fb056512006ecfd8f2dd4f18e06fcd15b50","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    for example), any exception that occurred when running and any associated"},{"line_number":142,"context_line":"    stacktrace that may have occurring during that exception being thrown"},{"line_number":143,"context_line":"    and any other metadata that should be stored along-side the details"},{"line_number":144,"context_line":"     about this task."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    The data contained within this class need *not* backed by the backend"},{"line_number":147,"context_line":"    storage in real time. The data in this class will only be guaranteed to be"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAWH%2F%2F%2FAk%3D","line":144,"updated":"2014-03-12 15:04:26.000000000","message":"task -\u003e atom?","commit_id":"1e4e0b3acdf0bbfff865395c46c0547aa9a875b9"}],"taskflow/storage.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"97a38c4a3acbe36d3adb2042c25d018c2f4abeb4","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        with given name."},{"line_number":113,"context_line":"        \"\"\""},{"line_number":114,"context_line":"        try:"},{"line_number":115,"context_line":"            task_id \u003d self._task_name_to_uuid[checkpoint_name]"},{"line_number":116,"context_line":"        except KeyError:"},{"line_number":117,"context_line":"            task_id \u003d uuidutils.generate_uuid()"},{"line_number":118,"context_line":"            self._add_checkpoint(task_id, checkpoint_name, checkpoint_version)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2Bs%2FI%3D","line":115,"updated":"2014-01-23 01:03:53.000000000","message":"atom_id, since its not really a task anymore right? Seems like same in other variable names also, no longer really task_ids by atom_ids. does that seem like it makes sense?","commit_id":"c10e43e7f77d73d70f69d104a7b95c651d8a2735"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"e5b475564dfbf08a13b60a4df65d0163a6f6ff29","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        with given name."},{"line_number":113,"context_line":"        \"\"\""},{"line_number":114,"context_line":"        try:"},{"line_number":115,"context_line":"            task_id \u003d self._task_name_to_uuid[checkpoint_name]"},{"line_number":116,"context_line":"        except KeyError:"},{"line_number":117,"context_line":"            task_id \u003d uuidutils.generate_uuid()"},{"line_number":118,"context_line":"            self._add_checkpoint(task_id, checkpoint_name, checkpoint_version)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BqRM%3D","line":115,"in_reply_to":"AAAAUH%2F%2Bs%2FI%3D","updated":"2014-01-23 13:10:45.000000000","message":"When I tried to rename TaskDetail to AtomDetail everywhere it occurred that it is a huge amount of changes and it adds additional complexity to DB migration. I\u0027m not sure what should be renamed and what shouldn\u0027t.","commit_id":"c10e43e7f77d73d70f69d104a7b95c651d8a2735"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"46130ea47fa569e4be20cddc16344f49bc05f344","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def ensure_retry(self, retry_name, retry_version\u003dNone,"},{"line_number":103,"context_line":"                     result_mapping\u003dNone):"},{"line_number":104,"context_line":"        \"\"\"Ensure that there is taskdetail that correspond the retry."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        If retry does not exist, adds a record for it. Added retry"},{"line_number":107,"context_line":"        will have PENDING state. Sets result mapping for the retry from"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BNb0%3D","line":104,"updated":"2014-01-29 02:02:08.000000000","message":"\u0027that correspond the retry\u0027 -\u003e \u0027that corresponds to the retry provided\u0027","commit_id":"49b8e768c18ba5d02b6d2c56d70d0eb1545fe964"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"99fff0e8b7dcc91042f9b9c9d4a4324441bdbc40","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class Storage(object):"},{"line_number":36,"context_line":"    \"\"\"Interface between engines and logbook"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    This class provides a simple interface to save tasks of a given flow and"},{"line_number":39,"context_line":"    associated activity and results to persistence layer (logbook,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F97A8%3D","line":36,"updated":"2014-02-01 02:38:12.000000000","message":"I think we lost a period.","commit_id":"84823589f0ebd97fbfdd552d99533ee15990ab85"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"1a341b2f2e9c0c0b233ac44d503cbe1e649ce742","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class Storage(object):"},{"line_number":36,"context_line":"    \"\"\"Interface between engines and logbook"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    This class provides a simple interface to save tasks of a given flow and"},{"line_number":39,"context_line":"    associated activity and results to persistence layer (logbook,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F92rE%3D","line":36,"in_reply_to":"AAAAUH%2F97A8%3D","updated":"2014-02-03 09:42:46.000000000","message":"Done","commit_id":"84823589f0ebd97fbfdd552d99533ee15990ab85"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"99fff0e8b7dcc91042f9b9c9d4a4324441bdbc40","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def ensure_retry(self, retry_name, retry_version\u003dNone,"},{"line_number":103,"context_line":"                     result_mapping\u003dNone):"},{"line_number":104,"context_line":"        \"\"\"Ensure that there is taskdetail that correspond the retry."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        If retry does not exist, adds a record for it. Added retry"},{"line_number":107,"context_line":"        will have PENDING state. Sets result mapping for the retry from"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F97BA%3D","line":104,"updated":"2014-02-01 02:38:12.000000000","message":"Hmmm, we really need to move away from calling this taskdetail, hopefully soon (to avoid the confusion)...","commit_id":"84823589f0ebd97fbfdd552d99533ee15990ab85"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"1a341b2f2e9c0c0b233ac44d503cbe1e649ce742","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def ensure_retry(self, retry_name, retry_version\u003dNone,"},{"line_number":103,"context_line":"                     result_mapping\u003dNone):"},{"line_number":104,"context_line":"        \"\"\"Ensure that there is taskdetail that correspond the retry."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        If retry does not exist, adds a record for it. Added retry"},{"line_number":107,"context_line":"        will have PENDING state. Sets result mapping for the retry from"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F92rI%3D","line":104,"in_reply_to":"AAAAUH%2F97BA%3D","updated":"2014-02-03 09:42:46.000000000","message":"I\u0027ll finish the main retry functionality and then will rename it in a separate change.","commit_id":"84823589f0ebd97fbfdd552d99533ee15990ab85"},{"author":{"_account_id":8895,"name":"Stanislav Kudriashev","email":"stas.kudriashev@gmail.com","username":"skudriashev"},"change_message_id":"1803873d9fc45ea7462e3d94532f698ba3084da3","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        If retry does not exist, adds a record for it. Added retry"},{"line_number":123,"context_line":"        will have PENDING state. Sets result mapping for the retry from"},{"line_number":124,"context_line":"        result_mapping argument. Initializes retry result as a empty"},{"line_number":125,"context_line":"        collections of results and failures history."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        Returns uuid for the retry details corresponding to the retry"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F9bng%3D","line":124,"updated":"2014-02-06 23:17:24.000000000","message":"...as aN empty...","commit_id":"ffefd73e8842867e57214074d39134c97e50128d"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"a20ba07362895fda3cf11812257276e15eed02a1","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        If retry does not exist, adds a record for it. Added retry"},{"line_number":123,"context_line":"        will have PENDING state. Sets result mapping for the retry from"},{"line_number":124,"context_line":"        result_mapping argument. Initializes retry result as a empty"},{"line_number":125,"context_line":"        collections of results and failures history."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        Returns uuid for the retry details corresponding to the retry"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F9X30%3D","line":124,"in_reply_to":"AAAAUH%2F9bng%3D","updated":"2014-02-07 11:26:56.000000000","message":"Done","commit_id":"ffefd73e8842867e57214074d39134c97e50128d"},{"author":{"_account_id":8895,"name":"Stanislav Kudriashev","email":"stas.kudriashev@gmail.com","username":"skudriashev"},"change_message_id":"1803873d9fc45ea7462e3d94532f698ba3084da3","unresolved":false,"context_lines":[{"line_number":148,"context_line":"           Returns created task detail."},{"line_number":149,"context_line":"        \"\"\""},{"line_number":150,"context_line":"        # TODO(imelnikov): check that task with same uuid or"},{"line_number":151,"context_line":"        # task name does not exist"},{"line_number":152,"context_line":"        td \u003d logbook.TaskDetail(name\u003dtask_name, uuid\u003duuid, atom_type\u003datom_type)"},{"line_number":153,"context_line":"        td.state \u003d states.PENDING"},{"line_number":154,"context_line":"        td.version \u003d task_version"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F9bmI%3D","line":151,"updated":"2014-02-06 23:17:24.000000000","message":"Why did you decide to remove punctuation at the end?","commit_id":"ffefd73e8842867e57214074d39134c97e50128d"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"a20ba07362895fda3cf11812257276e15eed02a1","unresolved":false,"context_lines":[{"line_number":148,"context_line":"           Returns created task detail."},{"line_number":149,"context_line":"        \"\"\""},{"line_number":150,"context_line":"        # TODO(imelnikov): check that task with same uuid or"},{"line_number":151,"context_line":"        # task name does not exist"},{"line_number":152,"context_line":"        td \u003d logbook.TaskDetail(name\u003dtask_name, uuid\u003duuid, atom_type\u003datom_type)"},{"line_number":153,"context_line":"        td.state \u003d states.PENDING"},{"line_number":154,"context_line":"        td.version \u003d task_version"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F9X3Y%3D","line":151,"in_reply_to":"AAAAUH%2F9bmI%3D","updated":"2014-02-07 11:26:56.000000000","message":"Done","commit_id":"ffefd73e8842867e57214074d39134c97e50128d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0fce5f4134196251bfb5254cabbf630b375a6a17","unresolved":false,"context_lines":[{"line_number":335,"context_line":"            td.results \u003d {\u0027results_history\u0027: [], \u0027failures_history\u0027: []}"},{"line_number":336,"context_line":"            self._with_connection(self._save_task_detail, task_detail\u003dtd)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _cache_failure(self, name, fail):"},{"line_number":339,"context_line":"        \"\"\"Ensure that cache has matching failure for task with this name."},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        We leave cached version if it matches as it may contain more"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F9bCs%3D","line":338,"updated":"2014-02-07 00:53:03.000000000","message":"I think u didn\u0027t want to keep these 2 functions. They were removed from the previous code to avoid a read lock trying to get a write lock (which isn\u0027t safe to do). Probably u just forgot to delete them when rebasing.","commit_id":"ffefd73e8842867e57214074d39134c97e50128d"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"a20ba07362895fda3cf11812257276e15eed02a1","unresolved":false,"context_lines":[{"line_number":335,"context_line":"            td.results \u003d {\u0027results_history\u0027: [], \u0027failures_history\u0027: []}"},{"line_number":336,"context_line":"            self._with_connection(self._save_task_detail, task_detail\u003dtd)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _cache_failure(self, name, fail):"},{"line_number":339,"context_line":"        \"\"\"Ensure that cache has matching failure for task with this name."},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        We leave cached version if it matches as it may contain more"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F9X2Y%3D","line":338,"in_reply_to":"AAAAUH%2F9bCs%3D","updated":"2014-02-07 11:26:56.000000000","message":"Done","commit_id":"ffefd73e8842867e57214074d39134c97e50128d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0fce5f4134196251bfb5254cabbf630b375a6a17","unresolved":false,"context_lines":[{"line_number":543,"context_line":"    \"\"\"Storage that uses locks to protect against concurrent access.\"\"\""},{"line_number":544,"context_line":"    _lock_cls \u003d lock_utils.ReaderWriterLock"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def get_retry_results(self, name):"},{"line_number":547,"context_line":"        \"\"\"Fetch retry results history.\"\"\""},{"line_number":548,"context_line":"        td \u003d self._taskdetail_by_name(name)"},{"line_number":549,"context_line":"        return td.results[\u0027results_history\u0027]"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F9bCY%3D","line":546,"updated":"2014-02-07 00:53:03.000000000","message":"Why is this here? Not useful to put read locks around retry failures?","commit_id":"ffefd73e8842867e57214074d39134c97e50128d"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"a20ba07362895fda3cf11812257276e15eed02a1","unresolved":false,"context_lines":[{"line_number":543,"context_line":"    \"\"\"Storage that uses locks to protect against concurrent access.\"\"\""},{"line_number":544,"context_line":"    _lock_cls \u003d lock_utils.ReaderWriterLock"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def get_retry_results(self, name):"},{"line_number":547,"context_line":"        \"\"\"Fetch retry results history.\"\"\""},{"line_number":548,"context_line":"        td \u003d self._taskdetail_by_name(name)"},{"line_number":549,"context_line":"        return td.results[\u0027results_history\u0027]"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F9X14%3D","line":546,"in_reply_to":"AAAAUH%2F9bCY%3D","updated":"2014-02-07 11:26:56.000000000","message":"Done","commit_id":"ffefd73e8842867e57214074d39134c97e50128d"},{"author":{"_account_id":7366,"name":"Ivan Melnikov","email":"imelnikov@griddynamics.com","username":"imelnikov"},"change_message_id":"3aa1850416b1d515b5bada2be55aeadc8ed8752a","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def ensure_retry(self, retry_name, retry_version\u003dNone,"},{"line_number":120,"context_line":"                     result_mapping\u003dNone):"},{"line_number":121,"context_line":"        \"\"\"Ensure that there is taskdetail that correspond the retry."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        If retry does not exist, adds a record for it. Added retry"},{"line_number":124,"context_line":"        will have PENDING state. Sets result mapping for the retry from"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FD4w%3D","line":121,"updated":"2014-02-17 11:45:08.000000000","message":"Atom detail?","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"c50f9bc6674064814ce95985554030ad76dbb9c1","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def ensure_retry(self, retry_name, retry_version\u003dNone,"},{"line_number":120,"context_line":"                     result_mapping\u003dNone):"},{"line_number":121,"context_line":"        \"\"\"Ensure that there is taskdetail that correspond the retry."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        If retry does not exist, adds a record for it. Added retry"},{"line_number":124,"context_line":"        will have PENDING state. Sets result mapping for the retry from"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FDKA%3D","line":121,"in_reply_to":"AAAAUX%2F%2FD4w%3D","updated":"2014-02-17 13:14:03.000000000","message":"Done","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"},{"author":{"_account_id":7366,"name":"Ivan Melnikov","email":"imelnikov@griddynamics.com","username":"imelnikov"},"change_message_id":"3aa1850416b1d515b5bada2be55aeadc8ed8752a","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                                                          retry_id),"},{"line_number":138,"context_line":"                                      retry_version)"},{"line_number":139,"context_line":"            else:"},{"line_number":140,"context_line":"                td \u003d self._flowdetail.find(retry_id)"},{"line_number":141,"context_line":"                if td.atom_type !\u003d logbook.RETRY_DETAIL:"},{"line_number":142,"context_line":"                    raise exceptions.AlreadyExists("},{"line_number":143,"context_line":"                        \"Task detail %s already exists in flow detail %s.\" %"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FD34%3D","line":140,"updated":"2014-02-17 11:45:08.000000000","message":"Please add tests for this branch to test_storage.py -- or point me to them if they are already here and I missing smth as usual)","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"c50f9bc6674064814ce95985554030ad76dbb9c1","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                                                          retry_id),"},{"line_number":138,"context_line":"                                      retry_version)"},{"line_number":139,"context_line":"            else:"},{"line_number":140,"context_line":"                td \u003d self._flowdetail.find(retry_id)"},{"line_number":141,"context_line":"                if td.atom_type !\u003d logbook.RETRY_DETAIL:"},{"line_number":142,"context_line":"                    raise exceptions.AlreadyExists("},{"line_number":143,"context_line":"                        \"Task detail %s already exists in flow detail %s.\" %"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FDHQ%3D","line":140,"in_reply_to":"AAAAUX%2F%2FD34%3D","updated":"2014-02-17 13:14:03.000000000","message":"Done","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"},{"author":{"_account_id":7366,"name":"Ivan Melnikov","email":"imelnikov@griddynamics.com","username":"imelnikov"},"change_message_id":"3aa1850416b1d515b5bada2be55aeadc8ed8752a","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            self._set_result_mapping(retry_name, result_mapping)"},{"line_number":146,"context_line":"        return retry_id"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _add_atom_detail(self, ad, task_version\u003dNone):"},{"line_number":149,"context_line":"        \"\"\"Add the atom detail to flow detail."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        Atom becomes known to storage by that name and uuid."}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FD0w%3D","line":148,"updated":"2014-02-17 11:45:08.000000000","message":"I think passing atom_type and deriving class via your get_atom_detail_class() would look cleaner here, wouldn\u0027t it? Passing half-created object and attribute to set to it looks weird to me.","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"c50f9bc6674064814ce95985554030ad76dbb9c1","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            self._set_result_mapping(retry_name, result_mapping)"},{"line_number":146,"context_line":"        return retry_id"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _add_atom_detail(self, ad, task_version\u003dNone):"},{"line_number":149,"context_line":"        \"\"\"Add the atom detail to flow detail."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        Atom becomes known to storage by that name and uuid."}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FDAg%3D","line":148,"in_reply_to":"AAAAUX%2F%2FD0w%3D","updated":"2014-02-17 13:14:03.000000000","message":"Done","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"},{"author":{"_account_id":7366,"name":"Ivan Melnikov","email":"imelnikov@griddynamics.com","username":"imelnikov"},"change_message_id":"3aa1850416b1d515b5bada2be55aeadc8ed8752a","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                if td.atom_type !\u003d logbook.RETRY_DETAIL:"},{"line_number":297,"context_line":"                    td.results \u003d None"},{"line_number":298,"context_line":"                td.failure \u003d data"},{"line_number":299,"context_line":"                self._failures[td.name] \u003d data"},{"line_number":300,"context_line":"            else:"},{"line_number":301,"context_line":"                if td.atom_type \u003d\u003d logbook.RETRY_DETAIL:"},{"line_number":302,"context_line":"                    td.results[\u0027results_history\u0027].append(data)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FDw0%3D","line":299,"updated":"2014-02-17 11:45:08.000000000","message":"I guess somewhere around here we should append the failure to failures_history of corresponding retry details. Or you have another idea how failures appear there?","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"},{"author":{"_account_id":7366,"name":"Ivan Melnikov","email":"imelnikov@griddynamics.com","username":"imelnikov"},"change_message_id":"e43b7b0229cf4e0509a91b97506933b6c804e727","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                if td.atom_type !\u003d logbook.RETRY_DETAIL:"},{"line_number":297,"context_line":"                    td.results \u003d None"},{"line_number":298,"context_line":"                td.failure \u003d data"},{"line_number":299,"context_line":"                self._failures[td.name] \u003d data"},{"line_number":300,"context_line":"            else:"},{"line_number":301,"context_line":"                if td.atom_type \u003d\u003d logbook.RETRY_DETAIL:"},{"line_number":302,"context_line":"                    td.results[\u0027results_history\u0027].append(data)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FC1Q%3D","line":299,"in_reply_to":"AAAAUX%2F%2FDEU%3D","updated":"2014-02-17 13:30:18.000000000","message":"I know that, and now I see how you\u0027ve done it. I just expected save_retry_failure method or smth like that to appear in this commit, not several commits later.\n\nIn short, never mind, I\u0027ll comment there if I\u0027ll have smth to say.","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"c50f9bc6674064814ce95985554030ad76dbb9c1","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                if td.atom_type !\u003d logbook.RETRY_DETAIL:"},{"line_number":297,"context_line":"                    td.results \u003d None"},{"line_number":298,"context_line":"                td.failure \u003d data"},{"line_number":299,"context_line":"                self._failures[td.name] \u003d data"},{"line_number":300,"context_line":"            else:"},{"line_number":301,"context_line":"                if td.atom_type \u003d\u003d logbook.RETRY_DETAIL:"},{"line_number":302,"context_line":"                    td.results[\u0027results_history\u0027].append(data)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FDEU%3D","line":299,"in_reply_to":"AAAAUX%2F%2FDw0%3D","updated":"2014-02-17 13:14:03.000000000","message":"This failure saves if retry fails, parent retry saves it in its failures_history, but failures_history of current retry saves subflow failures","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"},{"author":{"_account_id":8895,"name":"Stanislav Kudriashev","email":"stas.kudriashev@gmail.com","username":"skudriashev"},"change_message_id":"e1098fb056512006ecfd8f2dd4f18e06fcd15b50","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def ensure_retry(self, retry_name, retry_version\u003dNone,"},{"line_number":118,"context_line":"                     result_mapping\u003dNone):"},{"line_number":119,"context_line":"        \"\"\"Ensure that there is atom detail that correspond the retry."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        If retry does not exist, adds a record for it. Added retry"},{"line_number":122,"context_line":"        will have PENDING state. Sets result mapping for the retry from"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAWH%2F%2F%2B68%3D","line":119,"updated":"2014-03-12 15:04:26.000000000","message":"corresponds?","commit_id":"1e4e0b3acdf0bbfff865395c46c0547aa9a875b9"},{"author":{"_account_id":8895,"name":"Stanislav Kudriashev","email":"stas.kudriashev@gmail.com","username":"skudriashev"},"change_message_id":"e1098fb056512006ecfd8f2dd4f18e06fcd15b50","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                    # latest retry run."},{"line_number":446,"context_line":"                    if td.atom_type \u003d\u003d logbook.RETRY_DETAIL:"},{"line_number":447,"context_line":"                        if result:"},{"line_number":448,"context_line":"                            result \u003d result[-1][0]"},{"line_number":449,"context_line":"                        else:"},{"line_number":450,"context_line":"                            result \u003d None"},{"line_number":451,"context_line":"                    return misc.item_from(result, index, name)"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAWH%2F%2F%2B5M%3D","line":448,"updated":"2014-03-12 15:04:26.000000000","message":"Nice... Are you sure this would always work?","commit_id":"1e4e0b3acdf0bbfff865395c46c0547aa9a875b9"}],"taskflow/utils/persistence_utils.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0fce5f4134196251bfb5254cabbf630b375a6a17","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"def pformat_task_detail(task_detail, indent\u003d0):"},{"line_number":231,"context_line":"    \"\"\"Pretty formats a task detail.\"\"\""},{"line_number":232,"context_line":"    if task_detail.atom_type \u003d\u003d logbook.TASK_DETAIL:"},{"line_number":233,"context_line":"        detail_type \u003d \u0027Task\u0027"},{"line_number":234,"context_line":"    else:"},{"line_number":235,"context_line":"        detail_type \u003d \u0027Retry\u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F9bEM%3D","line":232,"updated":"2014-02-07 00:53:03.000000000","message":"How about just including the \u0027task_detail.atom_type\u0027 which is already a string. That then avoids this if statement completely.","commit_id":"ffefd73e8842867e57214074d39134c97e50128d"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"a20ba07362895fda3cf11812257276e15eed02a1","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"def pformat_task_detail(task_detail, indent\u003d0):"},{"line_number":231,"context_line":"    \"\"\"Pretty formats a task detail.\"\"\""},{"line_number":232,"context_line":"    if task_detail.atom_type \u003d\u003d logbook.TASK_DETAIL:"},{"line_number":233,"context_line":"        detail_type \u003d \u0027Task\u0027"},{"line_number":234,"context_line":"    else:"},{"line_number":235,"context_line":"        detail_type \u003d \u0027Retry\u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F9X1g%3D","line":232,"in_reply_to":"AAAAUH%2F9bEM%3D","updated":"2014-02-07 11:26:56.000000000","message":"Done","commit_id":"ffefd73e8842867e57214074d39134c97e50128d"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"cf76478d2746518ba31801dc7fd7bd14aecfa6c1","unresolved":false,"context_lines":[{"line_number":295,"context_line":""},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"def unformat_task_detail(uuid, td_data):"},{"line_number":298,"context_line":"    if td_data[\u0027atom_type\u0027] \u003d\u003d logbook.TASK_DETAIL:"},{"line_number":299,"context_line":"        td \u003d logbook.TaskDetail(name\u003dtd_data[\u0027name\u0027], uuid\u003duuid)"},{"line_number":300,"context_line":"    else:"},{"line_number":301,"context_line":"        td \u003d logbook.RetryDetail(name\u003dtd_data[\u0027name\u0027], uuid\u003duuid)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2Fxh4%3D","line":298,"updated":"2014-02-10 21:55:51.000000000","message":"If we have this mapping, why not just store using the reflection utilities the backing class? Then recreate a instance of it using the importutils in taskflow/openstack/common, then u don\u0027t need to store a constant mapping but can just store the type name itself (and later re-import this). That seems nicer than storing an enum here? What do u think?\n\nThen u can change this method to do that re-import (and it can be shared by all the different persistence utils users).","commit_id":"c02dfa1a68dbbaeb4bc6ef95b479f77cfb5e8255"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"c8e510cc0282654492fa60235b3f4d129f6c92a5","unresolved":false,"context_lines":[{"line_number":295,"context_line":""},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"def unformat_task_detail(uuid, td_data):"},{"line_number":298,"context_line":"    if td_data[\u0027atom_type\u0027] \u003d\u003d logbook.TASK_DETAIL:"},{"line_number":299,"context_line":"        td \u003d logbook.TaskDetail(name\u003dtd_data[\u0027name\u0027], uuid\u003duuid)"},{"line_number":300,"context_line":"    else:"},{"line_number":301,"context_line":"        td \u003d logbook.RetryDetail(name\u003dtd_data[\u0027name\u0027], uuid\u003duuid)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2Fkm0%3D","line":298,"in_reply_to":"AAAAUX%2F%2Fxh4%3D","updated":"2014-02-12 09:19:03.000000000","message":"Done","commit_id":"c02dfa1a68dbbaeb4bc6ef95b479f77cfb5e8255"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"a0f369aaa38b825d07429c3cdc78133fe15c1cc4","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"def encode_retry_results(results):"},{"line_number":200,"context_line":"    for (data, failures) in results:"},{"line_number":201,"context_line":"        for key, value in failures.items():"},{"line_number":202,"context_line":"            if isinstance(value, misc.Failure):"},{"line_number":203,"context_line":"                failures[key] \u003d failure_to_dict(value)"},{"line_number":204,"context_line":"    return results"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAWH%2F%2Fynw%3D","line":201,"updated":"2014-03-13 19:51:28.000000000","message":"Can we use six.iteritems here?","commit_id":"b3500e6f17842b26aa5b11033e855b9fec582c5a"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"005e70bf69f1af6cee52fa128c318d510000fc2f","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"def encode_retry_results(results):"},{"line_number":200,"context_line":"    for (data, failures) in results:"},{"line_number":201,"context_line":"        for key, value in failures.items():"},{"line_number":202,"context_line":"            if isinstance(value, misc.Failure):"},{"line_number":203,"context_line":"                failures[key] \u003d failure_to_dict(value)"},{"line_number":204,"context_line":"    return results"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAWH%2F%2Ftok%3D","line":201,"in_reply_to":"AAAAWH%2F%2Fynw%3D","updated":"2014-03-14 09:42:17.000000000","message":"Done","commit_id":"b3500e6f17842b26aa5b11033e855b9fec582c5a"}],"taskflow/utils/reflection.py":[{"author":{"_account_id":7366,"name":"Ivan Melnikov","email":"imelnikov@griddynamics.com","username":"imelnikov"},"change_message_id":"3aa1850416b1d515b5bada2be55aeadc8ed8752a","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    return bool(argspec.keywords)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"def get_atom_detail_class(atom_type):"},{"line_number":165,"context_line":"    if atom_type \u003d\u003d logbook.TASK_DETAIL:"},{"line_number":166,"context_line":"        return logbook.TaskDetail"},{"line_number":167,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FD6I%3D","line":164,"updated":"2014-02-17 11:45:08.000000000","message":"This function looks too persistence-specific to me. What about moving it to taskflow.persistence.logbook? At the very least, persistence_utils.py  looks like more appropriate place for it.","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"},{"author":{"_account_id":7349,"name":"Anastasia Karpinska","email":"akarpinska@griddynamics.com","username":"anastasia-karpinska"},"change_message_id":"c50f9bc6674064814ce95985554030ad76dbb9c1","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    return bool(argspec.keywords)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"def get_atom_detail_class(atom_type):"},{"line_number":165,"context_line":"    if atom_type \u003d\u003d logbook.TASK_DETAIL:"},{"line_number":166,"context_line":"        return logbook.TaskDetail"},{"line_number":167,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2FC9w%3D","line":164,"in_reply_to":"AAAAUX%2F%2FD6I%3D","updated":"2014-02-17 13:14:03.000000000","message":"Done","commit_id":"aafb81d281eddef32ea98b00fdb05c146463c5fd"}]}
