annotate libervia/cli/output_std.py @ 4309:b56b1eae7994

component email gateway: add multicasting: XEP-0033 multicasting is now supported both for incoming and outgoing messages. XEP-0033 metadata are converted to suitable Email headers and vice versa. Email address and JID are both supported, and delivery is done by the gateway when suitable on incoming messages. rel 450
author Goffi <goffi@goffi.org>
date Thu, 26 Sep 2024 16:12:01 +0200
parents 0d7bb4df2343
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
1 #! /usr/bin/env python3
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
3
4075
47401850dec6 refactoring: rename `libervia.frontends.jp` to `libervia.cli`
Goffi <goffi@goffi.org>
parents: 4074
diff changeset
4 # Libervia CLI
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
6
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
11
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
16
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
19 """Standard outputs"""
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
20
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
21
4075
47401850dec6 refactoring: rename `libervia.frontends.jp` to `libervia.cli`
Goffi <goffi@goffi.org>
parents: 4074
diff changeset
22 from libervia.cli.constants import Const as C
4074
26b7ed2817da refactoring: rename `sat_frontends` to `libervia.frontends`
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
23 from libervia.frontends.tools import jid
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 3640
diff changeset
24 from libervia.backend.tools.common.ansi import ANSI as A
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 3640
diff changeset
25 from libervia.backend.tools.common import date_utils
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 import json
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
27
2156
8f96c242fa89 jp (outputs): added OUTPUT_COMPLEX type for data which are more complex than key/value dictionaries
Goffi <goffi@goffi.org>
parents: 1950
diff changeset
28 __outputs__ = ["Simple", "Json"]
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
29
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
30
2156
8f96c242fa89 jp (outputs): added OUTPUT_COMPLEX type for data which are more complex than key/value dictionaries
Goffi <goffi@goffi.org>
parents: 1950
diff changeset
31 class Simple(object):
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 """Default outputs"""
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
33
2161
62dfa6e02f54 jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents: 2156
diff changeset
34 def __init__(self, host):
62dfa6e02f54 jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents: 2156
diff changeset
35 self.host = host
3640
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
36 host.register_output(C.OUTPUT_TEXT, C.OUTPUT_NAME_SIMPLE, self.simple_print)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
37 host.register_output(C.OUTPUT_LIST, C.OUTPUT_NAME_SIMPLE, self.list)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
38 host.register_output(C.OUTPUT_DICT, C.OUTPUT_NAME_SIMPLE, self.dict)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
39 host.register_output(C.OUTPUT_LIST_DICT, C.OUTPUT_NAME_SIMPLE, self.list_dict)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
40 host.register_output(C.OUTPUT_DICT_DICT, C.OUTPUT_NAME_SIMPLE, self.dict_dict)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
41 host.register_output(C.OUTPUT_MESS, C.OUTPUT_NAME_SIMPLE, self.messages)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
42 host.register_output(C.OUTPUT_COMPLEX, C.OUTPUT_NAME_SIMPLE, self.simple_print)
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
43
2156
8f96c242fa89 jp (outputs): added OUTPUT_COMPLEX type for data which are more complex than key/value dictionaries
Goffi <goffi@goffi.org>
parents: 1950
diff changeset
44 def simple_print(self, data):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
45 self.host.disp(str(data))
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
46
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 def list(self, data):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
48 self.host.disp("\n".join(data))
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
49
2296
1a64fd7b648d jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents: 2233
diff changeset
50 def dict(self, data, indent=0, header_color=C.A_HEADER):
2194
322948499db0 jp (output dict): added color and no-header option
Goffi <goffi@goffi.org>
parents: 2186
diff changeset
51 options = self.host.parse_output_options()
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
52 self.host.check_output_options({"no-header"}, options)
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
53 show_header = not "no-header" in options
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
54 for k, v in data.items():
2194
322948499db0 jp (output dict): added color and no-header option
Goffi <goffi@goffi.org>
parents: 2186
diff changeset
55 if show_header:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
56 header = A.color(header_color, k) + ": "
2194
322948499db0 jp (output dict): added color and no-header option
Goffi <goffi@goffi.org>
parents: 2186
diff changeset
57 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
58 header = ""
2194
322948499db0 jp (output dict): added color and no-header option
Goffi <goffi@goffi.org>
parents: 2186
diff changeset
59
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
60 self.host.disp(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
61 (
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
62 "{indent}{header}{value}".format(
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
63 indent=indent * " ", header=header, value=v
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
64 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
65 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
66 )
2156
8f96c242fa89 jp (outputs): added OUTPUT_COMPLEX type for data which are more complex than key/value dictionaries
Goffi <goffi@goffi.org>
parents: 1950
diff changeset
67
2233
bf998d8626d9 jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents: 2194
diff changeset
68 def list_dict(self, data):
bf998d8626d9 jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents: 2194
diff changeset
69 for idx, datum in enumerate(data):
bf998d8626d9 jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents: 2194
diff changeset
70 if idx:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
71 self.host.disp("\n")
2233
bf998d8626d9 jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents: 2194
diff changeset
72 self.dict(datum)
bf998d8626d9 jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents: 2194
diff changeset
73
2296
1a64fd7b648d jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents: 2233
diff changeset
74 def dict_dict(self, data):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
75 for key, sub_dict in data.items():
2296
1a64fd7b648d jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents: 2233
diff changeset
76 self.host.disp(A.color(C.A_HEADER, key))
1a64fd7b648d jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents: 2233
diff changeset
77 self.dict(sub_dict, indent=4, header_color=C.A_SUBHEADER)
1a64fd7b648d jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents: 2233
diff changeset
78
2707
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
79 def messages(self, data):
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
80 # TODO: handle lang, and non chat message (normal, headline)
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
81 for mess_data in data:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
82 (uid, timestamp, from_jid, to_jid, message, subject, mess_type, extra) = (
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
83 mess_data
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
84 )
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
85 time_str = date_utils.date_fmt(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
86 timestamp, "auto_day", tz_info=date_utils.TZ_LOCAL
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
87 )
2707
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
88 from_jid = jid.JID(from_jid)
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
89 if mess_type == C.MESS_TYPE_GROUPCHAT:
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
90 nick = from_jid.resource
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
91 else:
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
92 nick = from_jid.node
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
93
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
94 if self.host.own_jid is not None and self.host.own_jid.bare == from_jid.bare:
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
95 nick_color = A.BOLD + A.FG_BLUE
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
96 else:
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
97 nick_color = A.BOLD + A.FG_YELLOW
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
98 message = list(message.values())[0] if message else ""
2707
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
99
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
100 self.host.disp(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
101 A.color(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
102 A.FG_CYAN,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
103 "[" + time_str + "] ",
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
104 nick_color,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
105 nick,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
106 A.RESET,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
107 A.BOLD,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
108 "> ",
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
109 A.RESET,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
110 message,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
111 )
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4075
diff changeset
112 )
2707
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
113
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
114
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
115 class Json(object):
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 """outputs in json format"""
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
117
2161
62dfa6e02f54 jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents: 2156
diff changeset
118 def __init__(self, host):
62dfa6e02f54 jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents: 2156
diff changeset
119 self.host = host
3640
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
120 host.register_output(C.OUTPUT_TEXT, C.OUTPUT_NAME_JSON, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
121 host.register_output(C.OUTPUT_LIST, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
122 host.register_output(C.OUTPUT_LIST, C.OUTPUT_NAME_JSON_RAW, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
123 host.register_output(C.OUTPUT_DICT, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
124 host.register_output(C.OUTPUT_DICT, C.OUTPUT_NAME_JSON_RAW, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
125 host.register_output(C.OUTPUT_LIST_DICT, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
126 host.register_output(C.OUTPUT_LIST_DICT, C.OUTPUT_NAME_JSON_RAW, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
127 host.register_output(C.OUTPUT_DICT_DICT, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
128 host.register_output(C.OUTPUT_DICT_DICT, C.OUTPUT_NAME_JSON_RAW, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
129 host.register_output(C.OUTPUT_MESS, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
130 host.register_output(C.OUTPUT_MESS, C.OUTPUT_NAME_JSON_RAW, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
131 host.register_output(C.OUTPUT_COMPLEX, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
132 host.register_output(C.OUTPUT_COMPLEX, C.OUTPUT_NAME_JSON_RAW, self.dump)
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
133
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
134 def dump(self, data):
2161
62dfa6e02f54 jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents: 2156
diff changeset
135 self.host.disp(json.dumps(data, default=str))
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
136
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 def dump_pretty(self, data):
2161
62dfa6e02f54 jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents: 2156
diff changeset
138 self.host.disp(json.dumps(data, indent=4, default=str))