Lukas Bednar has posted comments on this change.

Change subject: Implementation of machine dialog parser for python
......................................................................


Patch Set 1:

(7 comments)

Thanks for quick review.


regarding to dict vs class, I don't agree that it can be done without 
additional logic. here I put that logic into classes. in 
MachineDialogParser.java there is _parseRequest which contains big if-else 
tree, where the similar logic is implemented as well.
there are also  differences in responses (including abort), which is controlled 
by another tree of if-else in java implementation. it seems to me more suitable 
to encapsulate these differences (including attributes) in class instead.


regarding to regular expressions. I don't mind I can replace it by 
line.startswith(XXX), line.split(' ', Y).
I decided to use regex from single reason: I am using named_groups 
'(?P<name>xxxx)', where the 'xxxx' is name of variable in Event constructor. it 
is similar to DataBoundConstructor annotation which is used in 'stapler' 
project, and it came handy to me here.


I would like to include test for that parser. I can not find the place in this 
repository where I could put tests for these python modules.
could you please advise me how to include that ?

http://gerrit.ovirt.org/#/c/28180/1/src/otopi/machine_dialog_parser.py
File src/otopi/machine_dialog_parser.py:

Line 174:     head_regex = re.compile('^[*]{3}Q:STRING (?P<name>.*)$')
Line 175: 
Line 176:     def _response(self):
Line 177:         if not isinstance(self.value, basestring) or '\n' in 
self.value:
Line 178:             msg = "QueryString.value must be single-line string, got: 
%s"
> please avoid use temp variables
Done
Line 179:             raise TypeError(msg % self.value)
Line 180:         return self.value
Line 181: 
Line 182: 


Line 193:     """
Line 194:     head_regex = re.compile('^[*]{3}Q:MULTI-STRING '
Line 195:                             '(?P<name>[^ ]+) '
Line 196:                             '(?P<boundary>[^ ]+) '
Line 197:                             '(?P<abort_boundary>[^ ]+)$')
> please do not draw code, single indent always.
Done
Line 198: 
Line 199:     def __init__(self, name, boundary, abort_boundary):
Line 200:         super(QueryMultiString, self).__init__(name)
Line 201:         self.boundary = boundary


Line 341: class MachineDialogParser(object):
Line 342:     """
Line 343:     Machine dialog parser.
Line 344:     """
Line 345:     logger = logging.getLogger(name=constants.Log.LOGGER_BASE)
> please inherit from base, so you have logger
Done
Line 346:     event_types = (NoteEvent,
Line 347:                    TerminateEvent,
Line 348:                    LogEvent,
Line 349:                    QueryString,


Line 350:                    QueryMultiString,
Line 351:                    QueryValue,
Line 352:                    ConfirmEvent,
Line 353:                    DisplayValue,
Line 354:                    DisplayMultiString)
> please do not draw code... single indent...
ok
Line 355: 
Line 356:     def __init__(self, input_=None, output=None, filter_=tuple()):
Line 357:         """
Line 358:         Keyword arguments:


Line 364:         self.output = None
Line 365:         self.input_ = None
Line 366:         self.set_streams(input_, output)
Line 367:         self.filter_ = None
Line 368:         self.set_filter(filter_)
> not sure what is the xxx_ convention... please use _ prefix for members.
'filter' is build-in function, same as 'input', 'id', 'type', ...

I am avoiding to hiding them in local scope.
Line 369: 
Line 370:     def _write(self, data):
Line 371:         """
Line 372:         Writes data to output stream


Line 378:         self.output.write(data)
Line 379:         self.output.write('\n')
Line 380:         self.output.flush()
Line 381: 
Line 382:     def set_filter(self, filter_):
> why do we need to filter?
I was thinking about ignoring events by parser. for example in case I don't 
care about NoteEvent and LogEvent, I would pass filter_=(NoteEvent, LogEvent).
Line 383:         """
Line 384:         Set list of events which should be skipped by parser.
Line 385: 
Line 386:         Keyword arguments:


Line 411:     def next_event(self):
Line 412:         """
Line 413:         Returns instance of Event
Line 414:         """
Line 415:         line = self.input_.readline()
> please do not assume string streams
what should I assume ? file descriptor ?
Line 416:         if not line:
Line 417:             raise UnexpectedEOF()
Line 418:         for event_type in self.event_types:
Line 419:             try:


-- 
To view, visit http://gerrit.ovirt.org/28180
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: Ia7b715a39840e548ef768ac9e77004cc0d98a9c0
Gerrit-PatchSet: 1
Gerrit-Project: otopi
Gerrit-Branch: master
Gerrit-Owner: Lukas Bednar <lbed...@redhat.com>
Gerrit-Reviewer: Alon Bar-Lev <alo...@redhat.com>
Gerrit-Reviewer: Lukas Bednar <lbed...@redhat.com>
Gerrit-Reviewer: automat...@ovirt.org
Gerrit-HasComments: Yes
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to