annotate sat/tools/common/utils.py @ 3372:5d926c7b0d99

plugin app manager: first draft: /!\ new optional dependency: pyyaml this plugin manage the life cycle of external applications. Application handlers register to it. Data needed to launch an application as set in YAML files. Local data types are used to get values directly from SàT: - !sat_conf to retrieve a configuration value - !sat_generate_pwd to generate a password - !sat_param for parameters specified a launch Data can be exposed when an instance is launched, this can be used to specify the port (notably the one used for web), or a generated password.
author Goffi <goffi@goffi.org>
date Mon, 28 Sep 2020 21:10:30 +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})