Skip to content

Commit 1d8a577

Browse files
committed
channel: cleaned up inheritance hierarchy, adding mixing for callback functionality - previously the callback functionality was bound to channel based readers/writers
1 parent be8955a commit 1d8a577

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

lib/git/async/channel.py

+23-10
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,14 @@ def closed(self):
103103
#} END interface
104104

105105

106-
class CallbackChannelWriter(ChannelWriter):
106+
class CallbackWriterMixin(object):
107107
"""The write end of a channel which allows you to setup a callback to be
108108
called after an item was written to the channel"""
109-
__slots__ = ('_pre_cb')
109+
# slots don't work with mixin's :(
110+
# __slots__ = ('_pre_cb')
110111

111-
def __init__(self, channel):
112-
super(CallbackChannelWriter, self).__init__(channel)
112+
def __init__(self, *args):
113+
super(CallbackWriterMixin, self).__init__(*args)
113114
self._pre_cb = None
114115

115116
def set_pre_cb(self, fun = lambda item: item):
@@ -126,7 +127,12 @@ def set_pre_cb(self, fun = lambda item: item):
126127
def write(self, item, block=True, timeout=None):
127128
if self._pre_cb:
128129
item = self._pre_cb(item)
129-
super(CallbackChannelWriter, self).write(item, block, timeout)
130+
super(CallbackWriterMixin, self).write(item, block, timeout)
131+
132+
133+
class CallbackChannelWriter(CallbackWriterMixin, ChannelWriter):
134+
"""Implements a channel writer with callback functionality"""
135+
pass
130136

131137

132138
class Reader(object):
@@ -238,12 +244,14 @@ def read(self, count=0, block=True, timeout=None):
238244

239245
#} END interface
240246

241-
class CallbackChannelReader(ChannelReader):
247+
248+
class CallbackReaderMixin(object):
242249
"""A channel which sends a callback before items are read from the channel"""
243-
__slots__ = "_pre_cb"
250+
# unfortunately, slots can only use direct inheritance, have to turn it off :(
251+
# __slots__ = "_pre_cb"
244252

245-
def __init__(self, channel):
246-
super(CallbackChannelReader, self).__init__(channel)
253+
def __init__(self, *args):
254+
super(CallbackReaderMixin, self).__init__(*args)
247255
self._pre_cb = None
248256

249257
def set_pre_cb(self, fun = lambda count: None):
@@ -260,7 +268,12 @@ def set_pre_cb(self, fun = lambda count: None):
260268
def read(self, count=0, block=True, timeout=None):
261269
if self._pre_cb:
262270
self._pre_cb(count)
263-
return super(CallbackChannelReader, self).read(count, block, timeout)
271+
return super(CallbackReaderMixin, self).read(count, block, timeout)
272+
273+
274+
class CallbackChannelReader(CallbackReaderMixin, ChannelReader):
275+
"""Implements a channel reader with callback functionality"""
276+
pass
264277

265278

266279
class IteratorReader(Reader):

0 commit comments

Comments
 (0)