Skip to content

Commit 2bac6b0

Browse files
committed
Fully qualify class names in repr(), add selected state information
This is intended to disambiguate objects in log and debug output.
1 parent 4cad51a commit 2bac6b0

File tree

11 files changed

+104
-46
lines changed

11 files changed

+104
-46
lines changed

ansible_mitogen/planner.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,10 @@ def get_module_source(self):
114114
return self._module_source
115115

116116
def __repr__(self):
117-
return 'Invocation(module_name=%s)' % (self.module_name,)
117+
return '%s.%s(module_name=%r)' % (
118+
__name__, self.__class__.__name__,
119+
self.module_name,
120+
)
118121

119122

120123
class Planner(object):

ansible_mitogen/runner.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def __init__(self, path):
177177
LOG.debug('%r installed; existing keys: %r', self, self._keys)
178178

179179
def __repr__(self):
180-
return 'EnvironmentFileWatcher(%r)' % (self.path,)
180+
return '%s.%s(%r)' % (__name__, self.__class__.__name__, self.path)
181181

182182
def _stat(self):
183183
try:

docs/changelog.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ To avail of fixes in an unreleased version, please download a ZIP file
2121
In progress (unreleased)
2222
------------------------
2323

24+
* :gh:issue:`1318` Fully qualify class names in ``repr()``, add selected state
25+
2426

2527
v0.3.26 (2025-08-04)
2628
--------------------

mitogen/core.py

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ def __init__(self, dct):
327327
self[k] = v
328328

329329
def __repr__(self):
330-
return 'Kwargs(%s)' % (dict.__repr__(self),)
330+
return '%s(%s)' % (self.__class__.__name__, dict.__repr__(self),)
331331

332332
def __reduce__(self):
333333
return (Kwargs, (dict(self),))
@@ -1018,7 +1018,8 @@ def unpickle(self, throw=True, throw_dead=True):
10181018
return obj
10191019

10201020
def __repr__(self):
1021-
return 'Message(%r, %r, %r, %r, %r, %r..%d)' % (
1021+
return '%s.%s(dst_id=%r, src_id=%r, auth_id=%r, handle=%r, reply_to=%r, data=%r..%d)' % (
1022+
__name__, self.__class__.__name__,
10221023
self.dst_id, self.src_id, self.auth_id, self.handle,
10231024
self.reply_to, (self.data or '')[:50], len(self.data)
10241025
)
@@ -1064,7 +1065,10 @@ def close(self):
10641065
)
10651066

10661067
def __repr__(self):
1067-
return 'Sender(%r, %r)' % (self.context, self.dst_handle)
1068+
return '%s.%s(%r, %r)' % (
1069+
__name__, self.__class__.__name__,
1070+
self.context, self.dst_handle,
1071+
)
10681072

10691073
def __reduce__(self):
10701074
return _unpickle_sender, (self.context.context_id, self.dst_handle)
@@ -1126,7 +1130,10 @@ def __init__(self, router, handle=None, persist=True,
11261130
)
11271131

11281132
def __repr__(self):
1129-
return 'Receiver(%r, %r)' % (self.router, self.handle)
1133+
return '%s.%s(%r, %r)' % (
1134+
__name__, self.__class__.__name__,
1135+
self.router, self.handle,
1136+
)
11301137

11311138
def __enter__(self):
11321139
return self
@@ -1276,7 +1283,8 @@ def close(self):
12761283
Sender.close(self)
12771284

12781285
def __repr__(self):
1279-
return 'Channel(%s, %s)' % (
1286+
return '%s.%s(%s, %s)' % (
1287+
__name__, self.__class__.__name__,
12801288
Sender.__repr__(self),
12811289
Receiver.__repr__(self)
12821290
)
@@ -1390,7 +1398,7 @@ def _install_handler(self, router):
13901398
)
13911399

13921400
def __repr__(self):
1393-
return 'Importer'
1401+
return '%s.%s()' % (__name__, self.__class__.__name__)
13941402

