encommon 1.1.0__py3-none-any.whl → 2.0.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,8 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
encommon/config/common.py CHANGED
@@ -1,14 +1,15 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
9
9
 
10
10
  from pathlib import Path
11
11
  from typing import Any
12
+ from typing import Literal
12
13
  from typing import Optional
13
14
 
14
15
  from yaml import SafeLoader
@@ -22,6 +23,15 @@ from ..utils.paths import resolve_paths
22
23
 
23
24
 
24
25
 
26
+ LOGLEVELS = Literal[
27
+ 'critical',
28
+ 'debug',
29
+ 'error',
30
+ 'info',
31
+ 'warning']
32
+
33
+
34
+
25
35
  def config_load(
26
36
  path: str | Path,
27
37
  ) -> dict[str, Any]:
encommon/config/config.py CHANGED
@@ -1,19 +1,23 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
9
9
 
10
10
  from copy import deepcopy
11
11
  from typing import Any
12
+ from typing import Callable
12
13
  from typing import Optional
13
14
 
15
+ from .common import config_paths
14
16
  from .files import ConfigFiles
15
17
  from .logger import Logger
18
+ from .params import ConfigFileParams
16
19
  from .paths import ConfigPaths
20
+ from ..crypts.crypts import Crypts
17
21
  from ..types.dicts import merge_dicts
18
22
  from ..utils.common import PATHABLE
19
23
 
@@ -23,19 +27,27 @@ class Config:
23
27
  """
24
28
  Contain the configurations from the arguments and files.
25
29
 
30
+ .. note::
31
+ Configuration loaded from files is validated with the
32
+ Pydantic model :class:`.ConfigFileParams`.
33
+
26
34
  :param files: Complete or relative path to config files.
27
35
  :param paths: Complete or relative path to config paths.
28
36
  :param cargs: Configuration arguments in dictionary form,
29
37
  which will override contents from the config files.
38
+ :param model: Override default config validation model.
30
39
  """
31
40
 
32
41
  __files: ConfigFiles
33
42
  __paths: ConfigPaths
34
43
  __cargs: dict[str, Any]
35
44
 
45
+ __model: Callable # type: ignore
46
+
36
47
  __config: Optional[dict[str, Any]]
37
48
  __merged: Optional[dict[str, Any]]
38
49
  __logger: Optional[Logger]
50
+ __crypts: Optional[Crypts]
39
51
 
40
52
 
41
53
  def __init__(
@@ -44,6 +56,7 @@ class Config:
44
56
  files: Optional[PATHABLE] = None,
45
57
  paths: Optional[PATHABLE] = None,
46
58
  cargs: Optional[dict[str, Any]] = None,
59
+ model: Optional[Callable] = None, # type: ignore
47
60
  ) -> None:
