annotate sat/tools/common/utils.py @ 3308:384283adcce1

plugins XEP-0059, XEP-0060, XEP-0277, XEP-0313: better serialisation: `data_format.serialise` is now used for `mbGet`, and RSM/MAM values are not transtyped to strings anymore. A serialised dict is now used, items are put in the `items` key. Comments handling has been refactored to use a list for the potentially multiple comments nodes. `rsm` data are now in a `rsm` key of the dict, and `mam` data are merged with other metadata.
author Goffi <goffi@goffi.org>
date Thu, 16 Jul 2020 09:07:20 +0200
parents 84f77f04aa08
children be6d91572633
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3045
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python3
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 # SàT: a XMPP client
3136
9d0df638c8b4 dates update
Goffi <goffi@goffi.org>
parents: 3045
diff changeset
4 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org)
3045
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
5
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
15
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
18
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
19 """Misc utils for both backend and frontends"""
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
20
3265
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
21 import collections.abc
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
22
3045
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
23
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 def per_luminance(red, green, blue):
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
25 """Caculate the perceived luminance of a RGB color
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
26
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 @param red(int): 0-1 normalized value of red
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 @param green(int): 0-1 normalized value of green
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 @param blue(int): 0-1 normalized value of blue
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 @return (float): 0-1 value of luminance (<0.5 is dark, else it's light)
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
31 """
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 # cf. https://stackoverflow.com/a/1855903, thanks Gacek
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
33
6af44ca3beac tools (common): helping method to calculate luminance:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 return 0.299 * red + 0.587 * green + 0.114 * blue
3265
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
35
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
36
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
37 def recursive_update(ori: dict, update: dict):
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
38 """Recursively update a dictionary"""
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
39 # cf. https://stackoverflow.com/a/3233356, thanks Alex Martelli
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
40 for k, v in update.items():
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
41 if isinstance(v, collections.abc.Mapping):
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
42 ori[k] = recursive_update(ori.get(k, {}), v)
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
43 else:
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
44 ori[k] = v
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
45 return ori
1649bbe8d07e tools (common/utils): new `recursive_update` method for dicts
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
46
3292
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
47 class OrderedSet(collections.abc.MutableSet):
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
48 """A mutable sequence which doesn't keep duplicates"""
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
49 # TODO: complete missing set methods
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
50
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
51 def __init__(self, values=None):
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
52 self._dict = {}
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
53 if values is not None:
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
54 self.update(values)
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
55
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
56 def __len__(self):
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
57 return len(self._dict)
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
58
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
59 def __iter__(self):
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
60 return iter(self._dict.keys())
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
61
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
62 def __contains__(self, item):
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
63 return item in self._dict
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
64
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
65 def add(self, item):
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
66 self._dict[item] = None
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
67
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
68 def discard(self, item):
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
69 try:
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
70 del self._dict[item]
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
71 except KeyError:
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
72 pass
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
73
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
74 def update(self, items):
84f77f04aa08 tools (common/utils): new OrderedSet class
Goffi <goffi@goffi.org>
parents: 3265
diff changeset
75 self._dict.update({i: None for i in items})