shepherd-core 2024.4.1__py3-none-any.whl → 2024.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. shepherd_core/__init__.py +3 -3
  2. shepherd_core/calibration_hw_def.py +9 -1
  3. shepherd_core/commons.py +2 -0
  4. shepherd_core/data_models/__init__.py +11 -0
  5. shepherd_core/data_models/base/__init__.py +4 -1
  6. shepherd_core/data_models/base/cal_measurement.py +18 -6
  7. shepherd_core/data_models/base/calibration.py +39 -15
  8. shepherd_core/data_models/base/content.py +10 -2
  9. shepherd_core/data_models/base/shepherd.py +21 -12
  10. shepherd_core/data_models/base/timezone.py +5 -0
  11. shepherd_core/data_models/base/wrapper.py +3 -3
  12. shepherd_core/data_models/content/__init__.py +5 -4
  13. shepherd_core/data_models/content/_external_fixtures.yaml +410 -0
  14. shepherd_core/data_models/content/energy_environment.py +7 -5
  15. shepherd_core/data_models/content/energy_environment_fixture.yaml +53 -0
  16. shepherd_core/data_models/content/firmware.py +12 -5
  17. shepherd_core/data_models/content/firmware_datatype.py +7 -0
  18. shepherd_core/data_models/content/virtual_harvester.py +24 -19
  19. shepherd_core/data_models/content/virtual_harvester_fixture.yaml +160 -0
  20. shepherd_core/data_models/content/virtual_source.py +22 -10
  21. shepherd_core/data_models/content/virtual_source_fixture.yaml +230 -0
  22. shepherd_core/data_models/experiment/__init__.py +5 -4
  23. shepherd_core/data_models/experiment/experiment.py +7 -6
  24. shepherd_core/data_models/experiment/observer_features.py +14 -7
  25. shepherd_core/data_models/experiment/target_config.py +11 -7
  26. shepherd_core/data_models/readme.md +88 -0
  27. shepherd_core/data_models/task/__init__.py +10 -3
  28. shepherd_core/data_models/task/emulation.py +10 -7
  29. shepherd_core/data_models/task/firmware_mod.py +4 -2
  30. shepherd_core/data_models/task/harvest.py +5 -4
  31. shepherd_core/data_models/task/observer_tasks.py +3 -1
  32. shepherd_core/data_models/task/programming.py +3 -1
  33. shepherd_core/data_models/task/testbed_tasks.py +3 -1
  34. shepherd_core/data_models/testbed/__init__.py +5 -2
  35. shepherd_core/data_models/testbed/cape.py +7 -5
  36. shepherd_core/data_models/testbed/cape_fixture.yaml +94 -0
  37. shepherd_core/data_models/testbed/gpio.py +10 -8
  38. shepherd_core/data_models/testbed/gpio_fixture.yaml +166 -0
  39. shepherd_core/data_models/testbed/mcu.py +9 -9
  40. shepherd_core/data_models/testbed/mcu_fixture.yaml +19 -0
  41. shepherd_core/data_models/testbed/observer.py +9 -4
  42. shepherd_core/data_models/testbed/observer_fixture.yaml +221 -0
  43. shepherd_core/data_models/testbed/target.py +4 -2
  44. shepherd_core/data_models/testbed/target_fixture.yaml +137 -0
  45. shepherd_core/data_models/testbed/testbed.py +5 -2
  46. shepherd_core/data_models/testbed/testbed_fixture.yaml +25 -0
  47. shepherd_core/decoder_waveform/__init__.py +2 -0
  48. shepherd_core/decoder_waveform/uart.py +43 -25
  49. shepherd_core/fw_tools/__init__.py +2 -0
  50. shepherd_core/fw_tools/converter.py +20 -9
  51. shepherd_core/fw_tools/converter_elf.py +3 -0
  52. shepherd_core/fw_tools/patcher.py +17 -5
  53. shepherd_core/fw_tools/validation.py +27 -6
  54. shepherd_core/inventory/__init__.py +15 -5
  55. shepherd_core/inventory/python.py +4 -0
  56. shepherd_core/inventory/system.py +6 -2
  57. shepherd_core/inventory/target.py +4 -0
  58. shepherd_core/logger.py +5 -0
  59. shepherd_core/reader.py +38 -23
  60. shepherd_core/testbed_client/__init__.py +2 -0
  61. shepherd_core/testbed_client/cache_path.py +2 -0
  62. shepherd_core/testbed_client/client.py +15 -8
  63. shepherd_core/testbed_client/fixtures.py +27 -11
  64. shepherd_core/testbed_client/user_model.py +8 -3
  65. shepherd_core/vsource/__init__.py +2 -0
  66. shepherd_core/vsource/virtual_converter_model.py +10 -3
  67. shepherd_core/vsource/virtual_harvester_model.py +7 -1
  68. shepherd_core/vsource/virtual_source_model.py +9 -5
  69. shepherd_core/writer.py +26 -21
  70. {shepherd_core-2024.4.1.dist-info → shepherd_core-2024.5.1.dist-info}/METADATA +2 -1
  71. shepherd_core-2024.5.1.dist-info/RECORD +75 -0
  72. shepherd_core-2024.4.1.dist-info/RECORD +0 -64
  73. /shepherd_core/data_models/{doc_virtual_source.py → virtual_source_doc.txt} +0 -0
  74. {shepherd_core-2024.4.1.dist-info → shepherd_core-2024.5.1.dist-info}/WHEEL +0 -0
  75. {shepherd_core-2024.4.1.dist-info → shepherd_core-2024.5.1.dist-info}/top_level.txt +0 -0
  76. {shepherd_core-2024.4.1.dist-info → shepherd_core-2024.5.1.dist-info}/zip-safe +0 -0
@@ -1,3 +1,5 @@
1
+ """Current implementation of a file-based database."""
2
+
1
3
  import copy
2
4
  import os
3
5
  import pickle
@@ -29,7 +31,7 @@ from .cache_path import cache_user_path
29
31
 
30
32
 
31
33
  class Fixture:
32
- """Current implementation of a file-based database"""
34
+ """Current implementation of a file-based database."""
33
35
 
34
36
  def __init__(self, model_type: str) -> None:
35
37
  self.model_type: str = model_type.lower()