48
61
  """
49
62
  Initialize instance for class using provided parameters.
@@ -53,13 +66,26 @@ class Config:
53
66
  paths = paths or []
54
67
  cargs = cargs or {}
55
68
 
69
+ paths = list(config_paths(paths))
70
+
71
+ self.__model = (
72
+ model or ConfigFileParams)
73
+
56
74
  self.__files = ConfigFiles(files)
57
75
  self.__cargs = deepcopy(cargs)
58
- self.__paths = ConfigPaths(paths)
59
76
 
60
77
  self.__config = None
78
+
79
+ enconfig = self.config['enconfig']
80
+
81
+ if enconfig['paths']:
82
+ paths.extend(enconfig['paths'])
83
+
84
+ self.__paths = ConfigPaths(paths)
85
+
61
86
  self.__merged = None
62
87
  self.__logger = None
88
+ self.__crypts = None
63
89
 
64
90
 
65
91
  @property
@@ -101,6 +127,19 @@ class Config:
101
127
  return self.__cargs
102
128
 
103
129
 
130
+ @property
131
+ def model(
132
+ self,
133
+ ) -> Callable: # type: ignore
134
+ """
135
+ Return the property for attribute from the class instance.
136
+
137
+ :returns: Property for attribute from the class instance.
138
+ """
139
+
140
+ return self.__model
141
+
142
+
104
143
  @property
105
144
  def config(
106
145
  self,
@@ -138,7 +177,10 @@ class Config:
138
177
  force=True)
139
178
 
140
179
 
141
- self.__config = merged
180
+ config = self.__model(**merged)
181
+
182
+
183
+ self.__config = config.model_dump()
142
184
 
143
185
  return deepcopy(self.__config)
144
186
 
@@ -187,11 +229,28 @@ class Config:
187
229
  if self.__logger is not None:
188
230
  return self.__logger
189
231
 
190
- enlogger = self.config.get('enlogger', {})
232
+ enlogger = (
233
+ self.config['enlogger'] or {})
191
234
 
192
- self.__logger = Logger(
193
- stdo_level=enlogger.get('stdo_level'),
194
- file_level=enlogger.get('file_level'),
195
- file_path=enlogger.get('file_path'))
235
+ self.__logger = Logger(**enlogger)
196
236
 
197
237
  return self.__logger
238
+
239
+
240
+ @property
241
+ def crypts(
242
+ self,
243
+ ) -> Crypts:
244
+ """
245
+ Initialize the encryption instance using the parameters.
246
+ """
247
+
248
+ if self.__crypts is not None:
249
+ return self.__crypts
250
+
251
+ encrypts = (
252
+ self.config['encrypts'] or {})
253
+
254
+ self.__crypts = Crypts(**encrypts)
255
+
256
+ return self.__crypts
encommon/config/files.py CHANGED
@@ -1,8 +1,8 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
encommon/config/logger.py CHANGED
@@ -1,8 +1,8 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
@@ -25,6 +25,7 @@ from typing import Any
25
25
  from typing import Literal
26
26
  from typing import Optional
27
27
 
28
+ from .common import LOGLEVELS
28
29
  from .common import config_path
29
30
  from ..times.common import PARSABLE
30
31
  from ..times.times import Times
@@ -36,13 +37,6 @@ from ..utils.stdout import kvpair_ansi
36
37
  LOGGER_FILE = 'encommon.logger.file'
37
38
  LOGGER_STDO = 'encommon.logger.stdo'
38
39
 
39
- LOGLEVELS = Literal[
40
- 'critical',
41
- 'debug',
42
- 'error',
43
- 'info',
44
- 'warning']
45
-
46
40
  LOGSEVERS = {
47
41
  'critical': int(CRITICAL),
48
42
  'debug': int(DEBUG),
@@ -0,0 +1,46 @@
1
+ """
2
+ Functions and routines associated with Enasis Network Common Library.
3
+
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
+ """
7
+
8
+
9
+
10
+ from typing import Optional
11
+
12
+ from pydantic import BaseModel
13
+
14
+ from .common import LOGLEVELS
15
+ from ..crypts.params import CryptsParams
16
+
17
+
18
+
19
+ class ConfigParams(BaseModel):
20
+ """
21
+ Process and validate the common configuration parameters.
22
+ """
23
+
24
+ paths: Optional[list[str]] = None
25
+
26
+
27
+
28
+ class LoggerParams(BaseModel):
29
+ """
30
+ Process and validate the common configuration parameters.
31
+ """
32
+
33
+ stdo_level: Optional[LOGLEVELS] = None
34
+ file_level: Optional[LOGLEVELS] = None
35
+ file_path: Optional[str] = None
36
+
37
+
38
+
39
+ class ConfigFileParams(BaseModel):
40
+ """
41
+ Process and validate the common configuration parameters.
42
+ """
43
+
44
+ enconfig: Optional[ConfigParams] = None
45
+ enlogger: Optional[LoggerParams] = None
46
+ encrypts: Optional[CryptsParams] = None
encommon/config/paths.py CHANGED
@@ -1,8 +1,8 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
@@ -1,6 +1,6 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
@@ -1,8 +1,8 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
@@ -1,8 +1,8 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
@@ -12,6 +12,7 @@ from pathlib import Path
12
12
  from ..config import Config
13
13
  from ..logger import Logger
14
14
  from ... import ENPYRWS
15
+ from ...crypts.crypts import Crypts
15
16
  from ...utils.sample import load_sample
16
17
  from ...utils.sample import prep_sample
17
18
 
@@ -37,29 +38,40 @@ def test_Config( # noqa: CFQ001
37
38
  (config_path
38
39
  .joinpath('one.yml')
39
40
  .write_text(
40
- 'stdo_level: info\n'))
41
+ 'enconfig:\n'
42
+ f' paths: ["{config_path}"]\n'
43
+ 'enlogger:\n'
44
+ ' stdo_level: info\n'))
41
45
 
42
46
  (config_path
43
47
  .joinpath('two.yml')
44
48
  .write_text(
45
- 'stdo_level: debug\n'
46
- 'file_level: info\n'))
49
+ 'encrypts:\n'
50
+ ' phrases:\n'
51
+ ' default: fernetpassphrase\n'
52
+ 'enlogger:\n'
53
+ ' stdo_level: debug\n'
54
+ ' file_level: info\n'))
47
55
 
48
56
 
49
57
  config = Config(
50
58
  files=[
51
59
  f'{config_path}/one.yml',
52
60
  f'{config_path}/two.yml'],
53
- paths=[config_path, tmp_path],
54
- cargs={'file_level': 'warning'})
61
+ cargs={
62
+ 'enlogger': {
63
+ 'file_level': 'warning'}})
55
64
 
56
- assert len(config.__dict__) == 6
65
+ assert len(config.__dict__) == 8
57
66
 
58
67
  assert hasattr(config, '_Config__files')
59
68
  assert hasattr(config, '_Config__paths')
60
69
  assert hasattr(config, '_Config__cargs')
70
+ assert hasattr(config, '_Config__model')
61
71
  assert hasattr(config, '_Config__config')
62
72
  assert hasattr(config, '_Config__merged')
73
+ assert hasattr(config, '_Config__logger')
74
+ assert hasattr(config, '_Config__crypts')
63
75
 
64
76
 
65
77
  assert list(config.files.paths) == [
@@ -70,10 +82,13 @@ def test_Config( # noqa: CFQ001
70
82
  Path(f'{config_path}')]
71
83
 
72
84
  assert config.cargs == {
73
- 'file_level': 'warning'}
85
+ 'enlogger': {
86
+ 'file_level': 'warning'}}
74
87
 
88
+ assert hasattr(config.model, 'model_dump')
75
89
 
76
- assert len(config.config) == 2
90
+
91
+ assert len(config.config) == 3
77
92
 
78
93
  _config1 = config.config
79
94
  _config2 = config.config
@@ -135,3 +150,13 @@ def test_Config( # noqa: CFQ001
135
150
  _logger2 = config.logger
136
151
 
137
152
  assert _logger1 is _logger2
153
+
154
+
155
+ crypts = config.crypts
156
+
157
+ assert isinstance(crypts, Crypts)
158
+
159
+ _crypts1 = config.crypts
160
+ _crypts2 = config.crypts
161
+
162
+ assert _crypts1 is _crypts2
@@ -1,8 +1,8 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
@@ -1,8 +1,8 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
@@ -1,8 +1,8 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
encommon/conftest.py CHANGED
@@ -1,8 +1,8 @@
1
1
  """
