)]}'
{"ironic/common/exception.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"e463ea2605a1e274caa8bc9268998d977dacf4a5","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    message \u003d _(\"Resource already exists.\")"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class FrozenMachine(IronicException):"},{"line_number":194,"context_line":"    \"\"\"Exception raised when a frozen machine is modified.\"\"\""},{"line_number":195,"context_line":"    message \u003d _(\"Frozen state machine can not be modified\")"},{"line_number":196,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_015158d8","line":193,"updated":"2014-12-15 20:13:19.000000000","message":"Done","commit_id":"3f9b64e2f37e0e86d2b0648b4b655133158f3055"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8a5d62dd285de6ae38cb6d27c77c880b0d6045be","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    message \u003d _(\"Resource already exists.\")"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class FrozenMachine(IronicException):"},{"line_number":194,"context_line":"    \"\"\"Exception raised when a frozen machine is modified.\"\"\""},{"line_number":195,"context_line":"    message \u003d _(\"Frozen state machine can not be modified\")"},{"line_number":196,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_3d9c140f","line":193,"updated":"2014-12-11 22:38:49.000000000","message":"I don\u0027t think we need this any more.","commit_id":"3f9b64e2f37e0e86d2b0648b4b655133158f3055"}],"ironic/common/fsm.py":[{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"7588906130953843a93d9af22f6c996dc9da251d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"try:"},{"line_number":18,"context_line":"    from collections import OrderedDict  # noqa"},{"line_number":19,"context_line":"except ImportError:"},{"line_number":20,"context_line":"    from ordereddict import OrderedDict  # noqa"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_19ee1389","line":20,"updated":"2014-12-08 16:58:50.000000000","message":"If you\u0027re going to keep this, you need to add ordereddict to the requirements. But I *think* that\u0027s only for py26? So maybe you can drop this entirely.","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"7a0c170e8ddb41e94e4be810671f75f8a1de9c89","unresolved":false,"context_lines":[{"line_number":17,"context_line":"try:"},{"line_number":18,"context_line":"    from collections import OrderedDict  # noqa"},{"line_number":19,"context_line":"except ImportError:"},{"line_number":20,"context_line":"    from ordereddict import OrderedDict  # noqa"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_3684aad3","line":20,"in_reply_to":"3a961159_19ee1389","updated":"2014-12-09 02:12:39.000000000","message":"Ya, only for 2.6; drop at will.","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"0833a3a728ace94e17805136e88c8402fe391230","unresolved":false,"context_lines":[{"line_number":17,"context_line":"try:"},{"line_number":18,"context_line":"    from collections import OrderedDict  # noqa"},{"line_number":19,"context_line":"except ImportError:"},{"line_number":20,"context_line":"    from ordereddict import OrderedDict  # noqa"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_10323210","line":20,"in_reply_to":"3a961159_3684aad3","updated":"2014-12-09 21:12:40.000000000","message":"Done","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bd570c5da0e43b350caaadcf353b335c17d67e81","unresolved":false,"context_lines":[{"line_number":35,"context_line":"class FrozenMachine(Exception):"},{"line_number":36,"context_line":"    \"\"\"Exception raised when a frozen machine is modified.\"\"\""},{"line_number":37,"context_line":"    def __init__(self):"},{"line_number":38,"context_line":"        super(FrozenMachine, self).__init__(\"Frozen machine can\u0027t be modified\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class FSM(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_b0c057e1","line":38,"updated":"2014-12-10 19:31:27.000000000","message":"Thanks, it should be.","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bc17fcd6539be67dbb851b3ac305b3e18beb7ba6","unresolved":false,"context_lines":[{"line_number":35,"context_line":"class FrozenMachine(Exception):"},{"line_number":36,"context_line":"    \"\"\"Exception raised when a frozen machine is modified.\"\"\""},{"line_number":37,"context_line":"    def __init__(self):"},{"line_number":38,"context_line":"        super(FrozenMachine, self).__init__(\"Frozen machine can\u0027t be modified\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class FSM(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_db757634","line":38,"updated":"2014-12-05 12:17:29.000000000","message":"Why isn\u0027t it an IronicException?","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bd570c5da0e43b350caaadcf353b335c17d67e81","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self._states \u003d OrderedDict()"},{"line_number":64,"context_line":"        self._start_state \u003d start_state"},{"line_number":65,"context_line":"        self._target_state \u003d None"},{"line_number":66,"context_line":"        self._current \u003d None"},{"line_number":67,"context_line":"        self.frozen \u003d False"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_d0b7a384","line":66,"updated":"2014-12-10 19:31:27.000000000","message":"Done","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self._states \u003d OrderedDict()"},{"line_number":64,"context_line":"        self._start_state \u003d start_state"},{"line_number":65,"context_line":"        self._target_state \u003d None"},{"line_number":66,"context_line":"        self._current \u003d None"},{"line_number":67,"context_line":"        self.frozen \u003d False"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_7f87c9d7","line":66,"updated":"2014-12-09 20:12:50.000000000","message":"Would be nice to have a description/comment for some of the non-obvious variables. (I just figured out that this is a _Jump.)","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        return self._states[self._current.name][\u0027terminal\u0027]"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def add_state(self, state, on_enter\u003dNone, on_exit\u003dNone,"},{"line_number":91,"context_line":"            target\u003dNone, terminal\u003dNone):"},{"line_number":92,"context_line":"        \"\"\"Adds a given state to the state machine."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        The on_enter and on_exit callbacks, if provided will be expected to"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_7f0d0937","line":91,"updated":"2014-12-09 20:12:50.000000000","message":"Looking at the code, it seems like terminal is expected to be a Boolean. Why not set this as terminal\u003dFalse to be more explicit about it? (or rename to is_terminal)","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        if self.frozen:"},{"line_number":101,"context_line":"            raise FrozenMachine()"},{"line_number":102,"context_line":"        if state in self._states:"},{"line_number":103,"context_line":"            raise excp.Duplicate(\"State \u0027%s\u0027 already defined\" % state)"},{"line_number":104,"context_line":"        if on_enter is not None:"},{"line_number":105,"context_line":"            assert six.callable(on_enter), \"On enter callback must be callable\""},{"line_number":106,"context_line":"        if on_exit is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_fc8e67cf","line":103,"updated":"2014-12-09 20:12:50.000000000","message":"do we want to _() the strings?","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"0833a3a728ace94e17805136e88c8402fe391230","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        if self.frozen:"},{"line_number":101,"context_line":"            raise FrozenMachine()"},{"line_number":102,"context_line":"        if state in self._states:"},{"line_number":103,"context_line":"            raise excp.Duplicate(\"State \u0027%s\u0027 already defined\" % state)"},{"line_number":104,"context_line":"        if on_enter is not None:"},{"line_number":105,"context_line":"            assert six.callable(on_enter), \"On enter callback must be callable\""},{"line_number":106,"context_line":"        if on_exit is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_902542c4","line":103,"in_reply_to":"3a961159_fc8e67cf","updated":"2014-12-09 21:12:40.000000000","message":"Done","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":11739,"name":"Alex Weeks","email":"alex.weeks@gmail.com","username":"aweeks"},"change_message_id":"85fb5d00362e06a7245f3e4f5d92d0dc41d604d0","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        }"},{"line_number":119,"context_line":"        self._transitions[state] \u003d OrderedDict()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def add_reaction(self, state, event, reaction, *args, **kwargs):"},{"line_number":122,"context_line":"        \"\"\"Adds a reaction that may get triggered by the given event \u0026 state."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        Reaction callbacks may (depending on how the state machine is ran) be"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_65d5aab6","line":121,"updated":"2014-12-05 21:22:12.000000000","message":"Neither this, nor the two changes that are dependent upon this change, appear to use these callback features.  I\u0027m curious if you are planning to use them at some point point to more formally define the behavior of the FSM during state transitions.","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bd570c5da0e43b350caaadcf353b335c17d67e81","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        if self.frozen:"},{"line_number":142,"context_line":"            raise FrozenMachine()"},{"line_number":143,"context_line":"        if state not in self._states:"},{"line_number":144,"context_line":"            raise excp.NotFound(\"Can not add a reaction to event \u0027%s\u0027 for an\""},{"line_number":145,"context_line":"                                \" undefined state \u0027%s\u0027\" % (event, state))"},{"line_number":146,"context_line":"        assert six.callable(reaction), \"Reaction callback must be callable\""},{"line_number":147,"context_line":"        if event not in self._states[state][\u0027reactions\u0027]:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_f0badf6c","line":144,"updated":"2014-12-10 19:31:27.000000000","message":"that should be visible in the traceback, I think","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        if self.frozen:"},{"line_number":142,"context_line":"            raise FrozenMachine()"},{"line_number":143,"context_line":"        if state not in self._states:"},{"line_number":144,"context_line":"            raise excp.NotFound(\"Can not add a reaction to event \u0027%s\u0027 for an\""},{"line_number":145,"context_line":"                                \" undefined state \u0027%s\u0027\" % (event, state))"},{"line_number":146,"context_line":"        assert six.callable(reaction), \"Reaction callback must be callable\""},{"line_number":147,"context_line":"        if event not in self._states[state][\u0027reactions\u0027]:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_3f862166","line":144,"updated":"2014-12-09 20:12:50.000000000","message":"would it help to identify the reaction being added?","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bd570c5da0e43b350caaadcf353b335c17d67e81","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                                                self._states[start][\u0027on_exit\u0027])"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def process_event(self, event):"},{"line_number":170,"context_line":"        \"\"\"Trigger a state change in response to the provided event.\"\"\""},{"line_number":171,"context_line":"        current \u003d self._current"},{"line_number":172,"context_line":"        if current is None:"},{"line_number":173,"context_line":"            raise excp.InvalidState(\"Can only process events after\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_10b12b8f","line":170,"updated":"2014-12-10 19:31:27.000000000","message":"Removed return, since I am not driving event-chains from fsm.py","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                                                self._states[start][\u0027on_exit\u0027])"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def process_event(self, event):"},{"line_number":170,"context_line":"        \"\"\"Trigger a state change in response to the provided event.\"\"\""},{"line_number":171,"context_line":"        current \u003d self._current"},{"line_number":172,"context_line":"        if current is None:"},{"line_number":173,"context_line":"            raise excp.InvalidState(\"Can only process events after\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_1f324510","line":170,"updated":"2014-12-09 20:12:50.000000000","message":"returns ??","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        current \u003d self._current"},{"line_number":172,"context_line":"        if current is None:"},{"line_number":173,"context_line":"            raise excp.InvalidState(\"Can only process events after\""},{"line_number":174,"context_line":"                                    \" being initialized (not before)\")"},{"line_number":175,"context_line":"        if self._states[current.name][\u0027terminal\u0027]:"},{"line_number":176,"context_line":"            raise excp.InvalidState(\"Can not transition from terminal\""},{"line_number":177,"context_line":"                                    \" state \u0027%s\u0027 on event \u0027%s\u0027\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_5f83ed03","line":174,"updated":"2014-12-09 20:12:50.000000000","message":"I am wondering if more info would be useful. Eg, \u0027Cannot process event \u0027%s\u0027; the FSM hasn\u0027t been initialized yet.\u0027","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"217603add9f056f207baeb9c78afe323cf23efe5","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        current \u003d self._current"},{"line_number":172,"context_line":"        if current is None:"},{"line_number":173,"context_line":"            raise excp.InvalidState(\"Can only process events after\""},{"line_number":174,"context_line":"                                    \" being initialized (not before)\")"},{"line_number":175,"context_line":"        if self._states[current.name][\u0027terminal\u0027]:"},{"line_number":176,"context_line":"            raise excp.InvalidState(\"Can not transition from terminal\""},{"line_number":177,"context_line":"                                    \" state \u0027%s\u0027 on event \u0027%s\u0027\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_bc6591b6","line":174,"in_reply_to":"3a961159_5f83ed03","updated":"2014-12-10 20:46:03.000000000","message":"Probably, good idear.","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"b1c152f8c39e64548bb747ae669e296511ed745c","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        # set target if there is a new one"},{"line_number":195,"context_line":"        if (self._target_state is None and"},{"line_number":196,"context_line":"                self._states[replacement.name][\u0027target\u0027] is not None):"},{"line_number":197,"context_line":"            self._target_state \u003d self._states[replacement.name][\u0027target\u0027]"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        return ("},{"line_number":200,"context_line":"            self._states[replacement.name][\u0027reactions\u0027].get(event),"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_5af0b2fc","line":197,"updated":"2014-12-05 01:42:14.000000000","message":"I wonder if a check for the following is useful to?\n\n  if (self._target_state is not None and self._states[replacement.name][\u0027target\u0027] is not None and  self._states[replacement.name][\u0027target\u0027] !\u003d self._target_state):\n   raise uhoh....","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"6cc05f38b28689cfc2921002a2179407707e0c6b","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        # set target if there is a new one"},{"line_number":195,"context_line":"        if (self._target_state is None and"},{"line_number":196,"context_line":"                self._states[replacement.name][\u0027target\u0027] is not None):"},{"line_number":197,"context_line":"            self._target_state \u003d self._states[replacement.name][\u0027target\u0027]"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        return ("},{"line_number":200,"context_line":"            self._states[replacement.name][\u0027reactions\u0027].get(event),"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_0b904742","line":197,"in_reply_to":"3a961159_7f7189df","updated":"2014-12-09 22:47:28.000000000","message":"I think its a target \u0027after going through one or more transitions\u0027 which may have a better name, since the target of a transition is the next state, so maybe something better than target.\n\nPerhaps \u0027final_destination\u0027 or something?","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        # set target if there is a new one"},{"line_number":195,"context_line":"        if (self._target_state is None and"},{"line_number":196,"context_line":"                self._states[replacement.name][\u0027target\u0027] is not None):"},{"line_number":197,"context_line":"            self._target_state \u003d self._states[replacement.name][\u0027target\u0027]"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        return ("},{"line_number":200,"context_line":"            self._states[replacement.name][\u0027reactions\u0027].get(event),"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_7f7189df","line":197,"in_reply_to":"5a890539_5af0b2fc","updated":"2014-12-09 20:12:50.000000000","message":"is _target_state meant to be the target of the \u0027next\u0027 state after the current state, or is it meant to be some target state after going through one or more transitions? If the latter, then we wouldn\u0027t want that check.\n\n(I\u0027m still reading the code so I don\u0027t know what I\u0027m talking about.)","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bd570c5da0e43b350caaadcf353b335c17d67e81","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        )"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def test_event(self, event):"},{"line_number":205,"context_line":"        \"\"\"Check whether the event can be processed, but don\u0027t do it.\"\"\""},{"line_number":206,"context_line":"        current \u003d self._current"},{"line_number":207,"context_line":"        if current is None:"},{"line_number":208,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_30ac6735","line":205,"updated":"2014-12-10 19:31:27.000000000","message":"Done","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        )"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def test_event(self, event):"},{"line_number":205,"context_line":"        \"\"\"Check whether the event can be processed, but don\u0027t do it.\"\"\""},{"line_number":206,"context_line":"        current \u003d self._current"},{"line_number":207,"context_line":"        if current is None:"},{"line_number":208,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_aaaad1cf","line":205,"updated":"2014-12-09 20:12:50.000000000","message":"what about calling it \u0027can_process_event\u0027 or \u0027can_do_event\u0027? \u0027verify_event\u0027? doable_event? (Guess I don\u0027t like \u0027test\u0027).","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bd570c5da0e43b350caaadcf353b335c17d67e81","unresolved":false,"context_lines":[{"line_number":218,"context_line":"            state \u003d self._start_state"},{"line_number":219,"context_line":"        if state not in self._states:"},{"line_number":220,"context_line":"            raise excp.NotFound(\"Can not start from a undefined\""},{"line_number":221,"context_line":"                                \" state \u0027%s\u0027\" % (self._start_state))"},{"line_number":222,"context_line":"        if self._states[self._start_state][\u0027terminal\u0027]:"},{"line_number":223,"context_line":"            raise excp.InvalidState(\"Can not start from a terminal\""},{"line_number":224,"context_line":"                                    \" state \u0027%s\u0027\" % (self._start_state))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_50abb31c","line":221,"updated":"2014-12-10 19:31:27.000000000","message":"Done","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":218,"context_line":"            state \u003d self._start_state"},{"line_number":219,"context_line":"        if state not in self._states:"},{"line_number":220,"context_line":"            raise excp.NotFound(\"Can not start from a undefined\""},{"line_number":221,"context_line":"                                \" state \u0027%s\u0027\" % (self._start_state))"},{"line_number":222,"context_line":"        if self._states[self._start_state][\u0027terminal\u0027]:"},{"line_number":223,"context_line":"            raise excp.InvalidState(\"Can not start from a terminal\""},{"line_number":224,"context_line":"                                    \" state \u0027%s\u0027\" % (self._start_state))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_cae71d3f","line":221,"updated":"2014-12-09 20:12:50.000000000","message":"should it be \u0027state\u0027, not \u0027self._start_state\u0027?","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bd570c5da0e43b350caaadcf353b335c17d67e81","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                                \" state \u0027%s\u0027\" % (self._start_state))"},{"line_number":222,"context_line":"        if self._states[self._start_state][\u0027terminal\u0027]:"},{"line_number":223,"context_line":"            raise excp.InvalidState(\"Can not start from a terminal\""},{"line_number":224,"context_line":"                                    \" state \u0027%s\u0027\" % (self._start_state))"},{"line_number":225,"context_line":"        self._current \u003d _Jump(state, None, None)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def run(self, event, initialize\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_70a6ef54","line":224,"updated":"2014-12-10 19:31:27.000000000","message":"Done","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                                \" state \u0027%s\u0027\" % (self._start_state))"},{"line_number":222,"context_line":"        if self._states[self._start_state][\u0027terminal\u0027]:"},{"line_number":223,"context_line":"            raise excp.InvalidState(\"Can not start from a terminal\""},{"line_number":224,"context_line":"                                    \" state \u0027%s\u0027\" % (self._start_state))"},{"line_number":225,"context_line":"        self._current \u003d _Jump(state, None, None)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def run(self, event, initialize\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_6a454916","line":224,"updated":"2014-12-09 20:12:50.000000000","message":"ditto for the above lines, or maybe I am just confused.","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"f252c85fc3f76dde5601b1b1f28ce33827281ae8","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                        and want to use copies to run with (the copies have"},{"line_number":242,"context_line":"                        the current state that is different between machines)."},{"line_number":243,"context_line":"        \"\"\""},{"line_number":244,"context_line":"        c \u003d FSM(self.start_state)"},{"line_number":245,"context_line":"        if not shallow:"},{"line_number":246,"context_line":"            for state, data in six.iteritems(self._states):"},{"line_number":247,"context_line":"                copied_data \u003d data.copy()"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_7a6e4ec9","line":244,"updated":"2014-12-05 01:38:47.000000000","message":"Another change u probably want to do that I need to get a fix for is to copy over the freeze attribute; although I don\u0027t think it matters for your use-case that copies are unfrozen, but probably doesn\u0027t hurt.","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bd570c5da0e43b350caaadcf353b335c17d67e81","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        when running..."},{"line_number":264,"context_line":"        \"\"\""},{"line_number":265,"context_line":"        if initialize:"},{"line_number":266,"context_line":"            self.initialize()"},{"line_number":267,"context_line":"        while True:"},{"line_number":268,"context_line":"            old_state \u003d self.current_state"},{"line_number":269,"context_line":"            reaction, terminal \u003d self.process_event(event)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_90643b23","line":266,"updated":"2014-12-10 19:31:27.000000000","message":"I\u0027m removing run_iter","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        when running..."},{"line_number":264,"context_line":"        \"\"\""},{"line_number":265,"context_line":"        if initialize:"},{"line_number":266,"context_line":"            self.initialize()"},{"line_number":267,"context_line":"        while True:"},{"line_number":268,"context_line":"            old_state \u003d self.current_state"},{"line_number":269,"context_line":"            reaction, terminal \u003d self.process_event(event)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_4ae88db4","line":266,"updated":"2014-12-09 20:12:50.000000000","message":"if self.initialize() can take a state argument, would it make sense for run_iter to also have a state arg?","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @property"},{"line_number":298,"context_line":"    def states(self):"},{"line_number":299,"context_line":"        \"\"\"Returns the state names.\"\"\""},{"line_number":300,"context_line":"        return list(six.iterkeys(self._states))"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_0a13e5b8","line":299,"updated":"2014-12-09 20:12:50.000000000","message":"s/Returns/Returns a list of\u0027","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"0833a3a728ace94e17805136e88c8402fe391230","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    @property"},{"line_number":298,"context_line":"    def states(self):"},{"line_number":299,"context_line":"        \"\"\"Returns the state names.\"\"\""},{"line_number":300,"context_line":"        return list(six.iterkeys(self._states))"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_70161657","line":299,"in_reply_to":"3a961159_0a13e5b8","updated":"2014-12-09 21:12:40.000000000","message":"Done","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    @property"},{"line_number":303,"context_line":"    def events(self):"},{"line_number":304,"context_line":"        \"\"\"Returns how many events exist.\"\"\""},{"line_number":305,"context_line":"        c \u003d 0"},{"line_number":306,"context_line":"        for state in six.iterkeys(self._states):"},{"line_number":307,"context_line":"            c +\u003d len(self._transitions[state])"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_ea721910","line":304,"updated":"2014-12-09 20:12:50.000000000","message":"isn\u0027t this returning the number of transitions, not events? (The same event can be used in more than one transition, right?)","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"91ddf9719dc546b5715fc3f42d6f91a96ec6b82b","unresolved":false,"context_lines":[{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    @property"},{"line_number":303,"context_line":"    def events(self):"},{"line_number":304,"context_line":"        \"\"\"Returns how many events exist.\"\"\""},{"line_number":305,"context_line":"        c \u003d 0"},{"line_number":306,"context_line":"        for state in six.iterkeys(self._states):"},{"line_number":307,"context_line":"            c +\u003d len(self._transitions[state])"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_d36d119b","line":304,"in_reply_to":"3a961159_ea721910","updated":"2014-12-09 22:49:50.000000000","message":"States change from old stable state to a target stable state on a single event, but maybe this is could be better named...","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5f33265d7e613ae77d879bb6da59ecd8a2129e57","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        self.on_exit \u003d on_exit"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class FrozenMachine(excp.IronicException):"},{"line_number":34,"context_line":"    \"\"\"Exception raised when a frozen machine is modified.\"\"\""},{"line_number":35,"context_line":"    message \u003d _(\"Frozen state machine can not be modified\")"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_e61069aa","line":33,"updated":"2014-12-10 20:57:35.000000000","message":"All the ironic exceptions are in common/exception.py except this one. Should we put this in exception.py too? (the \u0027Duplicate\u0027 exception is in exception.py.)","commit_id":"438a4b3aaa68822d33dceaaad6a2bf82c8911a39"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"e14fe82d1dabe0fc3125acb027b754798c94d764","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        self.on_exit \u003d on_exit"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class FrozenMachine(excp.IronicException):"},{"line_number":34,"context_line":"    \"\"\"Exception raised when a frozen machine is modified.\"\"\""},{"line_number":35,"context_line":"    message \u003d _(\"Frozen state machine can not be modified\")"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_76f0a091","line":33,"in_reply_to":"3a961159_e61069aa","updated":"2014-12-11 00:42:41.000000000","message":"Done","commit_id":"438a4b3aaa68822d33dceaaad6a2bf82c8911a39"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5f33265d7e613ae77d879bb6da59ecd8a2129e57","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            self._states[state][\u0027reactions\u0027][event] \u003d (reaction, args, kwargs)"},{"line_number":149,"context_line":"        else:"},{"line_number":150,"context_line":"            raise excp.Duplicate("},{"line_number":151,"context_line":"                _(\"State \u0027%(state)s\u0027 reaction to event \u0027%(event)s \u0027\""},{"line_number":152,"context_line":"                  \"already defined\") % {\u0027state\u0027: state,"},{"line_number":153,"context_line":"                                        \u0027event\u0027: event})"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_dc56ddcd","line":151,"updated":"2014-12-10 20:57:35.000000000","message":"s/event)s \u0027/event)s\u0027 /","commit_id":"438a4b3aaa68822d33dceaaad6a2bf82c8911a39"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"e14fe82d1dabe0fc3125acb027b754798c94d764","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            self._states[state][\u0027reactions\u0027][event] \u003d (reaction, args, kwargs)"},{"line_number":149,"context_line":"        else:"},{"line_number":150,"context_line":"            raise excp.Duplicate("},{"line_number":151,"context_line":"                _(\"State \u0027%(state)s\u0027 reaction to event \u0027%(event)s \u0027\""},{"line_number":152,"context_line":"                  \"already defined\") % {\u0027state\u0027: state,"},{"line_number":153,"context_line":"                                        \u0027event\u0027: event})"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_56a2c499","line":151,"in_reply_to":"3a961159_dc56ddcd","updated":"2014-12-11 00:42:41.000000000","message":"Done","commit_id":"438a4b3aaa68822d33dceaaad6a2bf82c8911a39"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5f33265d7e613ae77d879bb6da59ecd8a2129e57","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        return True"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def initialize(self, state\u003dNone):"},{"line_number":217,"context_line":"        \"\"\"Sets up the state machine (sets current state to start state...).\"\"\""},{"line_number":218,"context_line":"        if state is None:"},{"line_number":219,"context_line":"            state \u003d self._start_state"},{"line_number":220,"context_line":"        if state not in self._states:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_bc06711b","line":217,"updated":"2014-12-10 20:57:35.000000000","message":"This is not quite right. It sets the current state to the specified state, or start_state if no state was specified.","commit_id":"438a4b3aaa68822d33dceaaad6a2bf82c8911a39"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"e14fe82d1dabe0fc3125acb027b754798c94d764","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        return True"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def initialize(self, state\u003dNone):"},{"line_number":217,"context_line":"        \"\"\"Sets up the state machine (sets current state to start state...).\"\"\""},{"line_number":218,"context_line":"        if state is None:"},{"line_number":219,"context_line":"            state \u003d self._start_state"},{"line_number":220,"context_line":"        if state not in self._states:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_761ee0bc","line":217,"in_reply_to":"3a961159_bc06711b","updated":"2014-12-11 00:42:41.000000000","message":"Done","commit_id":"438a4b3aaa68822d33dceaaad6a2bf82c8911a39"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5f33265d7e613ae77d879bb6da59ecd8a2129e57","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        if state not in self._states:"},{"line_number":221,"context_line":"            raise excp.NotFound(_(\"Can not start from an undefined\""},{"line_number":222,"context_line":"                                  \" state \u0027%s\u0027\") % (state))"},{"line_number":223,"context_line":"        if self._states[self._start_state][\u0027terminal\u0027]:"},{"line_number":224,"context_line":"            raise excp.InvalidState(_(\"Can not start from a terminal\""},{"line_number":225,"context_line":"                                      \" state \u0027%s\u0027\") % (state))"},{"line_number":226,"context_line":"        self._current \u003d _Jump(state, None, None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_e63f89d4","line":223,"updated":"2014-12-10 20:57:35.000000000","message":"I think you want \u0027state\u0027, not \u0027self._state_state\u0027.","commit_id":"438a4b3aaa68822d33dceaaad6a2bf82c8911a39"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"e14fe82d1dabe0fc3125acb027b754798c94d764","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        if state not in self._states:"},{"line_number":221,"context_line":"            raise excp.NotFound(_(\"Can not start from an undefined\""},{"line_number":222,"context_line":"                                  \" state \u0027%s\u0027\") % (state))"},{"line_number":223,"context_line":"        if self._states[self._start_state][\u0027terminal\u0027]:"},{"line_number":224,"context_line":"            raise excp.InvalidState(_(\"Can not start from a terminal\""},{"line_number":225,"context_line":"                                      \" state \u0027%s\u0027\") % (state))"},{"line_number":226,"context_line":"        self._current \u003d _Jump(state, None, None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_d6f5d457","line":223,"in_reply_to":"3a961159_e63f89d4","updated":"2014-12-11 00:42:41.000000000","message":"Done","commit_id":"438a4b3aaa68822d33dceaaad6a2bf82c8911a39"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f83d50e5cf32c1b4c01ce39e8843827bd046432e","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        if state in self._states:"},{"line_number":96,"context_line":"            raise excp.Duplicate(_(\"State \u0027%s\u0027 already defined\") % state)"},{"line_number":97,"context_line":"        if on_enter is not None:"},{"line_number":98,"context_line":"            assert six.callable(on_enter), \"On enter callback must be callable\""},{"line_number":99,"context_line":"        if on_exit is not None:"},{"line_number":100,"context_line":"            assert six.callable(on_exit), \"On exit callback must be callable\""},{"line_number":101,"context_line":"        if target is not None and target not in self._states:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_714c2ac9","line":98,"updated":"2014-12-11 01:16:23.000000000","message":"Done","commit_id":"7284e8f34b6117471fccdde2876e4055eeef71b4"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"1873a280456232ddbbf1b1a5a436b46cc434791a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        if state in self._states:"},{"line_number":96,"context_line":"            raise excp.Duplicate(_(\"State \u0027%s\u0027 already defined\") % state)"},{"line_number":97,"context_line":"        if on_enter is not None:"},{"line_number":98,"context_line":"            assert six.callable(on_enter), \"On enter callback must be callable\""},{"line_number":99,"context_line":"        if on_exit is not None:"},{"line_number":100,"context_line":"            assert six.callable(on_exit), \"On exit callback must be callable\""},{"line_number":101,"context_line":"        if target is not None and target not in self._states:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_d1d79e49","line":98,"updated":"2014-12-11 00:56:26.000000000","message":"Get rid of these asserts and use value errors.\n\nAsserts can be compiled out (sadly...)","commit_id":"7284e8f34b6117471fccdde2876e4055eeef71b4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4dec81892acaa020f89f715bf19c7a25d9d47a0f","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    def __init__(self, name, on_enter, on_exit):"},{"line_number":28,"context_line":"        self.name \u003d name"},{"line_number":29,"context_line":"        self.on_enter \u003d on_enter"},{"line_number":30,"context_line":"        self.on_exit \u003d on_exit"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class FSM(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_116bdcf2","line":30,"updated":"2014-12-11 09:45:05.000000000","message":"It is somewhat vague that on_exit is run before on_enter. maybe call them on_previous_exit and on_next_enter?","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4dec81892acaa020f89f715bf19c7a25d9d47a0f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":"    def __init__(self, start_state\u003dNone):"},{"line_number":54,"context_line":"        self._transitions \u003d {}"},{"line_number":55,"context_line":"        self._states \u003d OrderedDict()"},{"line_number":56,"context_line":"        self._start_state \u003d start_state"},{"line_number":57,"context_line":"        self._target_state \u003d None"},{"line_number":58,"context_line":"        # Note that _current is a _Jump instance"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_b14cc8c9","line":55,"updated":"2014-12-11 09:45:05.000000000","message":"why is it ordered?","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4dec81892acaa020f89f715bf19c7a25d9d47a0f","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            \u0027on_exit\u0027: on_exit,"},{"line_number":112,"context_line":"            \u0027target\u0027: target,"},{"line_number":113,"context_line":"        }"},{"line_number":114,"context_line":"        self._transitions[state] \u003d OrderedDict()"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def add_reaction(self, state, event, reaction, *args, **kwargs):"},{"line_number":117,"context_line":"        \"\"\"Adds a reaction that may get triggered by the given event \u0026 state."}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_91da6ce6","line":114,"updated":"2014-12-11 09:45:05.000000000","message":"ditto","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b4a7053357a23adea3d1b6c074023ac7d7af8e67","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                _(\"Can not add a reaction to event \u0027%(event)s\u0027 for an\""},{"line_number":141,"context_line":"                  \" undefined state \u0027%(state)s\u0027\") % {\u0027event\u0027: event,"},{"line_number":142,"context_line":"                                                     \u0027state\u0027: state})"},{"line_number":143,"context_line":"        assert six.callable(reaction), \"Reaction callback must be callable\""},{"line_number":144,"context_line":"        if event not in self._states[state][\u0027reactions\u0027]:"},{"line_number":145,"context_line":"            self._states[state][\u0027reactions\u0027][event] \u003d (reaction, args, kwargs)"},{"line_number":146,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_a95b71f4","line":143,"updated":"2014-12-11 18:39:27.000000000","message":"Do we want to replace this assert as well?","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4dec81892acaa020f89f715bf19c7a25d9d47a0f","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                        the current state that is different between machines)."},{"line_number":240,"context_line":"        \"\"\""},{"line_number":241,"context_line":"        c \u003d FSM(self.start_state)"},{"line_number":242,"context_line":"        if not shallow:"},{"line_number":243,"context_line":"            for state, data in six.iteritems(self._states):"},{"line_number":244,"context_line":"                copied_data \u003d data.copy()"},{"line_number":245,"context_line":"                copied_data[\u0027reactions\u0027] \u003d copied_data[\u0027reactions\u0027].copy()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_11c4bcf3","line":242,"updated":"2014-12-11 09:45:05.000000000","message":"couldn\u0027t we use copy.deepcopy() here?","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"14137ee7d08163ea0e38e513c1622744bfa20f42","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                        the current state that is different between machines)."},{"line_number":240,"context_line":"        \"\"\""},{"line_number":241,"context_line":"        c \u003d FSM(self.start_state)"},{"line_number":242,"context_line":"        if not shallow:"},{"line_number":243,"context_line":"            for state, data in six.iteritems(self._states):"},{"line_number":244,"context_line":"                copied_data \u003d data.copy()"},{"line_number":245,"context_line":"                copied_data[\u0027reactions\u0027] \u003d copied_data[\u0027reactions\u0027].copy()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_dd3150ee","line":242,"updated":"2014-12-11 20:50:34.000000000","message":"no - certain items are not copied, even in a non-shallow copy","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"e463ea2605a1e274caa8bc9268998d977dacf4a5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \"\"\"A finite state machine."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    This class models a state machine, and expects an outside caller to"},{"line_number":42,"context_line":"    manually trigger the state changes one at a time by invoking process_vent()"},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    def __init__(self, start_state\u003dNone):"},{"line_number":45,"context_line":"        self._transitions \u003d {}"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_e1536ce0","line":42,"updated":"2014-12-15 20:13:19.000000000","message":"Done","commit_id":"3f9b64e2f37e0e86d2b0648b4b655133158f3055"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8a5d62dd285de6ae38cb6d27c77c880b0d6045be","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \"\"\"A finite state machine."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    This class models a state machine, and expects an outside caller to"},{"line_number":42,"context_line":"    manually trigger the state changes one at a time by invoking process_vent()"},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":"    def __init__(self, start_state\u003dNone):"},{"line_number":45,"context_line":"        self._transitions \u003d {}"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_dd4b10af","line":42,"updated":"2014-12-11 22:38:49.000000000","message":"s/process_vent/process_event/","commit_id":"3f9b64e2f37e0e86d2b0648b4b655133158f3055"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"62b38384a2a93d7a1aad620a937d9d6cd41c339d","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                        and want to use copies to run with (the copies have"},{"line_number":189,"context_line":"                        the current state that is different between machines)."},{"line_number":190,"context_line":"        \"\"\""},{"line_number":191,"context_line":"        c \u003d FSM(self.start_state)"},{"line_number":192,"context_line":"        if not shallow:"},{"line_number":193,"context_line":"            for state, data in six.iteritems(self._states):"},{"line_number":194,"context_line":"                copied_data \u003d data.copy()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_2f6bd3b7","line":191,"updated":"2014-12-12 21:00:15.000000000","message":"Copy over the frozen attribute?","commit_id":"3f9b64e2f37e0e86d2b0648b4b655133158f3055"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"3ebde6ca5df472f7f1002e2d46ee97cbb27ce9b9","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                        and want to use copies to run with (the copies have"},{"line_number":189,"context_line":"                        the current state that is different between machines)."},{"line_number":190,"context_line":"        \"\"\""},{"line_number":191,"context_line":"        c \u003d FSM(self.start_state)"},{"line_number":192,"context_line":"        if not shallow:"},{"line_number":193,"context_line":"            for state, data in six.iteritems(self._states):"},{"line_number":194,"context_line":"                copied_data \u003d data.copy()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_0f7ff766","line":191,"in_reply_to":"3a961159_2f6bd3b7","updated":"2014-12-12 21:01:26.000000000","message":"Nm, the frozen attribute is gone, haha.","commit_id":"3f9b64e2f37e0e86d2b0648b4b655133158f3055"}],"ironic/common/states.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"2672ba5ee4b049695b611f521e603e84aee8cbe5","unresolved":false,"context_lines":[{"line_number":120,"context_line":"machine.add_state(DEPLOYING, target\u003dDEPLOYDONE)"},{"line_number":121,"context_line":"machine.add_state(DEPLOYWAIT)"},{"line_number":122,"context_line":"machine.add_state(DEPLOYFAIL)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"# Add rebuild state"},{"line_number":125,"context_line":"machine.add_state(REBUILD, target\u003dDEPLOYDONE)"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_daff42a9","line":123,"updated":"2014-12-05 01:47:52.000000000","message":"Something that would also be useful (maybe), is to add callbacks that use a logger to show whats going on.\n\nIn taskflow this/similar exists @ https://github.com/openstack/taskflow/blob/master/taskflow/engines/action_engine/runner.py#L162\n\nCould be useful for u to have something similar (at least for seeing what\u0027s happening).","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":120,"context_line":"machine.add_state(DEPLOYING, target\u003dDEPLOYDONE)"},{"line_number":121,"context_line":"machine.add_state(DEPLOYWAIT)"},{"line_number":122,"context_line":"machine.add_state(DEPLOYFAIL)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"# Add rebuild state"},{"line_number":125,"context_line":"machine.add_state(REBUILD, target\u003dDEPLOYDONE)"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_a535a2dc","line":123,"in_reply_to":"5a890539_daff42a9","updated":"2014-12-09 20:12:50.000000000","message":"anything that will help with debugging ;)","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"8e98e4978e00d3a623985a988f753855d1e0d3fa","unresolved":false,"context_lines":[{"line_number":136,"context_line":"machine.add_transition(DEPLOYING, DEPLOYFAIL, \u0027fail\u0027)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"# A failed deployment may be retried"},{"line_number":139,"context_line":"# ironic/conductor/manager.py:655"},{"line_number":140,"context_line":"machine.add_transition(DEPLOYFAIL, DEPLOYING, \u0027rebuild\u0027)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"# A deployment may also wait on external callbacks"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_4a36cd53","line":139,"updated":"2014-12-09 19:54:38.000000000","message":"Although these references to file and line numbers are helpful now, there is no way we are going to keep these up-to-date when manager.py changes.","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"0833a3a728ace94e17805136e88c8402fe391230","unresolved":false,"context_lines":[{"line_number":136,"context_line":"machine.add_transition(DEPLOYING, DEPLOYFAIL, \u0027fail\u0027)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"# A failed deployment may be retried"},{"line_number":139,"context_line":"# ironic/conductor/manager.py:655"},{"line_number":140,"context_line":"machine.add_transition(DEPLOYFAIL, DEPLOYING, \u0027rebuild\u0027)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"# A deployment may also wait on external callbacks"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_d006ea1f","line":139,"in_reply_to":"3a961159_4a36cd53","updated":"2014-12-09 21:12:40.000000000","message":"Changed the line numbers to method names.","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6d251eed5184c968e5a9978a72677a2fbfccd5ce","unresolved":false,"context_lines":[{"line_number":159,"context_line":"machine.add_transition(DEPLOYWAIT, DELETING, \u0027delete\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"# A failed deployment may also be deleted"},{"line_number":162,"context_line":"# ironic/conductor/manager.py:757"},{"line_number":163,"context_line":"machine.add_transition(DEPLOYFAIL, DELETING, \u0027delete\u0027)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"# A delete may complete"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_c5be2eff","line":162,"updated":"2014-12-09 20:12:50.000000000","message":"the line numbers may change. Are these here temporarily? (maybe the method name might be more long-lasting).","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"0833a3a728ace94e17805136e88c8402fe391230","unresolved":false,"context_lines":[{"line_number":159,"context_line":"machine.add_transition(DEPLOYWAIT, DELETING, \u0027delete\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"# A failed deployment may also be deleted"},{"line_number":162,"context_line":"# ironic/conductor/manager.py:757"},{"line_number":163,"context_line":"machine.add_transition(DEPLOYFAIL, DELETING, \u0027delete\u0027)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"# A delete may complete"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_f0012607","line":162,"in_reply_to":"3a961159_c5be2eff","updated":"2014-12-09 21:12:40.000000000","message":"Done","commit_id":"ce2276f4598bbf47c75735b74fcf345b5078c536"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b4a7053357a23adea3d1b6c074023ac7d7af8e67","unresolved":false,"context_lines":[{"line_number":187,"context_line":"# A delete may complete"},{"line_number":188,"context_line":"machine.add_transition(DELETING, NOSTATE, \u0027done\u0027)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"# Any state can also transition to error"},{"line_number":191,"context_line":"machine.add_transition(NOSTATE, ERROR, \u0027error\u0027)"},{"line_number":192,"context_line":"machine.add_transition(DEPLOYING, ERROR, \u0027error\u0027)"},{"line_number":193,"context_line":"machine.add_transition(ACTIVE, ERROR, \u0027error\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_29d6a1f1","line":190,"updated":"2014-12-11 18:39:27.000000000","message":"\u0027Any state\u0027 -\u003e \u0027These states\u0027 ?","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"14137ee7d08163ea0e38e513c1622744bfa20f42","unresolved":false,"context_lines":[{"line_number":187,"context_line":"# A delete may complete"},{"line_number":188,"context_line":"machine.add_transition(DELETING, NOSTATE, \u0027done\u0027)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"# Any state can also transition to error"},{"line_number":191,"context_line":"machine.add_transition(NOSTATE, ERROR, \u0027error\u0027)"},{"line_number":192,"context_line":"machine.add_transition(DEPLOYING, ERROR, \u0027error\u0027)"},{"line_number":193,"context_line":"machine.add_transition(ACTIVE, ERROR, \u0027error\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_1d4f586c","line":190,"updated":"2014-12-11 20:50:34.000000000","message":"fixed","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"}],"ironic/tests/fsm_utils.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b4a7053357a23adea3d1b6c074023ac7d7af8e67","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# utlities used by test_fsm"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_09f00590","line":1,"updated":"2014-12-11 18:39:27.000000000","message":"s/utlities/utilities/","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"14137ee7d08163ea0e38e513c1622744bfa20f42","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# utlities used by test_fsm"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_fd2e0c8b","line":1,"updated":"2014-12-11 20:50:34.000000000","message":"this file isn\u0027t necessary. i\u0027ve removed it","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b4a7053357a23adea3d1b6c074023ac7d7af8e67","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from oslotest import base"},{"line_number":21,"context_line":"from testtools import compat"},{"line_number":22,"context_line":"from testtools import matchers"},{"line_number":23,"context_line":"from testtools import testcase"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def wrap_all_failures():"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_e93d792c","line":23,"updated":"2014-12-11 18:39:27.000000000","message":"The ordering of the above imports seems odd. I guess we don\u0027t have any hacking rules for it.","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b4a7053357a23adea3d1b6c074023ac7d7af8e67","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    try:"},{"line_number":30,"context_line":"        yield"},{"line_number":31,"context_line":"    except Exception:"},{"line_number":32,"context_line":"        raise excp.WrappedFailure([object])"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def sequence_minus(seq1, seq2):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_898155c5","line":32,"updated":"2014-12-11 18:39:27.000000000","message":"Ironic doesn\u0027t have this exception.","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4dec81892acaa020f89f715bf19c7a25d9d47a0f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        raise excp.WrappedFailure([object])"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def sequence_minus(seq1, seq2):"},{"line_number":36,"context_line":"    \"\"\"Calculate difference of two sequences."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    Result contains the elements from first sequence that are not"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_b41bd671","line":35,"updated":"2014-12-11 09:45:05.000000000","message":"maybe s/sequence_minus/sequence_difference/\n\nalso it can be implemented (if the goal is to avoid sets) as \n\n return [i for i in seq1 if i not in seq2]\n\nwhich has the same O(n^2) complexity but is a bit shorted","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b4a7053357a23adea3d1b6c074023ac7d7af8e67","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    Result contains the elements from first sequence that are not"},{"line_number":39,"context_line":"    present in second sequence, in original order. Works even"},{"line_number":40,"context_line":"    if sequence elements are not hashable."},{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":"    result \u003d list(seq1)"},{"line_number":43,"context_line":"    for item in seq2:"},{"line_number":44,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_29f7815a","line":41,"updated":"2014-12-11 18:39:27.000000000","message":"don\u0027t know if it matters or not, but it returns a list, may not be the same type as seq1","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b4a7053357a23adea3d1b6c074023ac7d7af8e67","unresolved":false,"context_lines":[{"line_number":63,"context_line":"class FailureRegexpMatcher(object):"},{"line_number":64,"context_line":"    \"\"\"Matches if the failure was caused by the given exception and message."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    This will match if a given failure contains and exception of the given"},{"line_number":67,"context_line":"    class type and if its string message matches to the given regular"},{"line_number":68,"context_line":"    expression pattern."},{"line_number":69,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_34c35458","line":66,"updated":"2014-12-11 18:39:27.000000000","message":"s/and/an/","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4dec81892acaa020f89f715bf19c7a25d9d47a0f","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                           *args, **kwargs):"},{"line_number":142,"context_line":"        # TODO(harlowja): submit a pull/review request to testtools to add"},{"line_number":143,"context_line":"        # this method to there codebase instead of having it exist in ours"},{"line_number":144,"context_line":"        # since it really doesn\u0027t belong here."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        class ReRaiseOtherTypes(object):"},{"line_number":147,"context_line":"            def match(self, matchee):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_f4763ea3","line":144,"updated":"2014-12-11 09:45:05.000000000","message":"Dear god, why are we using testtools if it\u0027s SO inferior even to the standard library?","commit_id":"324b7f10573f5723ce765340816605c15ccc67fd"}],"ironic/tests/test_fsm.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"e463ea2605a1e274caa8bc9268998d977dacf4a5","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        c.add_state(\u0027up\u0027)"},{"line_number":86,"context_line":"        c.add_state(\u0027down\u0027)"},{"line_number":87,"context_line":"        self.assertEqual(2, len(c.states))"},{"line_number":88,"context_line":"        self.assertEqual(0, len(d.states))"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_invalid_callbacks(self):"},{"line_number":91,"context_line":"        m \u003d fsm.FSM(\u0027working\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_215d74ed","line":88,"updated":"2014-12-15 20:13:19.000000000","message":"Done","commit_id":"3f9b64e2f37e0e86d2b0648b4b655133158f3055"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"8a5d62dd285de6ae38cb6d27c77c880b0d6045be","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        c.add_state(\u0027up\u0027)"},{"line_number":86,"context_line":"        c.add_state(\u0027down\u0027)"},{"line_number":87,"context_line":"        self.assertEqual(2, len(c.states))"},{"line_number":88,"context_line":"        self.assertEqual(0, len(d.states))"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_invalid_callbacks(self):"},{"line_number":91,"context_line":"        m \u003d fsm.FSM(\u0027working\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_364fd16c","line":88,"updated":"2014-12-11 22:38:49.000000000","message":"might also want a test for shallow copy. and maybe set current, and check that the copy doesn\u0027t have it set.","commit_id":"3f9b64e2f37e0e86d2b0648b4b655133158f3055"}]}