@@ -63,7 +65,8 @@ class Fixture:
63
65
  key = int(key) if key.isdigit() else None
64
66
  if key in self.elements_by_id:
65
67
  return self.elements_by_id[int(key)]
66
- raise ValueError(f"{self.model_type} '{key}' not found!")
68
+ msg = f"{self.model_type} '{key}' not found!"
69
+ raise ValueError(msg)
67
70
 
68
71
  def __iter__(self) -> Self:
69
72
  self._iter_index = 0
@@ -95,12 +98,14 @@ class Fixture:
95
98
  if "name" in values and len(chain) < 1:
96
99
  base_name = values.get("name")
97
100
  if base_name in chain:
101
+ msg = f"Inheritance-Circle detected ({base_name} already in {chain})"
98
102
  raise ValueError(
99
- f"Inheritance-Circle detected ({base_name} already in {chain})",
103
+ msg,
100
104
  )
101
105
  if base_name == fixture_name:
106
+ msg = f"Inheritance-Circle detected ({base_name} == {fixture_name})"
102
107
  raise ValueError(
103
- f"Inheritance-Circle detected ({base_name} == {fixture_name})",
108
+ msg,
104
109
  )
105
110
  chain.append(base_name)
106
111
  fixture_base = copy.copy(self[fixture_name])
@@ -149,15 +154,18 @@ class Fixture:
149
154
  def query_id(self, _id: int) -> dict:
150
155
  if isinstance(_id, int) and _id in self.elements_by_id:
151
156
  return self.elements_by_id[_id]
152
- raise ValueError(f"Initialization of {self.model_type} by ID failed - {_id} is unknown!")
157
+ msg = f"Initialization of {self.model_type} by ID failed - {_id} is unknown!"
158
+ raise ValueError(msg)
153
159
 
154
160
  def query_name(self, name: str) -> dict:
155
161
  if isinstance(name, str) and name.lower() in self.elements_by_name:
156
162
  return self.elements_by_name[name.lower()]
157
- raise ValueError(f"Initialization of {self.model_type} by name failed - {name} is unknown!")
163
+ msg = f"Initialization of {self.model_type} by name failed - {name} is unknown!"
164
+ raise ValueError(msg)
158
165
 
159
166
 
160
167
  def file_older_than(file: Path, delta: timedelta) -> bool:
168
+ """Decide if file is older than a specific duration of time."""
161
169
  cutoff = local_now() - delta
162
170
  mtime = datetime.fromtimestamp(file.stat().st_mtime, tz=local_tz())
163
171
  if mtime < cutoff:
@@ -166,6 +174,8 @@ def file_older_than(file: Path, delta: timedelta) -> bool:
166
174
 
167
175
 
168
176
  class Fixtures:
177
+ """A collection of individual fixture-elements."""
178
+
169
179
  suffix = ".yaml"
170
180
 
171
181
  @validate_call
@@ -194,9 +204,12 @@ class Fixtures:
194
204
  for file in files:
195
205
  self.insert_file(file)
196
206
 
197
- save_path.parent.mkdir(parents=True, exist_ok=True)
198
- with save_path.open("wb", buffering=-1) as fd:
199
- pickle.dump(self.components, fd)
207
+ if len(self.components) < 1:
208
+ logger.error(f"No fixture-components found at {self.file_path.as_posix()}")
209
+ else:
210
+ save_path.parent.mkdir(parents=True, exist_ok=True)
211
+ with save_path.open("wb", buffering=-1) as fd:
212
+ pickle.dump(self.components, fd)
200
213
 
201
214
  @validate_call
202
215
  def insert_file(self, file: Path) -> None:
@@ -218,17 +231,20 @@ class Fixtures:
218
231
  key = key.lower()
219
232
  if key in self.components:
220
233
  return self.components[key]
221
- raise ValueError(f"Component '{key}' not found!")
234
+ msg = f"Component '{key}' not found!"
235
+ raise ValueError(msg)
222
236
 
223
237
  def keys(self): # noqa: ANN201
224
238
  return self.components.keys()
225
239
 
226
240
  @staticmethod
227
241
  def to_file(file: Path) -> None:
228
- raise RuntimeError(f"Not Implemented, TODO (val={file})")
242
+ msg = f"TODO (val={file})"
243
+ raise NotImplementedError(msg)
229
244
 
230
245
 
231
246
  def get_files(start_path: Path, suffix: str, recursion_depth: int = 0) -> List[Path]:
247
+ """Generate a recursive list of all files in a directory."""
232
248
  if recursion_depth == 0:
233
249
  suffix = suffix.lower().split(".")[-1]
234
250
  dir_items = os.scandir(start_path)
@@ -1,3 +1,5 @@
1
+ """Model for user-management."""
2
+
1
3
  import secrets
2
4
  from hashlib import pbkdf2_hmac
3
5
  from typing import Optional
@@ -21,8 +23,11 @@ from ..data_models.base.shepherd import ShpModel
21
23
 
22
24
  @validate_call
23
25
  def hash_password(pw: Annotated[str, StringConstraints(min_length=20, max_length=100)]) -> bytes:
24
- # TODO: add salt of testbed -> this fn should be part of Testbed-Object
26
+ """Generate a hash of a string.
27
+
25
28
  # NOTE: 1M Iterations need 25s on beaglebone
29
+ # TODO: add salt of testbed -> this fn should be part of Testbed-Object
30
+ """
26
31
  return pbkdf2_hmac(
27
32
  "sha512",
28
33
  password=pw.encode("utf-8"),
@@ -33,9 +38,9 @@ def hash_password(pw: Annotated[str, StringConstraints(min_length=20, max_length
33
38
 
34
39
 
35
40
  class User(ShpModel):
36
- """meta-data representation of a testbed-component (physical object)"""
41
+ """meta-data representation of a testbed-component (physical object)."""
37
42
 
38
- # id: UUID4 = Field( # TODO db-migration - temp fix for documentation
43
+ # id: UUID4 = Field( # TODO: db-migration - temp fix for documentation
39
44
  id: Union[UUID4, int] = Field(
40
45
  description="Unique ID",
41
46
  default_factory=uuid4,
@@ -1,3 +1,5 @@
1
+ """Simulation model of the virtual source."""
2
+
1
3
  from .virtual_converter_model import PruCalibration
2
4
  from .virtual_converter_model import VirtualConverterModel
3
5
  from .virtual_harvester_model import VirtualHarvesterModel
@@ -1,4 +1,7 @@
1
- """this is ported py-version of the pru-code, goals:
1
+ """This is ported py-version of the pru-code.
2
+
3
+ Goals:
4
+
2
5
  - stay close to original code-base
3
6
  - offer a comparison for the tests
4
7
  - step 1 to a virtualization of emulation
@@ -6,6 +9,7 @@
6
9
  NOTE: DO NOT OPTIMIZE -> stay close to original code-base
7
10
 
8
11
  Compromises:
12
+
9
13
  - bitshifted values (i.e. _n28) are converted to float without shift
10
14
 
11
15
  """
@@ -19,7 +23,7 @@ from ..data_models.content.virtual_source import ConverterPRUConfig
19
23
 
20
24
 
21
25
  class PruCalibration:
22
- """part of calibration.h"""
26
+ """part of calibration.h."""
23
27
 
24
28
  def __init__(self, cal_emu: Optional[CalibrationEmulator] = None) -> None:
25
29
  self.cal = cal_emu if cal_emu else CalibrationEmulator()
@@ -30,7 +34,8 @@ class PruCalibration:
30
34
 
31
35
  @staticmethod
32
36
  def conv_adc_raw_to_uV(voltage_raw: int) -> float:
33
- raise RuntimeError(f"This Fn should not been used (val={voltage_raw})")
37
+ msg = f"This Fn should not been used (val={voltage_raw})"
38
+ raise RuntimeError(msg)
34
39
 
35
40
  def conv_uV_to_dac_raw(self, voltage_uV: float) -> int:
36
41
  dac_raw = self.cal.dac_V_A.si_to_raw(float(voltage_uV) / (10**6))
@@ -40,6 +45,8 @@ class PruCalibration:
40
45
 
41
46
 
42
47
  class VirtualConverterModel:
48
+ """Ported python version of the pru vCnv."""
49
+
43
50
  def __init__(self, cfg: ConverterPRUConfig, cal: PruCalibration) -> None:
44
51
  self._cal: PruCalibration = cal
45
52
  self._cfg: ConverterPRUConfig = cfg
@@ -1,4 +1,7 @@
1
- """this is ported py-version of the pru-code, goals:
1
+ """this is ported py-version of the pru-code.
2
+
3
+ Goals:
4
+
2
5
  - stay close to original code-base
3
6
  - offer a comparison for the tests
4
7
  - step 1 to a virtualization of emulation
@@ -7,6 +10,7 @@ NOTE1: DO NOT OPTIMIZE -> stay close to original c-code-base
7
10
  NOTE2: adc-harvest-routines are not part of this model (virtual_harvester lines 66:289)
8
11
 
9
12
  Compromises:
13
+
10
14
  - Py has to map the settings-list to internal vars -> is kernel-task
11
15
  - Python has no static vars -> FName_reset is handling the class-vars
12
16
 
@@ -18,6 +22,8 @@ from ..data_models.content.virtual_harvester import HarvesterPRUConfig
18
22
 
19
23
 
20
24
  class VirtualHarvesterModel:
25
+ """Ported python version of the pru vHrv."""
26
+
21
27
  HRV_IVCURVE: int = 2**4
22
28
  HRV_CV: int = 2**8
23
29
  HRV_MPPT_VOC: int = 2**12
@@ -1,7 +1,10 @@
1
- """this is ported py-version of the pru-code, goals:
1
+ """This is ported py-version of the pru-code.
2
+
3
+ Goals:
4
+
2
5
  - stay close to original code-base
3
6
  - offer a comparison for the tests
4
- - step 1 to a virtualization of emulation
7
+ - step 1 to a virtualization of emulation.
5
8
 
6
9
  NOTE: DO NOT OPTIMIZE -> stay close to original code-base
7
10
 
@@ -20,7 +23,7 @@ from .virtual_harvester_model import VirtualHarvesterModel
20
23
 
21
24
 
22
25
  class VirtualSourceModel:
23
- """part of sampling.c"""
26
+ """part of sampling.c."""
24
27
 
25
28
  def __init__(
26
29
  self,
@@ -53,8 +56,9 @@ class VirtualSourceModel:
53
56
  self.W_out_fWs: float = 0.0
54
57
 
55
58
  def iterate_sampling(self, V_inp_uV: int = 0, I_inp_nA: int = 0, I_out_nA: int = 0) -> int:
56
- """TEST-SIMPLIFICATION - code below is not part of pru-code,
57
- but in part sample_emulator() in sampling.c
59
+ """TEST-SIMPLIFICATION - code below is not part of pru-code.
60
+
61
+ It originates from sample_emulator() in sampling.c.
58
62
 
59
63
  :param V_inp_uV:
60
64
  :param I_inp_nA:
shepherd_core/writer.py CHANGED
@@ -1,4 +1,4 @@
1
- """Writer that inherits from Reader-Baseclass"""
1
+ """Writer that inherits from Reader-Baseclass."""
2
2
 
3
3
  import logging
4
4
  import math
@@ -35,10 +35,12 @@ from .reader import Reader
35
35
  def path2str(
36
36
  dumper: Dumper, data: Union[pathlib.Path, pathlib.WindowsPath, pathlib.PosixPath]
37
37
  ) -> ScalarNode:
38
+ """Add a yaml-representation for a specific datatype."""
38
39
  return dumper.represent_scalar("tag:yaml.org,2002:str", str(data.as_posix()))
39
40
 
40
41
 
41
42
  def time2int(dumper: Dumper, data: timedelta) -> ScalarNode:
43
+ """Add a yaml-representation for a specific datatype."""
42
44
  return dumper.represent_scalar("tag:yaml.org,2002:int", str(int(data.total_seconds())))
43
45
 
44
46
 
@@ -49,7 +51,7 @@ yaml.add_representer(timedelta, time2int, SafeDumper)
49
51
 
50
52
 
51
53
  def unique_path(base_path: Union[str, Path], suffix: str) -> Path:
52
- """Finds an unused filename in case it already exists
54
+ """Find an unused filename in case it already exists.
53
55
 
54
56
  :param base_path: file-path to test
55
57
  :param suffix: file-suffix
@@ -64,7 +66,7 @@ def unique_path(base_path: Union[str, Path], suffix: str) -> Path:
64
66
 
65
67
 
66
68
  class Writer(Reader):
67
- """Stores data for Shepherd in HDF5 format
69
+ """Stores data for Shepherd in HDF5 format.
68
70
 
69
71
  Choose lossless compression filter
70
72
  - lzf: low to moderate compression, VERY fast, no options
@@ -124,7 +126,8 @@ class Writer(Reader):
124
126
  self.file_path: Path = file_path.resolve()
125
127
  self._logger.info("Storing data to '%s'", self.file_path)
126
128
  elif file_path.exists() and not file_path.is_file():
127
- raise TypeError(f"Path is not a file ({file_path})")
129
+ msg = f"Path is not a file ({file_path})"
130
+ raise TypeError(msg)
128
131
  else:
129
132
  base_dir = file_path.resolve().parents[0]
130
133
  self.file_path = unique_path(base_dir / file_path.stem, file_path.suffix)
@@ -135,15 +138,15 @@ class Writer(Reader):
135
138
  )
136
139
 
137
140
  if isinstance(mode, str) and mode not in self.mode_dtype_dict:
138
- raise ValueError(f"Can't handle mode '{mode}' (choose one of {self.mode_dtype_dict})")
141
+ msg = f"Can't handle mode '{mode}' (choose one of {self.mode_dtype_dict})"
142
+ raise ValueError(msg)
139
143
 
140
- _dtypes = self.mode_dtype_dict[mode if mode else self.mode_default]
144
+ _dtypes = self.mode_dtype_dict[mode or self.mode_default]
141
145
  if isinstance(datatype, str):
142
146
  datatype = EnergyDType[datatype]
143
147
  if isinstance(datatype, EnergyDType) and datatype not in _dtypes:
144
- raise ValueError(
145
- f"Can't handle value '{datatype}' of datatype (choose one of {_dtypes})"
146
- )
148
+ msg = f"Can't handle value '{datatype}' of datatype (choose one of {_dtypes})"
149
+ raise ValueError(msg)
147
150
 
148
151
  if self._modify:
149
152
  self._mode = mode
@@ -223,10 +226,10 @@ class Writer(Reader):
223
226
  self.h5file.close()
224
227
 
225
228
  def _create_skeleton(self) -> None:
226
- """Initializes the structure of the HDF5 file
229
+ """Initialize the structure of the HDF5 file.
227
230
 
228
231
  HDF5 is hierarchically structured and before writing data, we have to
229
- setup this structure, i.e. creating the right groups with corresponding
232
+ set up this structure, i.e. creating the right groups with corresponding
230
233
  data types. We will store 3 types of data in a database: The
231
234
  actual IV samples recorded either from the harvester (during recording)
232
235
  or the target (during emulation). Any log messages, that can be used to
@@ -279,7 +282,7 @@ class Writer(Reader):
279
282
  voltage: np.ndarray,
280
283
  current: np.ndarray,
281
284
  ) -> None:
282
- """Writes raw data to database
285
+ """Write raw data to database.
283
286
 
284
287
  Args:
285
288
  ----
@@ -298,7 +301,7 @@ class Writer(Reader):
298
301
  if isinstance(timestamp, np.ndarray):
299
302
  len_new = min(len_new, timestamp.size)
300
303
  else:
301
- raise ValueError("timestamp-data was not usable")
304
+ raise TypeError("timestamp-data was not usable")
302
305
 
303
306
  len_old = self.ds_voltage.shape[0]
304
307
 
@@ -318,7 +321,9 @@ class Writer(Reader):
318
321
  voltage: np.ndarray,
319
322
  current: np.ndarray,
320
323
  ) -> None:
321
- """Writes data (in SI / physical unit) to file, but converts it to raw-data first
324
+ """Write data (provided in SI / physical unit) to file.
325
+
326
+ This will convert it to raw-data first.
322
327
 
323
328
  SI-value [SI-Unit] = raw-value * gain + offset,
324
329
 
@@ -336,7 +341,7 @@ class Writer(Reader):
336
341
  self.append_iv_data_raw(timestamp, voltage, current)
337
342
 
338
343
  def _align(self) -> None:
339
- """Align datasets with buffer-size of shepherd"""
344
+ """Align datasets with buffer-size of shepherd."""
340
345
  self._refresh_file_stats()
341
346
  n_buff = self.ds_voltage.size / self.samples_per_buffer
342
347
  size_new = int(math.floor(n_buff) * self.samples_per_buffer)
@@ -353,21 +358,21 @@ class Writer(Reader):
353
358
  self.ds_current.resize((size_new,))
354
359
 
355
360
  def __setitem__(self, key: str, item: Any) -> None:
356
- """A convenient interface to store relevant key-value data (attribute) if H5-structure"""
361
+ """Conveniently store relevant key-value data (attribute) in H5-structure."""
357
362
  self.h5file.attrs.__setitem__(key, item)
358
363
 
359
364
  def store_config(self, data: dict) -> None:
360
- """Important Step to get a self-describing Output-File
365
+ """Get a better self-describing Output-File.
366
+
361
367
  TODO: use data-model?
362
- :param data: from virtual harvester or converter / source
368
+ :param data: from virtual harvester or converter / source.
363
369
  """
364
- self.h5file["data"].attrs["config"] = yaml.safe_dump(
370
+ self.h5file.attrs["config"] = yaml.safe_dump(
365
371
  data, default_flow_style=False, sort_keys=False
366
372
  )
367
373
 
368
374
  def store_hostname(self, name: str) -> None:
369
- """Option to distinguish the host, target or data-source in the testbed
370
- -> perfect for plotting later
375
+ """Option to distinguish the host, target or data-source -> perfect for plotting later.
371
376
 
372
377
  :param name: something unique, or "artificial" in case of generated content
373
378
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: shepherd_core
3
- Version: 2024.4.1
3
+ Version: 2024.5.1
4
4
  Summary: Programming- and CLI-Interface for the h5-dataformat of the Shepherd-Testbed
5
5
  Author-email: Ingmar Splitt <ingmar.splitt@tu-dresden.de>
6
6
  Maintainer-email: Ingmar Splitt <ingmar.splitt@tu-dresden.de>
@@ -39,6 +39,7 @@ Requires-Dist: intelhex
39
39
  Requires-Dist: requests
40
40
  Requires-Dist: pyelftools
41
41
  Requires-Dist: zstandard
42
+ Requires-Dist: typing-extensions
42
43
  Provides-Extra: dev
43
44
  Requires-Dist: twine ; extra == 'dev'
44
45
  Requires-Dist: pre-commit ; extra == 'dev'
@@ -0,0 +1,75 @@
1
+ shepherd_core/__init__.py,sha256=4NA3rBcPFRofOC838u_oynZbUA60WoPANSpON--HiMM,1385
2
+ shepherd_core/calibration_hw_def.py,sha256=m5HDxHJ_blnn-C0Og5v6by1ApJRDT7RhytFbL-P5730,2548
3
+ shepherd_core/commons.py,sha256=vymKXWcy_1bz7ChzzEATUkJ4p3czCzjIdsSehVjJOY8,218
4
+ shepherd_core/logger.py,sha256=4Q4hTI-nccOZ1_A68fo4UEctfu3pJx3IeHfa9VuDDEo,1804
5
+ shepherd_core/reader.py,sha256=qyc0MBHa-wMGRDglEaMtyB6OxCiODnOMJsxJH8NCcAo,26245
6
+ shepherd_core/writer.py,sha256=xcLCw-YokKaN8TrkwD0IjRmn8xZU0Q8wwWp_1K8JFVY,14475
7
+ shepherd_core/data_models/__init__.py,sha256=IVjKbT2Ilz5bev325EvAuuhd9LfQgQ1u7qKo6dhVA2k,1866
8
+ shepherd_core/data_models/readme.md,sha256=1bdfEypY_0NMhXLxOPRnLAsFca0HuHdq7_01yEWxvUs,2470
9
+ shepherd_core/data_models/virtual_source_doc.txt,sha256=KizMcfGKj7BnHIbaJHT7KeTF01SV__UXv01qV_DGHSs,6057
10
+ shepherd_core/data_models/base/__init__.py,sha256=PSJ6acWViqBm0Eiom8DIgKfFVrp5lzYr8OsDvP79vwI,94
11
+ shepherd_core/data_models/base/cal_measurement.py,sha256=Ie35wWfH4spjETQ6SKHlbY_Ie2Bkt0dIQAKAn4ELOTc,3354
12
+ shepherd_core/data_models/base/calibration.py,sha256=HPhDEaApOCKxfX2q9RD8YCvA3Gqls-2bHqvLLvOM7kY,10415
13
+ shepherd_core/data_models/base/content.py,sha256=13j7GSgT73xn27jgDP508thUEJR4U-nCb5n7CJ50c9Y,2463
14
+ shepherd_core/data_models/base/shepherd.py,sha256=DNrx59o1VBuy_liJuUzZRzmTTYB73D_pUWiNyMQyjYY,6112
15
+ shepherd_core/data_models/base/timezone.py,sha256=2T6E46hJ1DAvmqKfu6uIgCK3RSoAKjGXRyzYNaqKyjY,665
16
+ shepherd_core/data_models/base/wrapper.py,sha256=duOdIXJeSOab4lVhe9ujhnjhJv3ue0mhimuUjy1xy3A,635
17
+ shepherd_core/data_models/content/__init__.py,sha256=wVa5lw6bS-fBgeo-SWydg6rw8AsScxqNgDo81dzteaE,537
18
+ shepherd_core/data_models/content/_external_fixtures.yaml,sha256=0CH7YSWT_hzL-jcg4JjgN9ryQOzbS8S66_pd6GbMnHw,12259
19
+ shepherd_core/data_models/content/energy_environment.py,sha256=HeMcM01fS2YzhvIh5bt6lC9vW2sBrPt7X_jGdEe8k_g,1374
20
+ shepherd_core/data_models/content/energy_environment_fixture.yaml,sha256=UBXTdGT7MK98zx5w_RBCu-f9uNCKxRgiFBQFbmDUxPc,1301
21
+ shepherd_core/data_models/content/firmware.py,sha256=rv5gAOYq4Al-sAg3v5TuYrxONMKLngBsdln3hbmISTA,5659
22
+ shepherd_core/data_models/content/firmware_datatype.py,sha256=XPU9LOoT3h5qFOlE8WU0vAkw-vymNxzor9kVFyEqsWg,255
23
+ shepherd_core/data_models/content/virtual_harvester.py,sha256=5eEHAZrgHPHZlTxDGaJrckDQgupFNC3Zax67EcCSqR8,9448
24
+ shepherd_core/data_models/content/virtual_harvester_fixture.yaml,sha256=-IRyoQU0HXCEtIIcFmkFdz4snLB7bjFFqNcFVGSMiSA,4332
25
+ shepherd_core/data_models/content/virtual_source.py,sha256=aoD8oam1POid0JG2ppttPA_Jl3y4ko5FNqzoaNKyBD8,14142
26
+ shepherd_core/data_models/content/virtual_source_fixture.yaml,sha256=kx_lpBx0bLKqEHxS09GTnk8kuSbhuGhLgKHeaM6UviE,10481
27
+ shepherd_core/data_models/experiment/__init__.py,sha256=9TE9_aSnCNRhagsIWLTE8XkyjyMGB7kEGdswl-296v0,645
28
+ shepherd_core/data_models/experiment/experiment.py,sha256=QX3-oeBe5dRx1a_RHF6kxjdQAyCRcLiMmSw4gYDjbEg,3949
29
+ shepherd_core/data_models/experiment/observer_features.py,sha256=qxnb7anuQz9ZW5IUlPdUXYPIl5U7O9uXkJqZtMnAb0Y,5156
30
+ shepherd_core/data_models/experiment/target_config.py,sha256=XIsjbbo7yn_A4q3GMxWbiNzEGA0Kk5gH7-XfQQ7Kg0E,3674
31
+ shepherd_core/data_models/task/__init__.py,sha256=rZLbgqX-dTWY4026-bqW-IWVHbA6C_xP9y0aeRze8FY,3374
32
+ shepherd_core/data_models/task/emulation.py,sha256=z3BEqERy2m3_rxqKo6w89sSnBQhFwHDEdCgwJh2XUOQ,6376
33
+ shepherd_core/data_models/task/firmware_mod.py,sha256=Rw_TA1ykQ7abUd_U0snqZlpZyrS8Nx6f4BEax1Xnji0,2818
34
+ shepherd_core/data_models/task/harvest.py,sha256=HHnqWwRsJupaZJxuohs7NrK6VaDyoRzGOaG2h9y3s1Y,3360
35
+ shepherd_core/data_models/task/observer_tasks.py,sha256=XlH_-EGRrdodTn0c2pjGvpcauc0a9NOnLhysKw8iRwk,3511
36
+ shepherd_core/data_models/task/programming.py,sha256=6Pmyeze2UxNyyDUACbIL18GzUCN9wn6PuGrYwA2h8VI,2305
37
+ shepherd_core/data_models/task/testbed_tasks.py,sha256=yU4YhNN1ObYkcts7UOwkWWhCmW67f_Gjx3dhvzMnKWI,2036
38
+ shepherd_core/data_models/testbed/__init__.py,sha256=cL3swgijyIpZIW1vl51OVR2seAlWt6Ke9oB_cBkPniU,612
39
+ shepherd_core/data_models/testbed/cape.py,sha256=D23ZKXpZRPIIOMn6LCoJrwHiRbSaYg-y7B6fAt1ap64,1246
40
+ shepherd_core/data_models/testbed/cape_fixture.yaml,sha256=uwZxe6hsqvofn5tzg4sffjbVtTVUkextL1GCri_z2A4,2197
41
+ shepherd_core/data_models/testbed/gpio.py,sha256=m4U8-KotpZbdSkRkXm2GqoADiubr_1-3BWOT1qlgQic,2195
42
+ shepherd_core/data_models/testbed/gpio_fixture.yaml,sha256=yXvoXAau2hancKi2yg1xIkErPWQa6gIxNUG3y8JuF9Y,3076
43
+ shepherd_core/data_models/testbed/mcu.py,sha256=pUyT8gwPcqh18I7FC6iE6gYYISo69TvDfuq2zSwfmxs,1375
44
+ shepherd_core/data_models/testbed/mcu_fixture.yaml,sha256=lRZMLs27cTeERSFGkbMt5xgxbn11Gh9G1mQqOZK136I,522
45
+ shepherd_core/data_models/testbed/observer.py,sha256=AezYNm9mW5WCdxm5TXT-UQUwIhKDHchMIugsLGy1PMA,3225
46
+ shepherd_core/data_models/testbed/observer_fixture.yaml,sha256=w4VS6lTzaVs5IqWjkHanxcjDhIEydQPCV6z_DlsLFqA,4812
47
+ shepherd_core/data_models/testbed/target.py,sha256=KeJaLradQ3oHeeowCg_X0lDHDqyi3R3La0YPKC5Rv90,1838
48
+ shepherd_core/data_models/testbed/target_fixture.yaml,sha256=6YbCV3aTtDUKzC40kPURq9nFwTjT97LNy7imOb_35sk,3668
49
+ shepherd_core/data_models/testbed/testbed.py,sha256=jLgidZMB0LhoP99s_OOADFPZgCipio1q3kLLiXg9Ekw,3353
50
+ shepherd_core/data_models/testbed/testbed_fixture.yaml,sha256=9i2cmYRrHOHTJG9zp40h8h0LgO9DdrCJz8tyGdiQCzc,714
51
+ shepherd_core/decoder_waveform/__init__.py,sha256=-ohGz0fA2tKxUJk4FAQXKtI93d6YGdy0CrkdhOod1QU,120
52
+ shepherd_core/decoder_waveform/uart.py,sha256=sHsXHOsDU1j9zMSZO7CCMTMinT4U_S5NgsEkl1lJK1U,11029
53
+ shepherd_core/fw_tools/__init__.py,sha256=_RZpgHsNN1Zhd-x0-A9aJPI3pjULKhR9iuR9eKPa8zQ,2137
54
+ shepherd_core/fw_tools/converter.py,sha256=3igRT33tghrBCao5njuPmePS-Y_lSa6EUHvwCakMo2s,3539
55
+ shepherd_core/fw_tools/converter_elf.py,sha256=GQDVqIqMW4twNMvZIV3sowFMezhs2TN-IYREjRP7Xt4,1089
56
+ shepherd_core/fw_tools/patcher.py,sha256=D6MHaCvKRRVQYSZozODAp_l7UnqxVsvnulPzpkfXWW8,4108
57
+ shepherd_core/fw_tools/validation.py,sha256=gVyJrNZLSiX9T8vFxH2RfulefTZEvO9Z4t-KCKBxkNk,4790
58
+ shepherd_core/inventory/__init__.py,sha256=nRO11HG4eJ_FaXebSkE0dd1H6qvjrX5n3OQHOzKXVvk,3841
59
+ shepherd_core/inventory/python.py,sha256=OWNnyEt0IDPW9XGW-WloU0FExwgZzYNA05VpRj4cZGc,1250
60
+ shepherd_core/inventory/system.py,sha256=hmUuaeg6_6Xsykp47YAtTeUbDa5B8sxV0EICQJG9rx4,2304
61
+ shepherd_core/inventory/target.py,sha256=Lq11j25tWieXheOxIDaQb-lc-2omxYVex5P6uGiLUyk,507
62
+ shepherd_core/testbed_client/__init__.py,sha256=lzi7F5Go-AsbTbiUCf9Rnu6pzmTZqmpIqoS1yCPal_c,175
63
+ shepherd_core/testbed_client/cache_path.py,sha256=tS0er9on5fw8wddMCt1jkc2uyYOdSTvX_UmfmYJf6tY,445
64
+ shepherd_core/testbed_client/client.py,sha256=3vbJ9XdWe9YA28AXgzXThHJtYJU5RUUCpDRBH1mDIr8,5917
65
+ shepherd_core/testbed_client/fixtures.py,sha256=db10P0c6kJvG525mLZYuFE98kI0PvoA67jeJgCiUaZ4,9782
66
+ shepherd_core/testbed_client/user_model.py,sha256=5M3vWkAGBwdGDUYAanAjrZwpzMBlh3XLOVvNYWiLmms,2107
67
+ shepherd_core/vsource/__init__.py,sha256=dS33KYLq5GQ9_D8HfdP8iWSocWTghCi2ZZG2AJWNfaM,391
68
+ shepherd_core/vsource/virtual_converter_model.py,sha256=ZSoWVLfRmFEjeCNoQCg3BctzhdfayINUBDU_AJK1CR0,10404
69
+ shepherd_core/vsource/virtual_harvester_model.py,sha256=wCbFfsqDRC5Rfu8qANkmkP9XGJOPHJY9-iSnI850JI4,7817
70
+ shepherd_core/vsource/virtual_source_model.py,sha256=fjN8myTY3I_LpikF_aGAcxes3RGu1GP23P7XKC_UIyA,2737
71
+ shepherd_core-2024.5.1.dist-info/METADATA,sha256=b8rOT-zSwCa2jfHdDIj8VHx4_pHJ7Dq0NKXwP-77WWw,7651
72
+ shepherd_core-2024.5.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
73
+ shepherd_core-2024.5.1.dist-info/top_level.txt,sha256=wy-t7HRBrKARZxa-Y8_j8d49oVHnulh-95K9ikxVhew,14
74
+ shepherd_core-2024.5.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
75
+ shepherd_core-2024.5.1.dist-info/RECORD,,
@@ -1,64 +0,0 @@
1
- shepherd_core/__init__.py,sha256=UPDbfToRQ7BvvtGOE2ogINDK22SdlYdS3Z4TQp9JLUI,1358
2
- shepherd_core/calibration_hw_def.py,sha256=VBPgekKtoA6xc5pLOADGdAIuJUNz5kdDf3pm3A13F0U,2158
3
- shepherd_core/commons.py,sha256=8HLrOq30Zrgh0AcrtakJYyu3hwMgQks7mF7JyaBMcdw,170
4
- shepherd_core/logger.py,sha256=mIJQ5eCpamsCnc_R7qoceYVXe8JM4-YZriqfzvTt9Yk,1656
5
- shepherd_core/reader.py,sha256=NPpyMa0aArTyfz1vPHNbIzOGZQxkii96JUMX3jZ6_dY,26082
6
- shepherd_core/writer.py,sha256=VeBqJZYw6M5CeswPaYWWeAjtQ2xH9ROqA6ziEBK-Npg,14355
7
- shepherd_core/data_models/__init__.py,sha256=mem0m4nZY3EgG1ctBdGGGt128lhmglF9a4e5w9OGJu0,1651
8
- shepherd_core/data_models/doc_virtual_source.py,sha256=KizMcfGKj7BnHIbaJHT7KeTF01SV__UXv01qV_DGHSs,6057
9
- shepherd_core/data_models/base/__init__.py,sha256=ugVEWXfYRCmK4o94RG4N_GKR7AbBQLfn5PCbEKVpZMU,44
10
- shepherd_core/data_models/base/cal_measurement.py,sha256=ZlSnHXOiY--AzQ1-g0BnU7I4g9sMDqF3g52jsl5IHDY,2873
11
- shepherd_core/data_models/base/calibration.py,sha256=QTUGpW_YZ4slvfzUwkImp67u13gX90r5ua_qgbVPRXw,9711
12
- shepherd_core/data_models/base/content.py,sha256=oCefaykxq9HnuRe-6ruk_hC96WECZldriBFeX-PBb8M,2254
13
- shepherd_core/data_models/base/shepherd.py,sha256=kasSaMZ2baq160WNJMwEhdko2x13fsWYtE5VfHhg8Fs,5822
14
- shepherd_core/data_models/base/timezone.py,sha256=OBzPPfrD__z1aTO7qlVWD1uD8eZFJ6CoDLac_mTrYCg,443
15
- shepherd_core/data_models/base/wrapper.py,sha256=mzAMdX9-BeSAeTzlWKFnjj3v2wV6NJgaSHULFHEiWes,600
16
- shepherd_core/data_models/content/__init__.py,sha256=JLj2zzjDeyqLrz9KiWDMW1shCeJjj676zjcXj8ly10Y,545
17
- shepherd_core/data_models/content/energy_environment.py,sha256=bH6jB93e_XAAZ_NixNPlF2syEKzRtpMbImA7aD3lyTo,1342
18
- shepherd_core/data_models/content/firmware.py,sha256=cuh8tURI39ZzTF-wuh4ofsNfRC1TK8lHrGKYm-o9SC0,5533
19
- shepherd_core/data_models/content/firmware_datatype.py,sha256=WHVJu-LIP_snjeITIKkuZo7aIapoTIZeFXkUNqyEqy8,154
20
- shepherd_core/data_models/content/virtual_harvester.py,sha256=M23YRfmXPkW145GNFoMHJvsVvJE8wUc_sNOU3OBXZtc,9268
21
- shepherd_core/data_models/content/virtual_source.py,sha256=rBjfX1a22x_JF4MiQiEpaaWz2LVoHplMSrkHQnqHjDQ,13958
22
- shepherd_core/data_models/experiment/__init__.py,sha256=DX9kylCe8zFm4PpVT8YS4csip7-MDoSrdah3nhBdiJE,651
23
- shepherd_core/data_models/experiment/experiment.py,sha256=-qsmogEgHbijxrSfV0mLWj8biOMmDU1sEssZHo97HNI,3912
24
- shepherd_core/data_models/experiment/observer_features.py,sha256=80z_U3fVFagROtMlWy2vZdbLn1-G8fZm9k8rZlyo4Lo,4997
25
- shepherd_core/data_models/experiment/target_config.py,sha256=IBWxf3yVF5dUBi7mS5mJXfN1rL2S7QYhu_4IL6u6Yig,3532
26
- shepherd_core/data_models/task/__init__.py,sha256=g0l4dtIgTPKhfFvnClJrCm3zLFiZpBVbbQ2f4gzdwK0,3180
27
- shepherd_core/data_models/task/emulation.py,sha256=HE7L3GWKdsAkUPgvdDHxYJG92GNodP9CUEtKgQJghjA,6221
28
- shepherd_core/data_models/task/firmware_mod.py,sha256=8uXMFVk3Z96gUW0gVY95VeUx-YtZnMc2yw3paC5S5Mw,2730
29
- shepherd_core/data_models/task/harvest.py,sha256=QcNJjgixiq70NogdcYXwpj91_6Jl7s7CaAnEw_xEWck,3254
30
- shepherd_core/data_models/task/observer_tasks.py,sha256=_fgG_xqPHQN34jdWxXVvtgJuY_05YiLGPftTGtglTfk,3437
31
- shepherd_core/data_models/task/programming.py,sha256=uO6IZR8wb0N3791QgAZE7AF0CB7XoyOkFBiDH395IvE,2244
32
- shepherd_core/data_models/task/testbed_tasks.py,sha256=5T_aTUE6Fby-TG5ZZAcqXVolzs4oCQ_ttNXoinREE4U,1966
33
- shepherd_core/data_models/testbed/__init__.py,sha256=kQG0EUqJ5ylGRuwYZTbppWue9zDcSytpsHtUnohbGgA,566
34
- shepherd_core/data_models/testbed/cape.py,sha256=_u38jvy_7yv_J3HSjGblwZXX3iOm0JF7IpTEkF9zhyg,1140
35
- shepherd_core/data_models/testbed/gpio.py,sha256=9LlaxsWzEnjwaCobO-YcCWi1HZ67OsPKg5ExvtnVglQ,2086
36
- shepherd_core/data_models/testbed/mcu.py,sha256=enaKdwgmasJuyHlru3UqMIA-mUq1xAoafqAgzVITxoU,1287
37
- shepherd_core/data_models/testbed/observer.py,sha256=OjdvVa6uxreqIV9VM8jK1OM-RPsH4FGbKklY25_oTqg,3096
38
- shepherd_core/data_models/testbed/target.py,sha256=bKrPpVcdUNYcpEudbySQ6mPFibedeNsPy9kzUMu-Um0,1762
39
- shepherd_core/data_models/testbed/testbed.py,sha256=dR4yEwQKSMSXSGyPsuQ7zG2cp2LqCAQZjAzmuFOWvJo,3260
40
- shepherd_core/decoder_waveform/__init__.py,sha256=HEdjRcm3m4ySEXpJ_D3lZqnxiuobJqC8axZAaAHBwDk,43
41
- shepherd_core/decoder_waveform/uart.py,sha256=M4k5ymWeGP28i-_tl2FMG0YivY_WGpiZN2JOwSzlSBQ,10672
42
- shepherd_core/fw_tools/__init__.py,sha256=9W-MXU5j3iJ8AgRzoGUaljD0bN29jh8LtY-pyj5HWbY,2071
43
- shepherd_core/fw_tools/converter.py,sha256=2g0CZBZLn-CfUTpJljghf8AEpjIt4X7Q1FoCTsmx3A0,3273
44
- shepherd_core/fw_tools/converter_elf.py,sha256=SEkrPuYUsr1VICDlZiZzr0B1njWcl9mW3J_oZk32Sb4,1008
45
- shepherd_core/fw_tools/patcher.py,sha256=nXgYKGQjcEE4IYd8yNl4-t5kjlB43iFdp24oYlEaras,3774
46
- shepherd_core/fw_tools/validation.py,sha256=pdZ4Q7_GyMUarELBt3OOTPIqZIGtDF3MBqOhlF75n4E,4261
47
- shepherd_core/inventory/__init__.py,sha256=vTeAXOHk3paE3McpWQNBlsll40wY-IQT8alPh3n_1dE,3690
48
- shepherd_core/inventory/python.py,sha256=Ar_M4cmmQgViY4caU5XH9Iye5X3jNFDnJiWGaZwNpo4,1168
49
- shepherd_core/inventory/system.py,sha256=lD70oYMF0dPDvYDglhYIXIfjEFtxVoY9Zhoiwvj-oo0,2181
50
- shepherd_core/inventory/target.py,sha256=XywiKmDpYKIBQt1Jo_k3bJeCOKxnzy5ob_9PYdFrjGE,421
51
- shepherd_core/testbed_client/__init__.py,sha256=V38uxXOhwB8tlAjR0jH1MPSWB1LltwC0g8ipwaIyC9o,103
52
- shepherd_core/testbed_client/cache_path.py,sha256=ZAoYi0je5Bg6fcP_OJa32zL6rXNPL5Ef-8vSungW9_M,401
53
- shepherd_core/testbed_client/client.py,sha256=83RynaL7MiezZky-Iw-K6m8QWqRV4hAHW8awKNcTUFk,5776
54
- shepherd_core/testbed_client/fixtures.py,sha256=vhSYWd3OgMP4fL5I_n1Y6flR68aSJlJnR6yFwX-D38Y,9233
55
- shepherd_core/testbed_client/user_model.py,sha256=6HfDSRs4WgttEA1znVLdNwV8Pv7R_0YKxK0b30hr6mQ,2026
56
- shepherd_core/vsource/__init__.py,sha256=x84_0M8Dg8R7DLKE5zyNAAGFiuOHPehDOWPt2KeBhKw,344
57
- shepherd_core/vsource/virtual_converter_model.py,sha256=DCNf-O3gFmU1DIbZkESNvveCJ5sN-5dZoqAxBUogzO4,10332
58
- shepherd_core/vsource/virtual_harvester_model.py,sha256=MoMa2S0VKfK1Q8fZ9CEx7sNnr3b3ae8M4YhsyY5DSgY,7764
59
- shepherd_core/vsource/virtual_source_model.py,sha256=5AcNG7s_GqGn4hTzCWKTz0CNIBjF8g3YsZtc8HF0D5Q,2724
60
- shepherd_core-2024.4.1.dist-info/METADATA,sha256=G0Lc2ETRLVsNDAKlpq3Od7xYsClqjbwjJiYyeEwFiv0,7618
61
- shepherd_core-2024.4.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
62
- shepherd_core-2024.4.1.dist-info/top_level.txt,sha256=wy-t7HRBrKARZxa-Y8_j8d49oVHnulh-95K9ikxVhew,14
63
- shepherd_core-2024.4.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
64
- shepherd_core-2024.4.1.dist-info/RECORD,,