2
2
  Functions and routines associated with Enasis Network Common Library.
3
3
 
4
- This file is part of Enasis Network software eco-system. Distribution is
5
- permitted, for more information consult the project license file.
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
6
  """
7
7
 
8
8
 
@@ -7,11 +7,11 @@ is permitted, for more information consult the project license file.
7
7
 
8
8
 
9
9
 
10
- from .crypt import Crypt
10
+ from .crypts import Crypts
11
11
  from .hashes import Hashes
12
12
 
13
13
 
14
14
 
15
15
  __all__ = [
16
- 'Crypt',
16
+ 'Crypts',
17
17
  'Hashes']
@@ -20,40 +20,40 @@ ENCRYPT = compile(
20
20
 
21
21
 
22
22
 
23
- class Crypt:
23
+ class Crypts:
24
24
  """
25
25
  Encrypt and decrypt values using passphrase dictionary.
26
26
 
27
27
  Example
28
28
  -------
29
- >>> phrase = Crypt.keygen()
30
- >>> crypt = Crypt({'default': phrase})
31
- >>> encrypt = crypt.encrypt('example')
32
- >>> crypt.decrypt(encrypt)
29
+ >>> phrase = Crypts.keygen()
30
+ >>> crypts = Crypts({'default': phrase})
31
+ >>> encrypt = crypts.encrypt('example')
32
+ >>> crypts.decrypt(encrypt)
33
33
  'example'
