Mercurial > libervia-backend
annotate sat/tools/common/utils.py @ 3410:55f9a38864af
jp (file/receive): display or answer to C.META_TYPE_NOT_IN_ROSTER_LEAK dialog:
when a file is proposed by an entity not in roster, the dialog asking for confirmation
is displayed. If the bare jid of the sender is explicitely waited (i.e. it's in
arguments), then the dialog is automatically confirmed.
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 12 Nov 2020 14:53:16 +0100 |
parents | 84f77f04aa08 |
children | be6d91572633 |
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 | 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}) |