summaryrefslogtreecommitdiff
path: root/kombu/utils/div.py
blob: 439b66394e9e9d7c896c15cef57fb7f6c41c01fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
"""Div. Utilities."""

from __future__ import annotations

import sys

from .encoding import default_encode


def emergency_dump_state(state, open_file=open, dump=None, stderr=None):
    """Dump message state to stdout or file."""
    from pprint import pformat
    from tempfile import mktemp
    stderr = sys.stderr if stderr is None else stderr

    if dump is None:
        import pickle
        dump = pickle.dump
    persist = mktemp()
    print(f'EMERGENCY DUMP STATE TO FILE -> {persist} <-',
          file=stderr)
    fh = open_file(persist, 'w')
    try:
        try:
            dump(state, fh, protocol=0)
        except Exception as exc:
            print(
                f'Cannot pickle state: {exc!r}. Fallback to pformat.',
                file=stderr,
            )
            fh.write(default_encode(pformat(state)))
    finally:
        fh.flush()
        fh.close()
    return persist