34
34
 
35
- :param mapping: Passphrases that are used in operations.
35
+ :param phrases: Passphrases that are used in operations.
36
36
  """
37
37
 
38
- __phrase: dict[str, str]
38
+ __phrases: dict[str, str]
39
39
 
40
40
 
41
41
  def __init__(
42
42
  self,
43
- mapping: dict[str, str],
43
+ phrases: dict[str, str],
44
44
  ) -> None:
45
45
  """
46
46
  Initialize instance for class using provided parameters.
47
47
  """
48
48
 
49
- if 'default' not in mapping:
49
+ if 'default' not in phrases:
50
50
  raise ValueError('default')
51
51
 
52
- self.__phrase = dict(mapping)
52
+ self.__phrases = dict(phrases)
53
53
 
54
54
 
55
55
  @property
56
- def mapping(
56
+ def phrases(
57
57
  self,
58
58
  ) -> dict[str, str]:
59
59
  """
@@ -62,7 +62,7 @@ class Crypt:
62
62
  :returns: Property for attribute from the class instance.
63
63
  """
64
64
 
65
- return dict(self.__phrase)
65
+ return dict(self.__phrases)
66
66
 
67
67
 
68
68
  def encrypt(
@@ -78,7 +78,7 @@ class Crypt:
78
78
  :returns: Encrypted value using the relevant passphrase.
79
79
  """
80
80
 
81
- phrase = self.__phrase[unique]
81
+ phrase = self.__phrases[unique]
82
82
 
83
83
  encrypt = (
84
84
  Fernet(phrase)
@@ -112,7 +112,7 @@ class Crypt:
112
112
  if version != '1.0':
113
113
  raise ValueError('version')
114
114
 
115
- phrase = self.__phrase[unique]
115
+ phrase = self.__phrases[unique]
116
116
 
117
117
  return (
118
118
  Fernet(phrase)
@@ -0,0 +1,19 @@
1
+ """
2
+ Functions and routines associated with Enasis Network Common Library.
3
+
4
+ This file is part of Enasis Network software eco-system. Distribution
5
+ is permitted, for more information consult the project license file.
6
+ """
7
+
8
+
9
+
10
+ from pydantic import BaseModel
11
+
12
+
13
+
14
+ class CryptsParams(BaseModel):
15
+ """
16
+ Process and validate the common configuration parameters.
17
+ """
18
+
19
+ phrases: dict[str, str]
@@ -10,37 +10,37 @@ is permitted, for more information consult the project license file.
10
10
  from pytest import mark
11
11
  from pytest import raises
12
12
 
13
- from ..crypt import Crypt
13
+ from ..crypts import Crypts
14
14
 
15
15
 
16
16
 
17
17
  _PHRASES = {
18
- 'default': Crypt.keygen(),
19
- 'secrets': Crypt.keygen()}
18
+ 'default': Crypts.keygen(),
19
+ 'secrets': Crypts.keygen()}
20
20
 
21
21
 
22
22
 
23
- def test_Crypt() -> None:
23
+ def test_Crypts() -> None:
24
24
  """
25
25
  Perform various tests associated with relevant routines.
26
26
  """
27
27
 
28
28
 
29
- crypt = Crypt(_PHRASES)
29
+ crypts = Crypts(_PHRASES)
30
30
 
31
- assert len(crypt.__dict__) == 1
31
+ assert len(crypts.__dict__) == 1
32
32
 
33
- assert hasattr(crypt, '_Crypt__phrase')
33
+ assert hasattr(crypts, '_Crypts__phrases')
34
34
 
35
35
 
36
- assert repr(crypt).startswith(
37
- '<encommon.crypt.crypt.Crypt')
36
+ assert repr(crypts).startswith(
37
+ '<encommon.crypts.crypts.Crypts')
38
38
 
39
- assert str(crypt).startswith(
40
- '<encommon.crypt.crypt.Crypt')
39
+ assert str(crypts).startswith(
40
+ '<encommon.crypts.crypts.Crypts')
41
41
 
42
42
 
43
- assert crypt.mapping == _PHRASES
43
+ assert crypts.phrases == _PHRASES
44
44
 
45
45
 
46
46
 
@@ -48,7 +48,7 @@ def test_Crypt() -> None:
48
48
  'value,unique',
49
49
  [('foo', 'default'),
50
50
  ('foo', 'secrets')])
