368 # If we receive a fileobjectproxy, we need to use a variation of this |
368 # If we receive a fileobjectproxy, we need to use a variation of this |
369 # class that notifies observers about activity. |
369 # class that notifies observers about activity. |
370 if isinstance(fh, fileobjectproxy): |
370 if isinstance(fh, fileobjectproxy): |
371 cls = observedbufferedinputpipe |
371 cls = observedbufferedinputpipe |
372 |
372 |
373 return super(bufferedinputpipe, cls).__new__(cls) |
373 return super().__new__(cls) |
374 |
374 |
375 def __init__(self, input): |
375 def __init__(self, input): |
376 self._input = input |
376 self._input = input |
377 self._buffer = [] |
377 self._buffer = [] |
378 self._eof = False |
378 self._eof = False |
710 ``os.read()`` events. It also re-publishes other events, such as |
710 ``os.read()`` events. It also re-publishes other events, such as |
711 ``read()`` and ``readline()``. |
711 ``read()`` and ``readline()``. |
712 """ |
712 """ |
713 |
713 |
714 def _fillbuffer(self, size=_chunksize): |
714 def _fillbuffer(self, size=_chunksize): |
715 res = super(observedbufferedinputpipe, self)._fillbuffer(size=size) |
715 res = super()._fillbuffer(size=size) |
716 |
716 |
717 fn = getattr(self._input._observer, 'osread', None) |
717 fn = getattr(self._input._observer, 'osread', None) |
718 if fn: |
718 if fn: |
719 fn(res, size) |
719 fn(res, size) |
720 |
720 |
721 return res |
721 return res |
722 |
722 |
723 # We use different observer methods because the operation isn't |
723 # We use different observer methods because the operation isn't |
724 # performed on the actual file object but on us. |
724 # performed on the actual file object but on us. |
725 def read(self, size): |
725 def read(self, size): |
726 res = super(observedbufferedinputpipe, self).read(size) |
726 res = super().read(size) |
727 |
727 |
728 fn = getattr(self._input._observer, 'bufferedread', None) |
728 fn = getattr(self._input._observer, 'bufferedread', None) |
729 if fn: |
729 if fn: |
730 fn(res, size) |
730 fn(res, size) |
731 |
731 |
732 return res |
732 return res |
733 |
733 |
734 def readline(self, *args, **kwargs): |
734 def readline(self, *args, **kwargs): |
735 res = super(observedbufferedinputpipe, self).readline(*args, **kwargs) |
735 res = super().readline(*args, **kwargs) |
736 |
736 |
737 fn = getattr(self._input._observer, 'bufferedreadline', None) |
737 fn = getattr(self._input._observer, 'bufferedreadline', None) |
738 if fn: |
738 if fn: |
739 fn(res) |
739 fn(res) |
740 |
740 |
921 """Logs file object activity.""" |
921 """Logs file object activity.""" |
922 |
922 |
923 def __init__( |
923 def __init__( |
924 self, fh, name, reads=True, writes=True, logdata=False, logdataapis=True |
924 self, fh, name, reads=True, writes=True, logdata=False, logdataapis=True |
925 ): |
925 ): |
926 super(fileobjectobserver, self).__init__(fh, name, logdata, logdataapis) |
926 super().__init__(fh, name, logdata, logdataapis) |
927 self.reads = reads |
927 self.reads = reads |
928 self.writes = writes |
928 self.writes = writes |
929 |
929 |
930 def read(self, res, size=-1): |
930 def read(self, res, size=-1): |
931 if not self.reads: |
931 if not self.reads: |
1044 writes=True, |
1044 writes=True, |
1045 states=True, |
1045 states=True, |
1046 logdata=False, |
1046 logdata=False, |
1047 logdataapis=True, |
1047 logdataapis=True, |
1048 ): |
1048 ): |
1049 super(socketobserver, self).__init__(fh, name, logdata, logdataapis) |
1049 super().__init__(fh, name, logdata, logdataapis) |
1050 self.reads = reads |
1050 self.reads = reads |
1051 self.writes = writes |
1051 self.writes = writes |
1052 self.states = states |
1052 self.states = states |
1053 |
1053 |
1054 def makefile(self, res, mode=None, bufsize=None): |
1054 def makefile(self, res, mode=None, bufsize=None): |
1356 """ |
1356 """ |
1357 |
1357 |
1358 def __setitem__(self, key, value): |
1358 def __setitem__(self, key, value): |
1359 if key in self: |
1359 if key in self: |
1360 del self[key] |
1360 del self[key] |
1361 super(sortdict, self).__setitem__(key, value) |
1361 super().__setitem__(key, value) |
1362 |
1362 |
1363 if pycompat.ispypy: |
1363 if pycompat.ispypy: |
1364 # __setitem__() isn't called as of PyPy 5.8.0 |
1364 # __setitem__() isn't called as of PyPy 5.8.0 |
1365 def update(self, src, **f): |
1365 def update(self, src, **f): |
1366 if isinstance(src, dict): |
1366 if isinstance(src, dict): |