13951403
@staticmethod
13961404
def _loader_from_module(module, default=None):
@@ -1895,7 +1903,10 @@ def accept(self, rfp, wfp):
18951903
self.transmit_side = Side(self, wfp)
18961904

18971905
def __repr__(self):
1898-
return "<Stream %s #%04x>" % (self.name, id(self) & 0xffff,)
1906+
return "<%s.%s %r #%04x>" % (
1907+
__name__, self.__class__.__name__,
1908+
self.name, id(self) & 0xffff,
1909+
)
18991910

19001911
def on_receive(self, broker):
19011912
"""
@@ -1988,8 +1999,8 @@ def build_stream(cls, *args, **kwargs):
19881999
return stream
19892000

19902001
def __repr__(self):
1991-
return '%s(%s)' % (
1992-
self.__class__.__name__,
2002+
return '%s.%s(%r)' % (
2003+
__name__, self.__class__.__name__,
19932004
self.stream and self.stream.name,
19942005
)
19952006

@@ -2179,8 +2190,9 @@ def __init__(self, stream, fp, cloexec=True, keep_alive=True):
21792190
set_cloexec(self.fd)
21802191

21812192
def __repr__(self):
2182-
return '<Side of %s fd %s>' % (
2183-
self.stream.name or repr(self.stream),
2193+
return '<%s.%s of %r fd %r>' % (
2194+
__name__, self.__class__.__name__,
2195+
self.stream.name or self.stream,
21842196
self.fd
21852197
)
21862198

@@ -2505,7 +2517,10 @@ def send_await(self, msg, deadline=None):
25052517
return data
25062518

25072519
def __repr__(self):
2508-
return 'Context(%s, %r)' % (self.context_id, self.name)
2520+
return '%s.%s(%r, %r)' % (
2521+
__name__, self.__class__.__name__,
2522+
self.context_id, self.name,
2523+
)
25092524

25102525

25112526
def _unpickle_context(context_id, name, router=None):
@@ -2561,7 +2576,10 @@ def __init__(self):
25612576
self._wfds = {}
25622577

25632578
def __repr__(self):
2564-
return '%s' % (type(self).__name__,)
2579+
return '<%s.%s with %d readers %d writers>' % (
2580+
__name__, self.__class__.__name__,
2581+
len(self._rfds), len(self._wfds),
2582+
)
25652583

25662584
def _update(self, fd):
25672585
"""
@@ -2932,7 +2950,8 @@ def _wake(self, wsock, cookie):
29322950
assert written == len(cookie) and not disconnected
29332951