51
- def test_Crypt_iterate(
51
+ def test_Crypts_iterate(
52
52
  value: str,
53
53
  unique: str,
54
54
  ) -> None:
@@ -59,43 +59,43 @@ def test_Crypt_iterate(
59
59
  :param unique: Unique identifier of mapping passphrase.
60
60
  """
61
61
 
62
- crypt = Crypt(_PHRASES)
62
+ crypts = Crypts(_PHRASES)
63
63
 
64
- encrypt = crypt.encrypt(value, unique)
64
+ encrypt = crypts.encrypt(value, unique)
65
65
 
66
66
  split = encrypt.split(';')
67
67
 
68
68
  assert split[1] == '1.0'
69
69
  assert split[2] == unique
70
70
 
71
- decrypt = crypt.decrypt(encrypt)
71
+ decrypt = crypts.decrypt(encrypt)
72
72
 
73
73
  assert decrypt == value
74
74
 
75
75
 
76
76
 
77
- def test_Crypt_raises() -> None:
77
+ def test_Crypts_raises() -> None:
78
78
  """
79
79
  Perform various tests associated with relevant routines.
80
80
  """
81
81
 
82
82
 
83
83
  with raises(ValueError) as reason:
84
- Crypt({'foo': 'bar'})
84
+ Crypts({'foo': 'bar'})
85
85
 
86
86
  assert str(reason.value) == 'default'
87
87
 
88
88
 
89
- crypt = Crypt(_PHRASES)
89
+ crypts = Crypts(_PHRASES)
90
90
 
91
91
 
92
92
  with raises(ValueError) as reason:
93
- crypt.decrypt('foo')
93
+ crypts.decrypt('foo')
94
94
 
95
95
  assert str(reason.value) == 'string'
96
96
 
97
97
 
98
98
  with raises(ValueError) as reason:
99
- crypt.decrypt('$ENCRYPT;1.1;f;oo')
99
+ crypts.decrypt('$ENCRYPT;1.1;f;oo')
100
100
 
101
101
  assert str(reason.value) == 'version'
@@ -25,10 +25,10 @@ def test_Hashes() -> None:
25
25
 
26
26
 
27
27
  assert repr(hashes).startswith(
28
- '<encommon.crypt.hashes.Hashes')
28
+ '<encommon.crypts.hashes.Hashes')
29
29
 
30
30
  assert str(hashes).startswith(
31
- '<encommon.crypt.hashes.Hashes')
31
+ '<encommon.crypts.hashes.Hashes')
32
32
 
33
33
 
34
34
  assert hashes.string == 'string'
encommon/times/parse.py CHANGED
@@ -257,7 +257,7 @@ def duration(
257
257
  '1 year, 11 months'
258
258
 
259
259
  :param seconds: Period in seconds that will be iterated.
260
- :param compact: Determines if output will be consdensed.
260
+ :param compact: Determines if output will be condensed.
261
261
  :param maximum: Determines how many time units are shown.
262
262
  Default value happens to be same number of time units
263
263
  supported; year, month, week, day, hour, and minute.
encommon/version.txt CHANGED
@@ -1 +1 @@
1
- 1.1.0
1
+ 2.0.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: encommon
3
- Version: 1.1.0
3
+ Version: 2.0.0
4
4
  Summary: Enasis Network Common Library
5
5
  License: MIT
6
6
  Classifier: Programming Language :: Python :: 3
@@ -11,6 +11,7 @@ Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
12
  Requires-Dist: croniter
13
13
  Requires-Dist: cryptography
14
+ Requires-Dist: pydantic
14
15
  Requires-Dist: python-dateutil
15
16
  Requires-Dist: pyyaml
16
17
  Requires-Dist: snaptime
@@ -30,8 +31,8 @@ pip install encommon
30
31
 
31
32
  ## Documentation
32
33
  Documentation can be found on [Read the Docs](https://encommon.readthedocs.io).
33
- However if you venture into the sections below you will be able to use the
34
- `sphinx` recipe to build the documention in `docs/html` for local viewing.
34
+ If you venture into the sections below you will be able to use the `sphinx`
35
+ recipe to build the documention in `docs/html` for local consumption.
35
36
 
36
37
  ## Quick start for local development
37
38
  Start by cloning the repository to your local machine.
@@ -1,28 +1,30 @@
1
1
  encommon/__init__.py,sha256=VoXUcphq-gcXCraaU47EtXBftF6UVuQPMGr0fuCTt9A,525
2
- encommon/conftest.py,sha256=OkzXA-CdP3RiFqhtaL3nF5Qdt0LFsajrQaOZ_3BWaQo,772
2
+ encommon/conftest.py,sha256=D_8TAxCdBXYyUacz6V5Iovgka7mn7pXH_rBcx8xbLEg,772
3
3
  encommon/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- encommon/version.txt,sha256=FXXhr0qV8S9wtO5qatzoFglT2T6hfcJhG5CIPMw607g,6
5
- encommon/config/__init__.py,sha256=ZimcFRtWo22L_fKgfVnY8YcwkVQ_DeC3AV_3TVO-Z1c,469
6
- encommon/config/common.py,sha256=gWJ3usayN6yKNdXikFoM4Y0lmQTphkV7-2xJmVFo4SA,1961
7
- encommon/config/config.py,sha256=VnxPHPz5rKqQ-T6HqffMBUvEoqlR1dykH_F_yqgTqik,4282
8
- encommon/config/files.py,sha256=2aqv0kfM26xQBZ38D7bzN9pH-cnX0vYlfmfbkI-PKDs,1535
9
- encommon/config/logger.py,sha256=dQe5JQy0hWH-7skK_mSmGb9hOBikR0o8pWMGoNYrqQs,13510
10
- encommon/config/paths.py,sha256=9T5upahVfUZ8zYDo8AU2ab5ESvORUs2LVXjj3PsSsHM,1729
11
- encommon/config/test/__init__.py,sha256=ieWgzVdaxhiaP_GnfdCtcSEaRW56vnpKXVsCLhqaask,218
12
- encommon/config/test/test_common.py,sha256=Jr3myDlIPKy-rKUOaX_awjGwD1PJZsf1ZSiK6XIvqXc,731
13
- encommon/config/test/test_config.py,sha256=e5MUkQmL9xAueAezBkciPDFqGP9hDNyM7Bt0JylNhHg,3196
14
- encommon/config/test/test_files.py,sha256=uxNUXtn3qhsdokixEb20P2Y1IOSMQICk6_uNGyQlhb4,1300
15
- encommon/config/test/test_logger.py,sha256=dG8RgTIXtzK5wJfUbVVLTSzwSEAgJiCmUcZ7ctirpyg,4366
16
- encommon/config/test/test_paths.py,sha256=IWkp2Xyaxs9IIx33nfPyhN_9FCdSsp8FFxMmP2XcNSQ,1167
17
- encommon/crypt/__init__.py,sha256=y8TS6RKrKseH6mMSjEULrVkl6-KbevH0yZiWmIWj1UA,315
18
- encommon/crypt/crypt.py,sha256=MvKTUv2CnHqEofODzJWI-dropZULKQlVSJ6Y7BJQzHc,3147
19
- encommon/crypt/hashes.py,sha256=PNw-leN3Mx2U1-aVrjK2ueK3b2qXwwXj4rLEMC85DpY,2797
20
- encommon/crypt/test/__init__.py,sha256=PjrnBYT0efyvbaGeNx94dm3tP3EVHUHSVs-VGeLEv5g,218
21
- encommon/crypt/test/test_crypt.py,sha256=iiIIvQ8YaegpKsfcAxs-zbFh7qyrGrh8A7b_Q9zKApc,1871
22
- encommon/crypt/test/test_hashes.py,sha256=Q6OUtDe6-lWS31x6-YdjPqaxLQ4yBUAeA04qXjSanC4,1086
4
+ encommon/version.txt,sha256=wo_MpTY3vIjhJK8XJd8Ty5jGne3v1i-zzb4c22t2BiQ,6
5
+ encommon/config/__init__.py,sha256=tCvJrBTdtNSyg3sZkwUFQBwtK8QHgxLQl833OxblKAo,469
6
+ encommon/config/common.py,sha256=OTmxJhbNA2B9f_fZGQEQPma_zPHeiSDvkd_gEVsLrkE,2081
7
+ encommon/config/config.py,sha256=b1TGPxIUdmYmSI4EP425zXzcuBkShBvsqdMiRh9v1PU,5545
8
+ encommon/config/files.py,sha256=RlAk9iCH7JNYubDQe7IeenKuPY1l8h-DCPcmw2Qv9fI,1535
9
+ encommon/config/logger.py,sha256=2y-VFzgM2pZzEYq48XfvrDPrtUcxyP9QjbH5OG7fv5o,13449
10
+ encommon/config/params.py,sha256=iLCigmZKJfXvIclbCBJ2MBsALCeUeUqJwq92hpv4tk0,988
11
+ encommon/config/paths.py,sha256=NIt4jQy2SalEXuOyZqSdin_3LzLADsqp44bH8tm8RQU,1729
12
+ encommon/config/test/__init__.py,sha256=PjrnBYT0efyvbaGeNx94dm3tP3EVHUHSVs-VGeLEv5g,218
13
+ encommon/config/test/test_common.py,sha256=U6XWfCLxtLmArn8P6h4cmCALzdXxV7IMUxKNU-UhwPw,731
14
+ encommon/config/test/test_config.py,sha256=Zl-bQKS2lGZEWlXna-OdLmxaFHITBfCil5PZl05A21s,3836
15
+ encommon/config/test/test_files.py,sha256=KUdPUvDzBPL9jTRTjJ5nRUOti5i8Z_MF1aBTSHUpmLM,1300
16
+ encommon/config/test/test_logger.py,sha256=Ya0lVnOB97M6FTRwxbmcKcULUGW_nPt4bLCdSRHbTQI,4366
17
+ encommon/config/test/test_paths.py,sha256=SlDJnUeW9JK9Hu3B-QCdHadwPDeqdfzqa-73YYbeefQ,1167
18
+ encommon/crypts/__init__.py,sha256=7tNT1KqdYaVTLMKJazQGBULe8RpxD4MJoJi8nGMZixw,318
19
+ encommon/crypts/crypts.py,sha256=Av6kb9xSvj8mVMxZW8J_PuzBWV24Rw-fOFR9OKW-oH4,3158
20
+ encommon/crypts/hashes.py,sha256=PNw-leN3Mx2U1-aVrjK2ueK3b2qXwwXj4rLEMC85DpY,2797
21
+ encommon/crypts/params.py,sha256=EZM_96lZEwQW5Ay5fKkc6FKxVh-sNENaQ_lbDWBXsR0,393
22
+ encommon/crypts/test/__init__.py,sha256=PjrnBYT0efyvbaGeNx94dm3tP3EVHUHSVs-VGeLEv5g,218
23
+ encommon/crypts/test/test_crypts.py,sha256=HE83AgvhgRs0jn75wVvizLYf6VTtyJLjUsYbRePQ37A,1902
24
+ encommon/crypts/test/test_hashes.py,sha256=slqATRMWOM91o1I1zXQUGDMqBFuIU2aLPIDe-nKKKAg,1088
23
25
  encommon/times/__init__.py,sha256=Yr6rd_bflwOR4XcYkJ3bKKO4HoWI4d8G8PH7eAEfKkc,591
24
26
  encommon/times/common.py,sha256=zDI5ztMkfLmV090jlLLK3hFzGGveasy8I_wNfOQDScg,2500
25
- encommon/times/parse.py,sha256=gl8JACdXtcZh1tm9olL6P-BKQSR_2ulkGwULpqpgz6U,7918
27
+ encommon/times/parse.py,sha256=ffk-Az5nF24EFE1xbkh9Jp-JjTlTp1hRf8AKTXeZ8pQ,7917
26
28
  encommon/times/timer.py,sha256=dsxGgxQ-I75nnwcY9qdxuYD6TdCbhof2KvJuPcatimw,3200
27
29
  encommon/times/times.py,sha256=xpaZ1F25VHj6s862doLQWqmPf9yrj1lkN-BILRH3sPw,8947
28
30
  encommon/times/window.py,sha256=Fx_OJfU9B0IctCyaJ5XH_HxzhGlzeRATwuhI-HlsTPA,8023
@@ -49,8 +51,8 @@ encommon/utils/test/test_paths.py,sha256=ZPU84G_vI13G6t-PtDhM9UG4SHOoF4TiEdqApxt
49
51
  encommon/utils/test/test_regexp.py,sha256=oJglz-8TJiSUtE7NuseFy0dVjau2jR1foEj-ZsBlcek,697
50
52
  encommon/utils/test/test_sample.py,sha256=EZnRI27qf7x3s7Xbtkd9t0o_y1xDQB0o2sPxbO0_dDQ,1465
51
53
  encommon/utils/test/test_stdout.py,sha256=a060uA8oEHFGoVqdwB5iYxdl4R2TRSgr6Z7pMEbxibs,1675
52
- encommon-1.1.0.dist-info/LICENSE,sha256=04XJC5i4LRUf1A_U1EGCMJLpGodnmOFlh30yu7FAVfs,1071
53
- encommon-1.1.0.dist-info/METADATA,sha256=3C9cEUQu5D8d2byCbff1VUmWfLteBieiAuufuEURPPM,2295
54
- encommon-1.1.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
55
- encommon-1.1.0.dist-info/top_level.txt,sha256=bP8q7-5tLDNm-3XPlqn_bDENfYNug5801H_xfz3BEAM,9
56
- encommon-1.1.0.dist-info/RECORD,,
54
+ encommon-2.0.0.dist-info/LICENSE,sha256=04XJC5i4LRUf1A_U1EGCMJLpGodnmOFlh30yu7FAVfs,1071
55
+ encommon-2.0.0.dist-info/METADATA,sha256=vHmdrKOuzKSplACFjW9tNIKZcbOWFcKQ638Racl3k0s,2315
56
+ encommon-2.0.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
57
+ encommon-2.0.0.dist-info/top_level.txt,sha256=bP8q7-5tLDNm-3XPlqn_bDENfYNug5801H_xfz3BEAM,9
58
+ encommon-2.0.0.dist-info/RECORD,,
File without changes
File without changes