annotate sat_frontends/jp/common.py @ 3576:8876803db81b

/!\ package is being renamed to libervia-backend following global name change /!\
author Goffi <goffi@goffi.org>
date Fri, 18 Jun 2021 14:44:01 +0200
parents 04283582966f
children 82e616b70a2a
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
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
3
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # jp: a SàT command line tool
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
6
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
11
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
16
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
19
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
20 import json
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
21 import os
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
22 import os.path
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
23 import time
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
24 import tempfile
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
25 import asyncio
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
26 import shlex
3121
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
27 import re
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
28 from pathlib import Path
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 from sat_frontends.jp.constants import Const as C
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from sat.core.i18n import _
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
31 from sat.core import exceptions
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 from sat.tools.common import regex
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
33 from sat.tools.common.ansi import ANSI as A
2551
b27165bf160c jp (merge-request/set): if service and node are not specified, URIFinder is now used + ask confirmation before publishing
Goffi <goffi@goffi.org>
parents: 2532
diff changeset
34 from sat.tools.common import uri as xmpp_uri
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 from sat.tools import config
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
36 from configparser import NoSectionError, NoOptionError
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
37 from collections import namedtuple
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
38
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 # defaut arguments used for some known editors (editing with metadata)
2523
21d43eab3fb9 jp (common): assure nosplitright in default commands for edition with vim
Goffi <goffi@goffi.org>
parents: 2493
diff changeset
40 VIM_SPLIT_ARGS = "-c 'set nospr|vsplit|wincmd w|next|wincmd w'"
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 EMACS_SPLIT_ARGS = '--eval "(split-window-horizontally)"'
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
42 EDITOR_ARGS_MAGIC = {
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
43 "vim": VIM_SPLIT_ARGS + " {content_file} {metadata_file}",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
44 "gvim": VIM_SPLIT_ARGS + " --nofork {content_file} {metadata_file}",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
45 "emacs": EMACS_SPLIT_ARGS + " {content_file} {metadata_file}",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
46 "xemacs": EMACS_SPLIT_ARGS + " {content_file} {metadata_file}",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
47 "nano": " -F {content_file} {metadata_file}",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
48 }
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
49
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 SECURE_UNLINK_MAX = 10
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 SECURE_UNLINK_DIR = ".backup"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
52 METADATA_SUFF = "_metadata.json"
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
53
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
54
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
55 def ansi_ljust(s, width):
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
56 """ljust method handling ANSI escape codes"""
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
57 cleaned = regex.ansiRemove(s)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
58 return s + " " * (width - len(cleaned))
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
59
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
60
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
61 def ansi_center(s, width):
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
62 """ljust method handling ANSI escape codes"""
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
63 cleaned = regex.ansiRemove(s)
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
64 diff = width - len(cleaned)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
65 half = diff / 2
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
66 return half * " " + s + (half + diff % 2) * " "
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
67
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
68
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
69 def ansi_rjust(s, width):
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
70 """ljust method handling ANSI escape codes"""
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
71 cleaned = regex.ansiRemove(s)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
72 return " " * (width - len(cleaned)) + s
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
73
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
74
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
75 def getTmpDir(sat_conf, cat_dir, sub_dir=None):
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
76 """Return directory used to store temporary files
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
77
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
78 @param sat_conf(ConfigParser.ConfigParser): instance opened on sat configuration
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
79 @param cat_dir(str): directory of the category (e.g. "blog")
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
80 @param sub_dir(str): sub directory where data need to be put
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 profile can be used here, or special directory name
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 sub_dir will be escaped to be usable in path (use regex.pathUnescape to find
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
83 initial str)
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
84 @return (Path): path to the dir
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
86 local_dir = config.getConfig(sat_conf, "", "local_dir", Exception)
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
87 path_elts = [local_dir, cat_dir]
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
88 if sub_dir is not None:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
89 path_elts.append(regex.pathEscape(sub_dir))
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
90 return Path(*path_elts)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
91
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
92
2273
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
93 def parse_args(host, cmd_line, **format_kw):
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
94 """Parse command arguments
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
95
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
96 @param cmd_line(unicode): command line as found in sat.conf
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
97 @param format_kw: keywords used for formating
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
98 @return (list(unicode)): list of arguments to pass to subprocess function
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
99 """
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
100 try:
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
101 # we split the arguments and add the known fields
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
102 # we split arguments first to avoid escaping issues in file names
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
103 return [a.format(**format_kw) for a in shlex.split(cmd_line)]
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
104 except ValueError as e:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
105 host.disp(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
106 "Couldn't parse editor cmd [{cmd}]: {reason}".format(cmd=cmd_line, reason=e)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
107 )
2273
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
108 return []
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
109
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
110
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
111 class BaseEdit(object):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
112 """base class for editing commands
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
113
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
114 This class allows to edit file for PubSub or something else.
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
115 It works with temporary files in SàT local_dir, in a "cat_dir" subdir
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 """
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
117
2273
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
118 def __init__(self, host, cat_dir, use_metadata=False):
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
119 """
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 @param sat_conf(ConfigParser.ConfigParser): instance opened on sat configuration
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
121 @param cat_dir(unicode): directory to use for drafts
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
122 this will be a sub-directory of SàT's local_dir
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
123 @param use_metadata(bool): True is edition need a second file for metadata
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
124 most of signature change with use_metadata with an additional metadata
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
125 argument.
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
126 This is done to raise error if a command needs metadata but forget the flag,
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
127 and vice versa
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
128 """
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
129 self.host = host
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
130 self.cat_dir = cat_dir
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 self.use_metadata = use_metadata
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
132
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
133 def secureUnlink(self, path):
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
134 """Unlink given path after keeping it for a while
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
135
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
136 This method is used to prevent accidental deletion of a draft
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 If there are more file in SECURE_UNLINK_DIR than SECURE_UNLINK_MAX,
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
138 older file are deleted
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
139 @param path(Path, str): file to unlink
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
140 """
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
141 path = Path(path).resolve()
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
142 if not path.is_file:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
143 raise OSError("path must link to a regular file")
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
144 if path.parent != getTmpDir(self.sat_conf, self.cat_dir):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
145 self.disp(
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
146 f"File {path} is not in SàT temporary hierarchy, we do not remove " f"it",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
147 2,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
148 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
149 return
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
150 # we have 2 files per draft with use_metadata, so we double max
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 unlink_max = SECURE_UNLINK_MAX * 2 if self.use_metadata else SECURE_UNLINK_MAX
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
152 backup_dir = getTmpDir(self.sat_conf, self.cat_dir, SECURE_UNLINK_DIR)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 if not os.path.exists(backup_dir):
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 os.makedirs(backup_dir)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 filename = os.path.basename(path)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
156 backup_path = os.path.join(backup_dir, filename)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
157 # we move file to backup dir
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
158 self.host.disp(
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
159 "Backuping file {src} to {dst}".format(src=path, dst=backup_path),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
160 1,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
161 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
162 os.rename(path, backup_path)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
163 # and if we exceeded the limit, we remove older file
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
164 backup_files = [os.path.join(backup_dir, f) for f in os.listdir(backup_dir)]
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 if len(backup_files) > unlink_max:
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
166 backup_files.sort(key=lambda path: os.stat(path).st_mtime)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
167 for path in backup_files[: len(backup_files) - unlink_max]:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
168 self.host.disp("Purging backup file {}".format(path), 2)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
169 os.unlink(path)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
170
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
171 async def runEditor(
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
172 self,
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
173 editor_args_opt,
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
174 content_file_path,
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
175 content_file_obj,
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
176 meta_file_path=None,
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
177 meta_ori=None,
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
178 ):
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
179 """Run editor to edit content and metadata
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
180
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
181 @param editor_args_opt(unicode): option in [jp] section in configuration for
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
182 specific args
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
183 @param content_file_path(str): path to the content file
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
184 @param content_file_obj(file): opened file instance
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
185 @param meta_file_path(str, Path, None): metadata file path
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
186 if None metadata will not be used
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
187 @param meta_ori(dict, None): original cotent of metadata
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
188 can't be used if use_metadata is False
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
189 """
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
190 if not self.use_metadata:
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
191 assert meta_file_path is None
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
192 assert meta_ori is None
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
193
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
194 # we calculate hashes to check for modifications
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
195 import hashlib
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
196
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
197 content_file_obj.seek(0)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
198 tmp_ori_hash = hashlib.sha1(content_file_obj.read()).digest()
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
199 content_file_obj.close()
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
200
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
201 # we prepare arguments
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
202 editor = config.getConfig(self.sat_conf, "jp", "editor") or os.getenv(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
203 "EDITOR", "vi"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
204 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
205 try:
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
206 # is there custom arguments in sat.conf ?
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
207 editor_args = config.getConfig(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
208 self.sat_conf, "jp", editor_args_opt, Exception
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
209 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
210 except (NoOptionError, NoSectionError):
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
211 # no, we check if we know the editor and have special arguments
2273
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
212 if self.use_metadata:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
213 editor_args = EDITOR_ARGS_MAGIC.get(os.path.basename(editor), "")
2273
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
214 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
215 editor_args = ""
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
216 parse_kwargs = {"content_file": content_file_path}
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
217 if self.use_metadata:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
218 parse_kwargs["metadata_file"] = meta_file_path
2273
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
219 args = parse_args(self.host, editor_args, **parse_kwargs)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
220 if not args:
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
221 args = [content_file_path]
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
222
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
223 # actual editing
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
224 editor_process = await asyncio.create_subprocess_exec(
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
225 editor, *[str(a) for a in args]
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
226 )
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
227 editor_exit = await editor_process.wait()
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
228
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
229 # edition will now be checked, and data will be sent if it was a success
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
230 if editor_exit != 0:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
231 self.disp(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
232 f"Editor exited with an error code, so temporary file has not be "
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
233 f"deleted, and item is not published.\nYou can find temporary file "
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
234 f"at {content_file_path}",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
235 error=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
236 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
237 else:
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
238 # main content
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
239 try:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
240 with content_file_path.open("rb") as f:
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
241 content = f.read()
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
242 except (OSError, IOError):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
243 self.disp(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
244 f"Can read file at {content_file_path}, have it been deleted?\n"
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
245 f"Cancelling edition",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
246 error=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
247 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
248 self.host.quit(C.EXIT_NOT_FOUND)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
249
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
250 # metadata
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
251 if self.use_metadata:
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
252 try:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
253 with meta_file_path.open("rb") as f:
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
254 metadata = json.load(f)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
255 except (OSError, IOError):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
256 self.disp(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
257 f"Can read file at {meta_file_path}, have it been deleted?\n"
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
258 f"Cancelling edition",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
259 error=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
260 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
261 self.host.quit(C.EXIT_NOT_FOUND)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
262 except ValueError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
263 self.disp(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
264 f"Can't parse metadata, please check it is correct JSON format. "
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
265 f"Cancelling edition.\nYou can find tmp file at "
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
266 f"{content_file_path} and temporary meta file at "
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
267 f"{meta_file_path}.",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
268 error=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
269 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
270 self.host.quit(C.EXIT_DATA_ERROR)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
271
2905
d9491cb81726 jp (common): `publish` is now a boolean
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
272 if self.use_metadata and not metadata.get("publish", True):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
273 self.disp(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
274 f'Publication blocked by "publish" key in metadata, cancelling '
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
275 f"edition.\n\ntemporary file path:\t{content_file_path}\nmetadata "
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
276 f"file path:\t{meta_file_path}",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
277 error=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
278 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
279 self.host.quit()
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
280
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
281 if len(content) == 0:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
282 self.disp("Content is empty, cancelling the edition")
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
283 if content_file_path.parent != getTmpDir(self.sat_conf, self.cat_dir):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
284 self.disp(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
285 "File are not in SàT temporary hierarchy, we do not remove them",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
286 2,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
287 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
288 self.host.quit()
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
289 self.disp(f"Deletion of {content_file_path}", 2)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
290 os.unlink(content_file_path)
2273
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
291 if self.use_metadata:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
292 self.disp(f"Deletion of {meta_file_path}".format(meta_file_path), 2)
2273
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
293 os.unlink(meta_file_path)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
294 self.host.quit()
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
295
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
296 # time to re-check the hash
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
297 elif tmp_ori_hash == hashlib.sha1(content).digest() and (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
298 not self.use_metadata or meta_ori == metadata
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
299 ):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
300 self.disp("The content has not been modified, cancelling the edition")
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
301 self.host.quit()
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
302
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
303 else:
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
304 # we can now send the item
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
305 content = content.decode("utf-8-sig") # we use utf-8-sig to avoid BOM
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
306 try:
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
307 if self.use_metadata:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
308 await self.publish(content, metadata)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
309 else:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
310 await self.publish(content)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
311 except Exception as e:
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
312 if self.use_metadata:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
313 self.disp(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
314 f"Error while sending your item, the temporary files have "
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
315 f"been kept at {content_file_path} and {meta_file_path}: "
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
316 f"{e}",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
317 error=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
318 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
319 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
320 self.disp(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
321 f"Error while sending your item, the temporary file has been "
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
322 f"kept at {content_file_path}: {e}",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
323 error=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
324 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
325 self.host.quit(1)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
326
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
327 self.secureUnlink(content_file_path)
2273
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
328 if self.use_metadata:
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
329 self.secureUnlink(meta_file_path)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
330
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
331 async def publish(self, content):
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
332 # if metadata is needed, publish will be called with it last argument
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
333 raise NotImplementedError
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
334
2351
3c0a3fae1862 jp (pubsub/node): added schema (set/edit/get) commands to manipulate PubSub node schema
Goffi <goffi@goffi.org>
parents: 2345
diff changeset
335 def getTmpFile(self):
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
336 """Create a temporary file
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
337
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
338 @return (tuple(file, Path)): opened (w+b) file object and file path
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
339 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
340 suff = "." + self.getTmpSuff()
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
341 cat_dir_str = self.cat_dir
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
342 tmp_dir = getTmpDir(self.sat_conf, self.cat_dir, self.profile)
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
343 if not tmp_dir.exists():
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
344 try:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
345 tmp_dir.mkdir(parents=True)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
346 except OSError as e:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
347 self.disp(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
348 f"Can't create {tmp_dir} directory: {e}",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
349 error=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
350 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
351 self.host.quit(1)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
352 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
353 fd, path = tempfile.mkstemp(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
354 suffix=suff,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
355 prefix=time.strftime(cat_dir_str + "_%Y-%m-%d_%H:%M:%S_"),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
356 dir=tmp_dir,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
357 text=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
358 )
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
359 return os.fdopen(fd, "w+b"), Path(path)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
360 except OSError as e:
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
361 self.disp(f"Can't create temporary file: {e}", error=True)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
362 self.host.quit(1)
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
363
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
364 def getCurrentFile(self, profile):
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
365 """Get most recently edited file
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
366
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
367 @param profile(unicode): profile linked to the draft
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
368 @return(Path): full path of current file
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
369 """
2273
5f0dbf42aa9c jp (blog, common): various fixes in common and blog:
Goffi <goffi@goffi.org>
parents: 2270
diff changeset
370 # we guess the item currently edited by choosing
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
371 # the most recent file corresponding to temp file pattern
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
372 # in tmp_dir, excluding metadata files
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
373 tmp_dir = getTmpDir(self.sat_conf, self.cat_dir, profile)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
374 available = [
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
375 p
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
376 for p in tmp_dir.glob(f"{self.cat_dir}_*")
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
377 if not p.match(f"*{METADATA_SUFF}")
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
378 ]
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
379 if not available:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
380 self.disp(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
381 f"Could not find any content draft in {tmp_dir}",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
382 error=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
383 )
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
384 self.host.quit(1)
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
385 return max(available, key=lambda p: p.stat().st_mtime)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
386
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
387 async def getItemData(self, service, node, item):
2280
4bc9a2c2d6c9 jp (pubsub, common): fixed last item edition (keep item id instead of creating a new one)
Goffi <goffi@goffi.org>
parents: 2279
diff changeset
388 """return formatted content, metadata (or not if use_metadata is false), and item id"""
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
389 raise NotImplementedError
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
390
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
391 def getTmpSuff(self):
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
392 """return suffix used for content file"""
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
393 return "xml"
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
394
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
395 async def getItemPath(self):
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
396 """Retrieve item path (i.e. service and node) from item argument
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
397
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
398 This method is obviously only useful for edition of PubSub based features
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
399 """
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
400 service = self.args.service
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
401 node = self.args.node
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
402 item = self.args.item
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
403 last_item = self.args.last_item
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
404
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
405 if self.args.current:
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
406 # user wants to continue current draft
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
407 content_file_path = self.getCurrentFile(self.profile)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
408 self.disp("Continuing edition of current draft", 2)
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
409 content_file_obj = content_file_path.open("r+b")
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
410 # we seek at the end of file in case of an item already exist
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
411 # this will write content of the existing item at the end of the draft.
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
412 # This way no data should be lost.
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
413 content_file_obj.seek(0, os.SEEK_END)
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
414 elif self.args.draft_path:
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
415 # there is an existing draft that we use
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
416 content_file_path = self.args.draft_path.expanduser()
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
417 content_file_obj = content_file_path.open("r+b")
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
418 # we seek at the end for the same reason as above
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
419 content_file_obj.seek(0, os.SEEK_END)
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
420 else:
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
421 # we need a temporary file
2351
3c0a3fae1862 jp (pubsub/node): added schema (set/edit/get) commands to manipulate PubSub node schema
Goffi <goffi@goffi.org>
parents: 2345
diff changeset
422 content_file_obj, content_file_path = self.getTmpFile()
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
423
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
424 if item or last_item:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
425 self.disp("Editing requested published item", 2)
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
426 try:
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
427 if self.use_metadata:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
428 content, metadata, item = await self.getItemData(service, node, item)
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
429 else:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
430 content, item = await self.getItemData(service, node, item)
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
431 except Exception as e:
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
432 # FIXME: ugly but we have not good may to check errors in bridge
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
433 if "item-not-found" in str(e):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
434 #  item doesn't exist, we create a new one with requested id
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
435 metadata = None
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
436 if last_item:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
437 self.disp(_("no item found at all, we create a new one"), 2)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
438 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
439 self.disp(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
440 _(
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
441 'item "{item}" not found, we create a new item with'
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
442 "this id"
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
443 ).format(item=item),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
444 2,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
445 )
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
446 content_file_obj.seek(0)
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
447 else:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
448 self.disp(f"Error while retrieving item: {e}")
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
449 self.host.quit(C.EXIT_ERROR)
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
450 else:
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
451 # item exists, we write content
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
452 if content_file_obj.tell() != 0:
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
453 # we already have a draft,
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
454 # we copy item content after it and add an indicator
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
455 content_file_obj.write("\n*****\n")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
456 content_file_obj.write(content.encode("utf-8"))
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
457 content_file_obj.seek(0)
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
458 self.disp(_('item "{item}" found, we edit it').format(item=item), 2)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
459 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
460 self.disp("Editing a new item", 2)
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
461 if self.use_metadata:
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
462 metadata = None
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
463
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
464 if self.use_metadata:
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
465 return service, node, item, content_file_path, content_file_obj, metadata
2269
606ff34d30f2 jp (blog, common): moved and improved edit code from blog:
Goffi <goffi@goffi.org>
parents:
diff changeset
466 else:
2532
772447ec070f jp: pubsub options refactoring:
Goffi <goffi@goffi.org>
parents: 2523
diff changeset
467 return service, node, item, content_file_path, content_file_obj
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
468
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
469
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
470 class Table(object):
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
471 def __init__(self, host, data, headers=None, filters=None, use_buffer=False):
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
472 """
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
473 @param data(iterable[list]): table data
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
474 all lines must have the same number of columns
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
475 @param headers(iterable[unicode], None): names/titles of the columns
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
476 if not None, must have same number of columns as data
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
477 @param filters(iterable[(callable, unicode)], None): values filters
2610
c9dddf691d7b jp (common): allow tables filters callbacks to have only one argument
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
478 the callable will get 2 arguments:
c9dddf691d7b jp (common): allow tables filters callbacks to have only one argument
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
479 - current column value
c9dddf691d7b jp (common): allow tables filters callbacks to have only one argument
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
480 - RowData with all columns values
c9dddf691d7b jp (common): allow tables filters callbacks to have only one argument
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
481 if may also only use 1 argument, which will then be current col value.
c9dddf691d7b jp (common): allow tables filters callbacks to have only one argument
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
482 the callable must return a string
3121
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
483 if it's unicode, it will be used with .format and must countain u'{}' which
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
484 will be replaced with the string.
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
485 if not None, must have same number of columns as data
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
486 @param use_buffer(bool): if True, bufferise output instead of printing it directly
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
487 """
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
488 self.host = host
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
489 self._buffer = [] if use_buffer else None
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
490 #  headers are columns names/titles, can be None
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
491 self.headers = headers
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
492 #  sizes fof columns without headers,
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
493 # headers may be larger
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
494 self.sizes = []
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
495 #  rows countains one list per row with columns values
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
496 self.rows = []
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
497
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
498 size = None
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
499 if headers:
3121
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
500 # we use a namedtuple to make the value easily accessible from filters
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
501 headers_safe = [re.sub(r"[^a-zA-Z_]", "_", h) for h in headers]
3121
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
502 row_cls = namedtuple("RowData", headers_safe)
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
503 else:
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
504 row_cls = tuple
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
505
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
506 for row_data in data:
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
507 new_row = []
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
508 row_data_list = list(row_data)
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
509 for idx, value in enumerate(row_data_list):
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
510 if filters is not None and filters[idx] is not None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
511 filter_ = filters[idx]
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
512 if isinstance(filter_, str):
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
513 col_value = filter_.format(value)
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
514 else:
2610
c9dddf691d7b jp (common): allow tables filters callbacks to have only one argument
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
515 try:
c9dddf691d7b jp (common): allow tables filters callbacks to have only one argument
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
516 col_value = filter_(value, row_cls(*row_data_list))
c9dddf691d7b jp (common): allow tables filters callbacks to have only one argument
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
517 except TypeError:
c9dddf691d7b jp (common): allow tables filters callbacks to have only one argument
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
518 col_value = filter_(value)
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
519 # we count size without ANSI code as they will change length of the
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
520 # string when it's mostly style/color changes.
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
521 col_size = len(regex.ansiRemove(col_value))
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
522 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
523 col_value = str(value)
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
524 col_size = len(col_value)
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
525 new_row.append(col_value)
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
526 if size is None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
527 self.sizes.append(col_size)
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
528 else:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
529 self.sizes[idx] = max(self.sizes[idx], col_size)
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
530 if size is None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
531 size = len(new_row)
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
532 if headers is not None and len(headers) != size:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
533 raise exceptions.DataError("headers size is not coherent with rows")
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
534 else:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
535 if len(new_row) != size:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
536 raise exceptions.DataError("rows size is not coherent")
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
537 self.rows.append(new_row)
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
538
2344
78ffb9ce57a4 jp (common): fixed empty table display when headers are specified
Goffi <goffi@goffi.org>
parents: 2334
diff changeset
539 if not data and headers is not None:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
540 #  the table is empty, we print headers at their lenght
2344
78ffb9ce57a4 jp (common): fixed empty table display when headers are specified
Goffi <goffi@goffi.org>
parents: 2334
diff changeset
541 self.sizes = [len(h) for h in headers]
78ffb9ce57a4 jp (common): fixed empty table display when headers are specified
Goffi <goffi@goffi.org>
parents: 2334
diff changeset
542
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
543 @property
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
544 def string(self):
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
545 if self._buffer is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
546 raise exceptions.InternalError("buffer must be used to get a string")
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
547 return "\n".join(self._buffer)
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
548
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
549 @staticmethod
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
550 def readDictValues(data, keys, defaults=None):
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
551 if defaults is None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
552 defaults = {}
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
553 for key in keys:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
554 try:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
555 yield data[key]
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
556 except KeyError as e:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
557 default = defaults.get(key)
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
558 if default is not None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
559 yield default
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
560 else:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
561 raise e
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
562
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
563 @classmethod
3121
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
564 def fromListDict(
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
565 cls, host, data, keys=None, headers=None, filters=None, defaults=None
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
566 ):
3121
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
567 """Create a table from a list of dictionaries
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
568
3121
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
569 each dictionary is a row of the table, keys being columns names.
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
570 the whole data will be read and kept into memory, to be printed
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
571 @param data(list[dict[unicode, unicode]]): data to create the table from
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
572 @param keys(iterable[unicode], None): keys to get
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
573 if None, all keys will be used
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
574 @param headers(iterable[unicode], None): name of the columns
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
575 names must be in same order as keys
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
576 @param filters(dict[unicode, (callable,unicode)), None): filter to use on values
2610
c9dddf691d7b jp (common): allow tables filters callbacks to have only one argument
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
577 keys correspond to keys to filter, and value is the same as for Table.__init__
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
578 @param defaults(dict[unicode, unicode]): default value to use
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
579 if None, an exception will be raised if not value is found
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
580 """
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
581 if keys is None and headers is not None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
582 # FIXME: keys are not needed with OrderedDict,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
583 raise exceptions.DataError("You must specify keys order to used headers")
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
584 if keys is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
585 keys = list(data[0].keys())
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
586 if headers is None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
587 headers = keys
3121
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
588 if filters is None:
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
589 filters = {}
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
590 filters = [filters.get(k) for k in keys]
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
591 return cls(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
592 host, (cls.readDictValues(d, keys, defaults) for d in data), headers, filters
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
593 )
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
594
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
595 def _headers(self, head_sep, headers, sizes, alignment="left", style=None):
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
596 """Render headers
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
597
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
598 @param head_sep(unicode): sequence to use as separator
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
599 @param alignment(unicode): how to align, can be left, center or right
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
600 @param style(unicode, iterable[unicode], None): ANSI escape sequences to apply
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
601 @param headers(list[unicode]): headers to show
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
602 @param sizes(list[int]): sizes of columns
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
603 """
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
604 rendered_headers = []
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
605 if isinstance(style, str):
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
606 style = [style]
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
607 for idx, header in enumerate(headers):
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
608 size = sizes[idx]
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
609 if alignment == "left":
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
610 rendered = header[:size].ljust(size)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
611 elif alignment == "center":
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
612 rendered = header[:size].center(size)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
613 elif alignment == "right":
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
614 rendered = header[:size].rjust(size)
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
615 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
616 raise exceptions.InternalError("bad alignment argument")
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
617 if style:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
618 args = style + [rendered]
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
619 rendered = A.color(*args)
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
620 rendered_headers.append(rendered)
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
621 return head_sep.join(rendered_headers)
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
622
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
623 def _disp(self, data):
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
624 """output data (can be either bufferised or printed)"""
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
625 if self._buffer is not None:
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
626 self._buffer.append(data)
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
627 else:
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
628 self.host.disp(data)
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
629
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
630 def display(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
631 self,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
632 head_alignment="left",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
633 columns_alignment="left",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
634 head_style=None,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
635 show_header=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
636 show_borders=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
637 hide_cols=None,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
638 col_sep=" │ ",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
639 top_left="┌",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
640 top="─",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
641 top_sep="─┬─",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
642 top_right="┐",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
643 left="│",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
644 right=None,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
645 head_sep=None,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
646 head_line="┄",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
647 head_line_left="├",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
648 head_line_sep="┄┼┄",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
649 head_line_right="┤",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
650 bottom_left="└",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
651 bottom=None,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
652 bottom_sep="─┴─",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
653 bottom_right="┘",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
654 ):
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
655 """Print the table
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
656
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
657 @param show_header(bool): True if header need no be shown
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
658 @param show_borders(bool): True if borders need no be shown
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
659 @param hide_cols(None, iterable(unicode)): columns which should not be displayed
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
660 @param head_alignment(unicode): how to align headers, can be left, center or right
3121
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
661 @param columns_alignment(unicode): how to align columns, can be left, center or
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
662 right
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
663 @param col_sep(unicode): separator betweens columns
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
664 @param head_line(unicode): character to use to make line under head
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
665 @param disp(callable, None): method to use to display the table
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
666 None to use self.host.disp
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
667 """
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
668 if not self.sizes:
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
669 # the table is empty
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
670 return
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
671 col_sep_size = len(regex.ansiRemove(col_sep))
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
672
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
673 # if we have columns to hide, we remove them from headers and size
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
674 if not hide_cols:
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
675 headers = self.headers
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
676 sizes = self.sizes
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
677 else:
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
678 headers = list(self.headers)
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
679 sizes = self.sizes[:]
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
680 ignore_idx = [headers.index(to_hide) for to_hide in hide_cols]
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
681 for to_hide in hide_cols:
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
682 hide_idx = headers.index(to_hide)
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
683 del headers[hide_idx]
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
684 del sizes[hide_idx]
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
685
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
686 if right is None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
687 right = left
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
688 if top_sep is None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
689 top_sep = col_sep_size * top
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
690 if head_sep is None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
691 head_sep = col_sep
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
692 if bottom is None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
693 bottom = top
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
694 if bottom_sep is None:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
695 bottom_sep = col_sep_size * bottom
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
696 if not show_borders:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
697 left = right = head_line_left = head_line_right = ""
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
698 # top border
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
699 if show_borders:
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
700 self._disp(
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
701 top_left + top_sep.join([top * size for size in sizes]) + top_right
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
702 )
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
703
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
704 # headers
3121
040ca99e25fe jp (common): various Table fixes:
Goffi <goffi@goffi.org>
parents: 3046
diff changeset
705 if show_header and self.headers is not None:
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
706 self._disp(
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
707 left
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
708 + self._headers(head_sep, headers, sizes, head_alignment, head_style)
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
709 + right
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
710 )
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
711 # header line
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
712 self._disp(
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
713 head_line_left
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
714 + head_line_sep.join([head_line * size for size in sizes])
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
715 + head_line_right
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
716 )
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
717
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
718 # content
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
719 if columns_alignment == "left":
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
720 alignment = lambda idx, s: ansi_ljust(s, sizes[idx])
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
721 elif columns_alignment == "center":
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
722 alignment = lambda idx, s: ansi_center(s, sizes[idx])
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
723 elif columns_alignment == "right":
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
724 alignment = lambda idx, s: ansi_rjust(s, sizes[idx])
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
725 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
726 raise exceptions.InternalError("bad columns alignment argument")
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
727
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
728 for row in self.rows:
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
729 if hide_cols:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
730 row = [v for idx, v in enumerate(row) if idx not in ignore_idx]
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
731 self._disp(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
732 left
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
733 + col_sep.join([alignment(idx, c) for idx, c in enumerate(row)])
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
734 + right
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
735 )
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
736
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
737 if show_borders:
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
738 # bottom border
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
739 self._disp(
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
740 bottom_left
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
741 + bottom_sep.join([bottom * size for size in sizes])
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
742 + bottom_right
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2610
diff changeset
743 )
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
744 #  we return self so string can be used after display (table.display().string)
2345
c57bc0fe17d9 jp (common): added use_buffer argument in Table:
Goffi <goffi@goffi.org>
parents: 2344
diff changeset
745 return self
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
746
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
747 def display_blank(self, **kwargs):
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
748 """Display table without visible borders"""
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2905
diff changeset
749 kwargs_ = {"col_sep": " ", "head_line_sep": " ", "show_borders": False}
2298
276e546b7619 jp (common): new ansi_ljust, ansi_rjust and ansi_center command + table:
Goffi <goffi@goffi.org>
parents: 2280
diff changeset
750 kwargs_.update(kwargs)
2493
984792a451bc jp (common/table): a column can be hidden + fix for empty tables
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
751 return self.display(**kwargs_)
2551
b27165bf160c jp (merge-request/set): if service and node are not specified, URIFinder is now used + ask confirmation before publishing
Goffi <goffi@goffi.org>
parents: 2532
diff changeset
752
b27165bf160c jp (merge-request/set): if service and node are not specified, URIFinder is now used + ask confirmation before publishing
Goffi <goffi@goffi.org>
parents: 2532
diff changeset
753
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
754 async def fill_well_known_uri(command, path, key, meta_map=None):
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
755 """Look for URIs in well-known location and fill appropriate args if suitable
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
756
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
757 @param command(CommandBase): command instance
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
758 args of this instance will be updated with found values
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
759 @param path(unicode): absolute path to use as a starting point to look for URIs
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
760 @param key(unicode): key to look for
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
761 @param meta_map(dict, None): if not None, map metadata to arg name
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
762 key is metadata used attribute name
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
763 value is name to actually use, or None to ignore
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
764 use empty dict to only retrieve URI
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
765 possible keys are currently:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
766 - labels
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
767 """
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
768 args = command.args
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
769 if args.service or args.node:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
770 # we only look for URIs if a service and a node are not already specified
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
771 return
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
772
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
773 host = command.host
2551
b27165bf160c jp (merge-request/set): if service and node are not specified, URIFinder is now used + ask confirmation before publishing
Goffi <goffi@goffi.org>
parents: 2532
diff changeset
774
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
775 try:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
776 uris_data = await host.bridge.URIFind(path, [key])
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
777 except Exception as e:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
778 host.disp(f"can't find {key} URI: {e}", error=True)
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
779 host.quit(C.EXIT_BRIDGE_ERRBACK)
2551
b27165bf160c jp (merge-request/set): if service and node are not specified, URIFinder is now used + ask confirmation before publishing
Goffi <goffi@goffi.org>
parents: 2532
diff changeset
780
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
781 try:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
782 uri_data = uris_data[key]
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
783 except KeyError:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
784 host.disp(
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
785 _(
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
786 "No {key} URI specified for this project, please specify service and "
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
787 "node"
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
788 ).format(key=key),
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
789 error=True,
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
790 )
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
791 host.quit(C.EXIT_NOT_FOUND)
2558
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
792
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
793 uri = uri_data["uri"]
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
794
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
795 # set extra metadata if they are specified
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
796 for data_key in ["labels"]:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
797 new_values_json = uri_data.get(data_key)
2558
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
798 if uri_data is not None:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
799 if meta_map is None:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
800 dest = data_key
2558
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
801 else:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
802 dest = meta_map.get(data_key)
2558
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
803 if dest is None:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
804 continue
2558
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
805
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
806 try:
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
807 values = getattr(args, data_key)
2558
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
808 except AttributeError:
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
809 raise exceptions.InternalError(f"there is no {data_key!r} arguments")
2558
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
810 else:
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
811 if values is None:
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
812 values = []
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
813 values.extend(json.loads(new_values_json))
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
814 setattr(args, dest, values)
2558
501b0f827f63 jp (merge-request,common): fixed URIFinder when metadata are not needed:
Goffi <goffi@goffi.org>
parents: 2554
diff changeset
815
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
816 parsed_uri = xmpp_uri.parseXMPPUri(uri)
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
817 try:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
818 args.service = parsed_uri["path"]
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
819 args.node = parsed_uri["node"]
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
820 except KeyError:
3568
04283582966f core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
821 host.disp(_("Invalid URI found: {uri}").format(uri=uri), error=True)
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3037
diff changeset
822 host.quit(C.EXIT_DATA_ERROR)