29342952
def __repr__(self):
2935-
return 'Latch(%#x, size=%d, t=%r)' % (
2953+
return '%s.%s(%#x, size=%d, thread=%r)' % (
2954+
__name__, self.__class__.__name__,
29362955
id(self),
29372956
len(self._queue),
29382957
threading__thread_name(threading__current_thread()),
@@ -2962,9 +2981,9 @@ def __init__(self, broker):
29622981
self._deferred = collections.deque()
29632982

29642983
def __repr__(self):
2965-
return 'Waker(fd=%r/%r)' % (
2966-
self.stream.receive_side and self.stream.receive_side.fd,
2967-
self.stream.transmit_side and self.stream.transmit_side.fd,
2984+
return '%s.%s(%r, %r)' % (
2985+
__name__, self.__class__.__name__,
2986+
self.stream.receive_side, self.stream.transmit_side,
29682987
)
29692988

29702989
@property
@@ -3155,7 +3174,7 @@ def __init__(self, broker):
31553174
self.add_handler(self._on_del_route, DEL_ROUTE)
31563175

31573176
def __repr__(self):
3158-
return 'Router(%r)' % (self.broker,)
3177+
return '%s.%s(%r)' % (__name__, self.__class__.__name__, self.broker)
31593178

31603179
def _setup_logging(self):
31613180
"""
@@ -3791,7 +3810,7 @@ def join(self):
37913810
self._thread.join()
37923811

37933812
def __repr__(self):
3794-
return 'Broker(%04x)' % (id(self) & 0xffff,)
3813+
return '%s.%s(%r)' % (__name__, self.__class__.__name__, self.poller)
37953814

37963815

37973816
class Dispatcher(object):
@@ -3808,7 +3827,7 @@ class Dispatcher(object):
38083827
_service_recv = None
38093828

38103829
def __repr__(self):
3811-
return 'Dispatcher'
3830+
return '%s.%s(%r)' % (__name__, self.__class__.__name__, self.econtext)
38123831

38133832
def __init__(self, econtext):
38143833
self.econtext = econtext

mitogen/fakessh.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,9 @@ def on_receive(self, stream, broker):
160160
self.on_disconnect(broker)
161161

162162
def __repr__(self):
163-
return 'IoPump(%r, %r)' % (
164-
self.receive_side.fp.fileno(),
165-
self.transmit_side.fp.fileno(),
163+
return '%s.%s(%r, %r)' % (
164+
__name__, self.__class__.__name__,
165+
self.receive_side, self.transmit_side,
166166
)
167167

168168

@@ -195,7 +195,10 @@ def __init__(self, router, stdin, stdout, proc=None):
195195
pmon.add(proc.pid, self._on_proc_exit)
196196

197197
def __repr__(self):
198-
return 'Process(%r, %r)' % (self.stdin, self.stdout)
198+
return '%s.%s(%r, %r, %r)' % (
199+
__name__, self.__class__.__name__,
200+
self.router, self.stdin, self.stdout,
201+
)
199202

200203
def _on_proc_exit(self, status):
201204
LOG.debug('%r._on_proc_exit(%r)', self, status)

mitogen/master.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ def _on_forward_log(self, msg):
465465
logger.handle(record)
466466

467467
def __repr__(self):
468-
return 'LogForwarder(%r)' % (self._router,)
468+
return '%s.%s(%r)' % (__name__, self.__class__.__name__, self._router)
469469

470470

471471
class FinderMethod(object):
@@ -478,7 +478,7 @@ def __init__(self):
478478
self.log = LOG.getChild(self.__class__.__name__)
479479

480480
def __repr__(self):
481-
return '%s()' % (type(self).__name__,)
481+
return '%s.%s()' % (__name__, self.__class__.__name__)
482482

483483
def find(self, fullname):
484484
"""
@@ -927,7 +927,7 @@ def __init__(self):
927927
self._related_cache = {}
928928

929929
def __repr__(self):
930-
return 'ModuleFinder()'
930+
return '%s.%s()' % (__name__, self.__class__.__name__)
931931

932932
def add_source_override(self, fullname, path, source, is_pkg):
933933
"""
@@ -1110,7 +1110,7 @@ def __init__(self, router):
11101110
)
11111111

11121112
def __repr__(self):
1113-
return 'ModuleResponder'
1113+
return '%s.%s(%r)' % (__name__, self.__class__.__name__, self._router)
11141114

11151115
def add_source_override(self, fullname, path, source, is_pkg):
11161116
"""
@@ -1527,7 +1527,7 @@ def __init__(self, router):
15271527
)
15281528

15291529
def __repr__(self):
1530-
return 'IdAllocator(%r)' % (self.router,)
1530+
return '%s.%s(%r)' % (__name__, self.__class__.__name__, self.router)
15311531

15321532
def allocate(self):
15331533
"""

mitogen/parent.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,10 @@ def __init__(self, when, func):
595595
self.func = func
596596

597597
def __repr__(self):
598-
return 'Timer(%r, %r)' % (self.when, self.func)
598+
return '%s.%s(%r, %r)' % (
599+
__name__, self.__class__.__name__,
600+
self.when, self.func,
601+
)
599602

600603
def __eq__(self, other):
601604
return self.when == other.when
@@ -1389,7 +1392,9 @@ def __init__(self, options, router):
13891392
self._router = router
13901393

13911394
def __repr__(self):
1392-
return 'Connection(%r)' % (self.stdio_stream,)
1395+
return '%s.%s(stdio_stream=%r)' % (
1396+
__name__, self.__class__.__name__, self.stdio_stream,
1397+
)
13931398

13941399
# Minimised, gzipped, base64'd and passed to 'python -c'. It forks, dups
13951400
# file descriptor 0 as 100, creates a pipe, then execs a new interpreter
@@ -1832,7 +1837,7 @@ def make_chain_id(cls):
18321837
)
18331838

18341839
def __repr__(self):
1835-
return '%s(%s)' % (self.__class__.__name__, self.context)
1840+
return '%s.%s(%r)' % (__name__, self.__class__.__name__, self.context)
18361841

18371842
def __enter__(self):
18381843
return self
@@ -2112,7 +2117,10 @@ def __init__(self, router, parent=None):
21122117
)
21132118

21142119
def __repr__(self):
2115-
return 'RouteMonitor()'
2120+
return '%s.%s(%r, %r)' % (
2121+
__name__, self.__class__.__name__,
2122+
self.router, self.parent,
2123+
)
21162124

21172125
def _send_one(self, stream, handle, target_id, name):
21182126
"""
@@ -2652,8 +2660,8 @@ def __init__(self, pid, stdin, stdout, stderr=None):
26522660
self.stderr = stderr
26532661

26542662
def __repr__(self):
2655-
return '%s %s pid %d' % (
2656-
type(self).__name__,
2663+
return '%s.%s(%r, %r)' % (
2664+
__name__, self.__class__.__name__,
26572665
self.name,
26582666
self.pid,
26592667
)
@@ -2724,7 +2732,10 @@ def __init__(self, router, parent_context, importer):
27242732
)
27252733

27262734
def __repr__(self):
2727-
return 'ModuleForwarder'
2735+
return '%s.%s(%r, %r, %r)' % (
2736+
__name__, self.__class__.__name__,
2737+
self.router, self.parent_context, self.importer,
2738+
)
27282739

27292740
def _on_forward_module(self, msg):
27302741
if msg.is_dead:

mitogen/service.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ def __init__(self, service):
254254
self.service = service
255255

256256
def __repr__(self):
257-
return '%s(%s)' % (type(self).__name__, self.service)
257+
return '%s.%s(%r)' % (__name__, self.__class__.__name__, self.service)
258258

259259
unauthorized_msg = (
260260
'Caller is not authorized to invoke %r of service %r'
@@ -440,7 +440,9 @@ def __init__(self, router):
440440
self.select = mitogen.select.Select()
441441

442442
def __repr__(self):
443-
return '%s()' % (self.__class__.__name__,)
443+
return '%s.%s(%r, %r)' % (
444+
__name__, self.__class__.__name__, self.router, self.select,
445+
)
444446

445447
def on_message(self, event):
446448
"""
@@ -653,7 +655,8 @@ def _worker_main(self):
653655
raise
654656

655657
def __repr__(self):
656-
return 'Pool(%04x, size=%d, th=%r)' % (
658+
return '%s.%s(%04x, size=%d, th=%r)' % (
659+
__name__, self.__class__.__name__,
657660
id(self) & 0xffff,
658661
len(self._threads),
659662
get_thread_name(),

tests/importer_test.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ def tearDown(self):
4646
super(ImporterMixin, self).tearDown()
4747

4848

49+
class ImporterTest(ImporterMixin, testlib.TestCase):
50+
def test_repr(self):
51+
self.assertEqual('mitogen.core.Importer()', repr(self.importer))
52+
53+
4954
class InvalidNameTest(ImporterMixin, testlib.TestCase):
5055
modname = 'trailingdot.'
5156
# 0:fullname 1:pkg_present 2:path 3:compressed 4:related

0 commit comments

Comments
 (0)