MTPPy2.0 0.1.5__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 (214) hide show
  1. examples/__init__.py +0 -0
  2. examples/minimal+pid.py +82 -0
  3. examples/minimal.py +32 -0
  4. examples/minimal_recipe.py +117 -0
  5. examples/pea_alarm_base.py +47 -0
  6. examples/pea_minimal.py +258 -0
  7. mtppy/__init__.py +1 -0
  8. mtppy/part1/__init__.py +4 -0
  9. mtppy/part1/empty_folder_test.py +7 -0
  10. mtppy/part3/__init__.py +4 -0
  11. mtppy/part3/data_assembly_set/__init__.py +4 -0
  12. mtppy/part3/data_assembly_set/active_elements/__init__.py +4 -0
  13. mtppy/part3/data_assembly_set/active_elements/active_element.py +22 -0
  14. mtppy/part3/data_assembly_set/active_elements/drives/__init__.py +4 -0
  15. mtppy/part3/data_assembly_set/active_elements/drives/ana_drv.py +446 -0
  16. mtppy/part3/data_assembly_set/active_elements/drives/ana_drv_test.py +567 -0
  17. mtppy/part3/data_assembly_set/active_elements/drives/bin_drv.py +365 -0
  18. mtppy/part3/data_assembly_set/active_elements/drives/bin_drv_test.py +503 -0
  19. mtppy/part3/data_assembly_set/active_elements/drives/mon_ana_drv.py +469 -0
  20. mtppy/part3/data_assembly_set/active_elements/drives/mon_ana_drv_test.py +418 -0
  21. mtppy/part3/data_assembly_set/active_elements/drives/mon_bin_drv.py +295 -0
  22. mtppy/part3/data_assembly_set/active_elements/drives/mon_bin_drv_test.py +265 -0
  23. mtppy/part3/data_assembly_set/active_elements/pid/__init__.py +4 -0
  24. mtppy/part3/data_assembly_set/active_elements/pid/pid_ctrl.py +333 -0
  25. mtppy/part3/data_assembly_set/active_elements/pid/pid_ctrl_test.py +156 -0
  26. mtppy/part3/data_assembly_set/active_elements/valves/__init__.py +4 -0
  27. mtppy/part3/data_assembly_set/active_elements/valves/ana_vlv.py +402 -0
  28. mtppy/part3/data_assembly_set/active_elements/valves/ana_vlv_test.py +732 -0
  29. mtppy/part3/data_assembly_set/active_elements/valves/bin_vlv.py +279 -0
  30. mtppy/part3/data_assembly_set/active_elements/valves/bin_vlv_test.py +585 -0
  31. mtppy/part3/data_assembly_set/active_elements/valves/mon_ana_vlv.py +402 -0
  32. mtppy/part3/data_assembly_set/active_elements/valves/mon_ana_vlv_test.py +270 -0
  33. mtppy/part3/data_assembly_set/active_elements/valves/mon_bin_vlv.py +286 -0
  34. mtppy/part3/data_assembly_set/active_elements/valves/mon_bin_vlv_test.py +224 -0
  35. mtppy/part3/data_assembly_set/base_functions/__init__.py +4 -0
  36. mtppy/part3/data_assembly_set/base_functions/operation_mode.py +252 -0
  37. mtppy/part3/data_assembly_set/base_functions/operation_mode_test.py +260 -0
  38. mtppy/part3/data_assembly_set/base_functions/oslevel.py +35 -0
  39. mtppy/part3/data_assembly_set/base_functions/source_mode.py +189 -0
  40. mtppy/part3/data_assembly_set/base_functions/source_mode_test.py +112 -0
  41. mtppy/part3/data_assembly_set/base_functions/wqc.py +75 -0
  42. mtppy/part3/data_assembly_set/base_functions/wqc_test.py +86 -0
  43. mtppy/part3/data_assembly_set/data_assembly.py +65 -0
  44. mtppy/part3/data_assembly_set/diagnostic_elements/__init__.py +4 -0
  45. mtppy/part3/data_assembly_set/diagnostic_elements/diagnostic_element.py +19 -0
  46. mtppy/part3/data_assembly_set/indicator_elements/__init__.py +4 -0
  47. mtppy/part3/data_assembly_set/indicator_elements/indicator_element.py +22 -0
  48. mtppy/part3/data_assembly_set/indicator_elements/views/__init__.py +4 -0
  49. mtppy/part3/data_assembly_set/indicator_elements/views/ana_view.py +68 -0
  50. mtppy/part3/data_assembly_set/indicator_elements/views/bin_view.py +73 -0
  51. mtppy/part3/data_assembly_set/indicator_elements/views/dint_view.py +76 -0
  52. mtppy/part3/data_assembly_set/indicator_elements/views/string_view.py +55 -0
  53. mtppy/part3/data_assembly_set/operation_elements/__init__.py +4 -0
  54. mtppy/part3/data_assembly_set/operation_elements/operation_element.py +19 -0
  55. mtppy/part3/data_assembly_set/pea_elements/__init__.py +4 -0
  56. mtppy/part3/data_assembly_set/pea_elements/pea_element.py +28 -0
  57. mtppy/part3/data_assembly_set/pea_elements/pea_information_label/__init__.py +4 -0
  58. mtppy/part3/data_assembly_set/pea_elements/pea_information_label/pea_information_label.py +231 -0
  59. mtppy/part3/data_assembly_set/pea_elements/web_server_url_info/__init__.py +4 -0
  60. mtppy/part3/data_assembly_set/pea_elements/web_server_url_info/web_server_url_info.py +42 -0
  61. mtppy/part3/definitions/__init__.py +4 -0
  62. mtppy/part3/definitions/mtp_access.py +15 -0
  63. mtppy/part4/__init__.py +4 -0
  64. mtppy/part4/automation_services/__init__.py +4 -0
  65. mtppy/part4/automation_services/base_functions/__init__.py +4 -0
  66. mtppy/part4/automation_services/base_functions/service_operation_mode.py +368 -0
  67. mtppy/part4/automation_services/base_functions/service_operation_mode_test.py +242 -0
  68. mtppy/part4/automation_services/base_functions/service_operator_interaction.py +62 -0
  69. mtppy/part4/automation_services/base_functions/service_source_mode.py +138 -0
  70. mtppy/part4/automation_services/base_functions/service_source_mode_test.py +179 -0
  71. mtppy/part4/automation_services/helpers/__init__.py +4 -0
  72. mtppy/part4/automation_services/helpers/command_en_control.py +330 -0
  73. mtppy/part4/automation_services/helpers/command_en_control_test.py +302 -0
  74. mtppy/part4/automation_services/helpers/state_machine.py +167 -0
  75. mtppy/part4/automation_services/helpers/state_machine_test.py +294 -0
  76. mtppy/part4/automation_services/helpers/thread_control.py +39 -0
  77. mtppy/part4/automation_services/helpers/thread_control_test.py +80 -0
  78. mtppy/part4/automation_services/procedure.py +111 -0
  79. mtppy/part4/automation_services/procedure_test.py +185 -0
  80. mtppy/part4/automation_services/service.py +463 -0
  81. mtppy/part4/automation_services/service_elements/__init__.py +4 -0
  82. mtppy/part4/automation_services/service_elements/parameter_elements/__init__.py +4 -0
  83. mtppy/part4/automation_services/service_elements/parameter_elements/ana_serv_param.py +108 -0
  84. mtppy/part4/automation_services/service_elements/parameter_elements/ana_serv_param_test.py +59 -0
  85. mtppy/part4/automation_services/service_elements/parameter_elements/bin_serv_param.py +70 -0
  86. mtppy/part4/automation_services/service_elements/parameter_elements/bin_serv_param_test.py +39 -0
  87. mtppy/part4/automation_services/service_elements/parameter_elements/common_serv_param.py +111 -0
  88. mtppy/part4/automation_services/service_elements/parameter_elements/dint_serv_param.py +77 -0
  89. mtppy/part4/automation_services/service_elements/parameter_elements/dint_serv_param_test.py +58 -0
  90. mtppy/part4/automation_services/service_elements/parameter_elements/parameter_element.py +175 -0
  91. mtppy/part4/automation_services/service_elements/parameter_elements/parameter_element_test.py +246 -0
  92. mtppy/part4/automation_services/service_elements/parameter_elements/string_serv_param.py +48 -0
  93. mtppy/part4/automation_services/service_elements/parameter_elements/string_serv_param_test.py +37 -0
  94. mtppy/part4/automation_services/service_elements/procedure_health_view.py +36 -0
  95. mtppy/part4/automation_services/service_elements/service_control.py +473 -0
  96. mtppy/part4/automation_services/service_elements/service_control_test.py +150 -0
  97. mtppy/part4/automation_services/service_elements/service_element.py +20 -0
  98. mtppy/part4/automation_services/service_test.py +407 -0
  99. mtppy/part4/definitions/__init__.py +4 -0
  100. mtppy/part4/definitions/command_codes.py +58 -0
  101. mtppy/part4/definitions/command_codes_test.py +44 -0
  102. mtppy/part4/definitions/state_codes.py +65 -0
  103. mtppy/part4/definitions/state_codes_test.py +44 -0
  104. mtppy/part4/process_values/__init__.py +4 -0
  105. mtppy/part4/process_values/base_functions/__init__.py +4 -0
  106. mtppy/part4/process_values/base_functions/vqc.py +48 -0
  107. mtppy/part4/process_values/input_elements/__init__.py +4 -0
  108. mtppy/part4/process_values/input_elements/ana_process_value_in.py +160 -0
  109. mtppy/part4/process_values/input_elements/bin_process_value_in.py +83 -0
  110. mtppy/part4/process_values/input_elements/dint_process_value_in.py +159 -0
  111. mtppy/part4/process_values/input_elements/input_element.py +40 -0
  112. mtppy/part4/process_values/input_elements/string_process_value_in.py +45 -0
  113. mtppy/part5/__init__.py +4 -0
  114. mtppy/part5/communication_object.py +99 -0
  115. mtppy/part5/communication_object_test.py +59 -0
  116. mtppy/part5/definitions/__init__.py +4 -0
  117. mtppy/part5/definitions/iec61131_data_types.py +31 -0
  118. mtppy/part5/definitions/iec61131_data_types_test.py +82 -0
  119. mtppy/part5/definitions/opcua_data_types.py +36 -0
  120. mtppy/part5/definitions/opcua_data_types_test.py +90 -0
  121. mtppy/part5/definitions/w3c_xml_data_types.py +177 -0
  122. mtppy/part5/definitions/w3c_xml_data_types_test.py +143 -0
  123. mtppy/part5/server_assembly_set/__init__.py +5 -0
  124. mtppy/part6/__init__.py +4 -0
  125. mtppy/part6/alarm_set/__init__.py +4 -0
  126. mtppy/part6/alarm_set/alarm.py +132 -0
  127. mtppy/part6/alarm_set/alarm_test.py +265 -0
  128. mtppy/pea/__init__.py +19 -0
  129. mtppy/pea/data_assembly_factory.py +124 -0
  130. mtppy/pea/data_assembly_factory_test.py +229 -0
  131. mtppy/pea/mtp_generator/__init__.py +4 -0
  132. mtppy/pea/mtp_generator/mtp_generator.py +1183 -0
  133. mtppy/pea/mtp_generator/mtp_generator_test.py +518 -0
  134. mtppy/pea/pea.py +139 -0
  135. mtppy/pea/pea_opcua_server/__init__.py +4 -0
  136. mtppy/pea/pea_opcua_server/marshalling.py +60 -0
  137. mtppy/pea/pea_opcua_server/opcua_options_provider/__init__.py +4 -0
  138. mtppy/pea/pea_opcua_server/opcua_options_provider/instances/basic_opcua_options_provider.py +50 -0
  139. mtppy/pea/pea_opcua_server/opcua_options_provider/opcua_options_provider.py +103 -0
  140. mtppy/pea/pea_opcua_server/pea_opcua_server.py +492 -0
  141. mtppy/pea/pea_opcua_server/subscription_list.py +55 -0
  142. mtppy/pea/pea_test.py +59 -0
  143. mtppy/pea/rmtp_pea.py +155 -0
  144. mtppy/pea/rmtp_pea_test.py +27 -0
  145. mtppy/pea/service_factory.py +178 -0
  146. mtppy/pea/service_factory_test.py +156 -0
  147. mtppy/pea/user_logic/__init__.py +4 -0
  148. mtppy/pea/user_logic/user_logic_pea.py +72 -0
  149. mtppy/pea/user_logic/user_logic_registry.py +106 -0
  150. mtppy/pea/user_logic/user_logic_registry_test.py +167 -0
  151. mtppy/pea/user_logic/user_logic_service.py +228 -0
  152. mtppy/pea/user_logic/user_logic_service_test.py +289 -0
  153. mtppy/utils/__init__.py +4 -0
  154. mtppy/utils/data_assembly_dict.py +61 -0
  155. mtppy/utils/data_assembly_dict_test.py +107 -0
  156. mtppy/utils/data_item.py +446 -0
  157. mtppy/utils/data_item_com_test.py +82 -0
  158. mtppy/utils/data_item_test.py +325 -0
  159. mtppy/utils/logging.py +23 -0
  160. mtppy/utils/logging_test.py +26 -0
  161. mtppy/utils/mtp_file_handling/__init__.py +4 -0
  162. mtppy/utils/mtp_file_handling/extract_manifest_from_mtp_file.py +22 -0
  163. mtppy/utils/mtp_file_handling/extract_mtp_file.py +22 -0
  164. mtppy/utils/mtp_file_handling/is_valid_mtp.py +22 -0
  165. mtppy/utils/mtp_file_handling/is_valid_path_for_manifest.py +15 -0
  166. mtppy/utils/mtp_file_handling/is_valid_path_to_manifest.py +17 -0
  167. mtppy/utils/mtp_file_handling/is_valid_path_to_mtp.py +17 -0
  168. mtppy/utils/mtp_file_handling/load_manifest_file.py +24 -0
  169. mtppy/utils/mtp_file_handling/mtp_reader/__init__.py +4 -0
  170. mtppy/utils/mtp_file_handling/mtp_reader/mtp_reader.py +103 -0
  171. mtppy/utils/mtp_file_handling/mtp_reader/mtp_reader_test.py +96 -0
  172. mtppy/utils/mtp_file_handling/mtp_reader/mtp_xml.py +226 -0
  173. mtppy/utils/mtp_file_handling/mtp_reader/mtp_xml_test.py +108 -0
  174. mtppy/utils/mtp_file_handling/mtp_writer/__init__.py +4 -0
  175. mtppy/utils/mtp_file_handling/mtp_writer/mtp_writer.py +77 -0
  176. mtppy/utils/mtp_file_handling/mtp_writer/ressources/get_content_types.py +10 -0
  177. mtppy/utils/mtp_file_handling/mtp_writer/ressources/get_rels.py +11 -0
  178. mtppy/utils/mtp_file_handling/mtp_writer/test_mtp_writer.py +25 -0
  179. mtppy/utils/mtp_file_handling/write_manifest_file.py +29 -0
  180. mtppy/utils/mtp_file_handling/write_manifest_file_test.py +22 -0
  181. mtppy/utils/mtp_file_handling/write_mtp_file.py +43 -0
  182. mtppy/utils/mtp_file_handling/write_mtp_file_test.py +22 -0
  183. mtppy/utils/testing.py +31 -0
  184. mtppy2_0-0.1.5.dist-info/METADATA +75 -0
  185. mtppy2_0-0.1.5.dist-info/RECORD +214 -0
  186. mtppy2_0-0.1.5.dist-info/WHEEL +5 -0
  187. mtppy2_0-0.1.5.dist-info/entry_points.txt +3 -0
  188. mtppy2_0-0.1.5.dist-info/licenses/LICENSE +21 -0
  189. mtppy2_0-0.1.5.dist-info/top_level.txt +4 -0
  190. tools/__init__.py +0 -0
  191. tools/create_bugreport.py +150 -0
  192. tools/inspect_mtp.py +110 -0
  193. utils/__init__.py +1 -0
  194. utils/file_handling/__init__.py +4 -0
  195. utils/file_handling/cleanup_folder.py +9 -0
  196. utils/file_handling/get_utc_foldername_with_ms.py +15 -0
  197. utils/file_handling/get_work_dir.py +9 -0
  198. utils/file_handling/is_valid_path_for_json.py +11 -0
  199. utils/file_handling/is_valid_path_to_json.py +17 -0
  200. utils/file_handling/load_json_file.py +18 -0
  201. utils/file_handling/read_file_from_file_archive.py +43 -0
  202. utils/file_handling/read_file_string.py +10 -0
  203. utils/file_handling/validate_json_data.py +28 -0
  204. utils/file_handling/write_json_file.py +23 -0
  205. utils/get_uuid.py +18 -0
  206. utils/get_uuid_test.py +17 -0
  207. utils/logging.py +100 -0
  208. utils/logging_test.py +67 -0
  209. utils/opcua/check_node.py +79 -0
  210. utils/resolve_unit/resolve_unit.py +11 -0
  211. utils/resolve_unit/unit_lib.py +2101 -0
  212. utils/resolve_unit/unit_lib_test.py +36 -0
  213. utils/type_conversion.py +236 -0
  214. utils/type_conversion_test.py +114 -0
@@ -0,0 +1,22 @@
1
+ """test suite for writing mtp files."""
2
+
3
+ __copyright__ = (
4
+ "Copyright (c) 2026 Dresden University of Technology, Process-to-Order Group"
5
+ )
6
+ __license__ = "MIT"
7
+
8
+ from mtppy.utils.mtp_file_handling.write_mtp_file import write_mtp_file
9
+ from utils.file_handling.cleanup_folder import cleanup_folder
10
+ from utils.file_handling.get_work_dir import get_work_dir
11
+
12
+
13
+ def test_write_mtp_file():
14
+ extract_folder = get_work_dir()
15
+ write_mtp_file(
16
+ f"{extract_folder}/out.mtp",
17
+ {
18
+ "is_valid_path_for_json.py": "C:/Users/juliu/Desktop/Repositories/mtpPy2/MTPPy2/src/utils/json/is_valid_path_for_json.py",
19
+ },
20
+ ["C:/Users/juliu/Desktop/Repositories/mtpPy2/MTPPy2/src/utils/json"],
21
+ )
22
+ cleanup_folder(extract_folder)
mtppy/utils/testing.py ADDED
@@ -0,0 +1,31 @@
1
+ """**testing** provides repeated pieces of codes used in testing."""
2
+
3
+ __copyright__ = (
4
+ "Copyright (c) 2026 Dresden University of Technology, Process-to-Order Group"
5
+ )
6
+ __license__ = "MIT"
7
+
8
+
9
+ def data_object_set_modes(
10
+ instance: object, init_op_mode: str, init_src_mode: str,
11
+ ) -> None:
12
+ """Set initial mode of ActiveElement instance to a certain state."""
13
+ if init_op_mode == "op":
14
+ instance.op_mode._opmode_to_op()
15
+ elif init_op_mode == "aut":
16
+ instance.op_mode._opmode_to_op()
17
+ instance.op_mode._opmode_to_aut()
18
+ elif init_op_mode == "off":
19
+ instance.op_mode._opmode_to_op()
20
+ instance.op_mode._opmode_to_off()
21
+ else:
22
+ message = f"Operation Mode {init_op_mode} is unknown"
23
+ raise ValueError(message)
24
+
25
+ if init_src_mode == "man":
26
+ instance.src_mode._src_to_man()
27
+ elif init_src_mode == "int":
28
+ instance.src_mode._src_to_int()
29
+ else:
30
+ message = f"Source Mode {init_src_mode} is unknown"
31
+ raise ValueError(message)
@@ -0,0 +1,75 @@
1
+ Metadata-Version: 2.4
2
+ Name: MTPPy2.0
3
+ Version: 0.1.5
4
+ Summary: Open-source modular automation with MTP 2.0
5
+ Author: Dresden University of Technology, Process-to-Order Group
6
+ Author-email: Julius Lorenz <julius.lorenz@tu-dresden.de>, Leon Urbas <leon.urbas@tu-dresden.de>
7
+ License-Expression: MIT
8
+ Project-URL: Homepage, https://gitlab.hrz.tu-chemnitz.de/process-to-order-group/mtppy2.0
9
+ Project-URL: Issues, https://gitlab.hrz.tu-chemnitz.de/process-to-order-group/mtppy2.0/-/boards
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Intended Audience :: Education
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: Intended Audience :: Manufacturing
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Topic :: Scientific/Engineering
18
+ Requires-Python: >=3.13
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE
21
+ Requires-Dist: opcua~=0.98.13
22
+ Requires-Dist: jsonschema>=4.26.0
23
+ Requires-Dist: chardet>=7.6.0
24
+ Requires-Dist: simple-pid>=2.0.1
25
+ Requires-Dist: pymodbus>=3.15.0
26
+ Dynamic: license-file
27
+
28
+ # MTPPy2.0
29
+
30
+ MTPPy2.0 is a redesign and evolution of the famous MTPPy1.0 repository. The objectives of this project are to provide
31
+
32
+ 1. a playground that helps to getting started with the MTP, and
33
+ 2. a reference implementation for the MTP 2.0 which allows discussions on the advancement of the specification based on accessible and sharable evidence and experience.
34
+
35
+ Towards that end MTPPy2.0 implements several parts of the PNO MTP 2.0 specification, namely Part 1 (Definitions), Part 3 (Data Object Library), Part 4 (Services), and an initial static `AlarmSet.Base` subset of Part 6 (Alarms and Events). See the [docs](https://aas-demo.p2o-lab.ifa.et.tu-dresden.de/mtppy2.0/index.html) for further details.
36
+
37
+ ## Status
38
+ [![Latest Release](https://gitlab.hrz.tu-chemnitz.de/process-to-order-group/mtppy2.0/-/badges/release.svg)](https://gitlab.hrz.tu-chemnitz.de/process-to-order-group/mtppy2.0/-/releases)
39
+ [![coverage report](https://gitlab.hrz.tu-chemnitz.de/process-to-order-group/mtppy2.0/badges/main/coverage.svg)](https://gitlab.hrz.tu-chemnitz.de/process-to-order-group/mtppy2.0/-/commits/main)
40
+
41
+ ## License
42
+ MTPPy2.0 is licensed under the [MIT license](./LICENSE).
43
+
44
+ ## Getting Started
45
+
46
+ ### End-Users
47
+ - create a virtual environment and install the MTTPy package from PyPI
48
+ ```shell
49
+ uv init
50
+ uv add MTPPy2.0
51
+ ```
52
+ - Visit the [tutorial](https://aas-demo.p2o-lab.ifa.et.tu-dresden.de/mtppy2.0/tutorial/)
53
+ that allows you to dive right in into PEA development without needing to
54
+ read 10000+ pages of specification.
55
+ - Have fun and support the MTP community with your feedback.
56
+
57
+ ### Developers
58
+ - Check out ``main`` from the [gitlab repository](https://gitlab.hrz.tu-chemnitz.de/process-to-order-group/mtppy2.0)
59
+ - Run `uv sync --all-groups` to setup the virtual environment `mtppy2-0` and install
60
+ all the required packages for running and development
61
+ - You might want to inspect the examples in ``./examples`` and perhaps the jupyter-notebook snippets in
62
+ ``./snippets``
63
+
64
+ ### Contributors
65
+ - Check out ``next_release`` from the [gitlab repository](https://gitlab.hrz.tu-chemnitz.de/process-to-order-group/mtppy2.0)
66
+ - Run `uv sync --all-groups` to to setup the virtual environment `mtppy2-0` and install
67
+ all the required packages for running and development
68
+ - Study the [developer handbook](https://aas-demo.p2o-lab.ifa.et.tu-dresden.de/mtppy2.0/developer/developer/)
69
+ - Feel invited to contribute by
70
+ - joining the development on a certain [branch](https://gitlab.hrz.tu-chemnitz.de/process-to-order-group/mtppy2.0/-/branches), or by
71
+ - selecting an [open issue](https://gitlab.hrz.tu-chemnitz.de/process-to-order-group/mtppy2.0/-/boards?milestone_title=Started&types=ISSUE) an creating a branch
72
+
73
+
74
+
75
+
@@ -0,0 +1,214 @@
1
+ examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ examples/minimal+pid.py,sha256=rGSYwWz_z6Z8hhJw448LXVlFiFcOiePvKW9mAlZKudk,2384
3
+ examples/minimal.py,sha256=bMLtEfAVn_6xp8WYbb5rAMyxCQtcdst88oBer3q64zQ,979
4
+ examples/minimal_recipe.py,sha256=YOZu85Z7itPRsUX-UKRPlzdcdGGxWkfApoikEDSFqi0,3389
5
+ examples/pea_alarm_base.py,sha256=tY8VuN456dHKkZrrZ2cq1jXoT4YdlzQcDaQ2zllBu3A,1299
6
+ examples/pea_minimal.py,sha256=8s-gJIroG3Q8S_mw_Pxy5vzsMSUIVXfuojm8L--DdNA,7458
7
+ mtppy/__init__.py,sha256=8sGE31KO-DzdioQZ2J7tZ-GG2VwZjYHpfIX2_sBl6H0,21
8
+ mtppy/part1/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
9
+ mtppy/part1/empty_folder_test.py,sha256=0so9Vprhlsyl7hCBuHbs7QX6JCuDUJc-B4gSk6G27Tg,164
10
+ mtppy/part3/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
11
+ mtppy/part3/data_assembly_set/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
12
+ mtppy/part3/data_assembly_set/data_assembly.py,sha256=Yx7TivIL-5marZJhHy-vl5lhBf6qgFy7nstktOXvvmA,2187
13
+ mtppy/part3/data_assembly_set/active_elements/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
14
+ mtppy/part3/data_assembly_set/active_elements/active_element.py,sha256=Yhv3bkTWIe_Ao_xtHjeVLuS4hlt4vyD_W3H7PZCcFc0,765
15
+ mtppy/part3/data_assembly_set/active_elements/drives/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
16
+ mtppy/part3/data_assembly_set/active_elements/drives/ana_drv.py,sha256=ndP-iggmO9ona_BNSbOTyf22qoRcgSU2QvyAtte4jMs,15758
17
+ mtppy/part3/data_assembly_set/active_elements/drives/ana_drv_test.py,sha256=2Vq5bMi-LayGE8cr_c1rxmyL54BZRYXAkFthGZGNZPU,20545
18
+ mtppy/part3/data_assembly_set/active_elements/drives/bin_drv.py,sha256=bOrz9hBKRSfdwt7gxdNL4xDBE_DnX5Ra-cDh0kriopQ,13164
19
+ mtppy/part3/data_assembly_set/active_elements/drives/bin_drv_test.py,sha256=p8BnE798FF8YvAfLsIZbVMbHPoq9qZQqyZe0XXwehZc,18894
20
+ mtppy/part3/data_assembly_set/active_elements/drives/mon_ana_drv.py,sha256=AbMR2SyQ3FFHiMax60jSgBTZ3Eh-1ZTvF0f1kfKd_gg,16029
21
+ mtppy/part3/data_assembly_set/active_elements/drives/mon_ana_drv_test.py,sha256=qWIscMx9p6FZ_G1l12-JwQI0dCi_OMYm9Z9uKS4B2yo,14354
22
+ mtppy/part3/data_assembly_set/active_elements/drives/mon_bin_drv.py,sha256=3x4li9SbwTfVp9UN2CrBeOSwi7MFb4jt_geJq1Qd4Ko,10807
23
+ mtppy/part3/data_assembly_set/active_elements/drives/mon_bin_drv_test.py,sha256=RZ-Wo4lI9u4xP7g9iP5jEt-P41EamaoC7-7GSlq3LOw,9068
24
+ mtppy/part3/data_assembly_set/active_elements/pid/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
25
+ mtppy/part3/data_assembly_set/active_elements/pid/pid_ctrl.py,sha256=D6yE9D8b-dArsvK47P82F6LhtY-WxOxt1UWnIiJfALM,11142
26
+ mtppy/part3/data_assembly_set/active_elements/pid/pid_ctrl_test.py,sha256=rzYegrfr-OcXFHG9PqRRa-1MFPzvxiH_QbU326ENto4,5541
27
+ mtppy/part3/data_assembly_set/active_elements/valves/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
28
+ mtppy/part3/data_assembly_set/active_elements/valves/ana_vlv.py,sha256=WYG3N53ODAaymE91TGcafK1E1Ex663ElDfs3pWoQYqA,14321
29
+ mtppy/part3/data_assembly_set/active_elements/valves/ana_vlv_test.py,sha256=onwOrlZ9qaq4DuN8se6ANfkhbNGrlpqcV-u5j217rD8,27812
30
+ mtppy/part3/data_assembly_set/active_elements/valves/bin_vlv.py,sha256=ByEdBwjw5fCP8enZvVoMI5k-ds3YlTwO7z2uj6O4ivg,9708
31
+ mtppy/part3/data_assembly_set/active_elements/valves/bin_vlv_test.py,sha256=jSAYPe0OpO3TyIOzXMCrp5NOVVRs4rrISoBo50z8QCs,22501
32
+ mtppy/part3/data_assembly_set/active_elements/valves/mon_ana_vlv.py,sha256=s-9lN-gmdGVJQ6_H2X2x83hFNYYceM8EQsywZQV234g,14721
33
+ mtppy/part3/data_assembly_set/active_elements/valves/mon_ana_vlv_test.py,sha256=x3rR2uGLI7cQuUuzs1dfuMS_GBP9LXA-5vy3E6MRzt4,9720
34
+ mtppy/part3/data_assembly_set/active_elements/valves/mon_bin_vlv.py,sha256=nnB8YNbFNLq2RRtSxIyYdkykbIi7VFnJqvU0cqpDbz4,10303
35
+ mtppy/part3/data_assembly_set/active_elements/valves/mon_bin_vlv_test.py,sha256=9RK_nhDlm0sMMgXw3B1tbtxLeO92GJZk210G1C8NhzU,8269
36
+ mtppy/part3/data_assembly_set/base_functions/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
37
+ mtppy/part3/data_assembly_set/base_functions/operation_mode.py,sha256=yzOG2xBT_IB_wjFXN-U0hnX18zaFhnMXHrHDj-EK7F4,10194
38
+ mtppy/part3/data_assembly_set/base_functions/operation_mode_test.py,sha256=8or9w7p0NOoOt1R9PnfNfRALlsNPHUVD-Hch0uZQeOA,9698
39
+ mtppy/part3/data_assembly_set/base_functions/oslevel.py,sha256=N8niW2LEpfWqn_aGunsrDGV2PHm1LaUkdisPL_p8dlw,974
40
+ mtppy/part3/data_assembly_set/base_functions/source_mode.py,sha256=naWjmuIWY1S9UUN36-Ij2H8I7_ckaagY3nyTSYm5TuU,6695
41
+ mtppy/part3/data_assembly_set/base_functions/source_mode_test.py,sha256=ACyMVKbWSoag7sWZtEZu7Y77I_C0Y3tfZRiVllLVaVA,3649
42
+ mtppy/part3/data_assembly_set/base_functions/wqc.py,sha256=bzM721HDAYJ6AOIcYK96M5P-srMAWym3GNpPkyh85Q4,2307
43
+ mtppy/part3/data_assembly_set/base_functions/wqc_test.py,sha256=S_SGwagQSWmBdYggiyY0uVqv2CBE5iq2gXn7aYIcRJc,2517
44
+ mtppy/part3/data_assembly_set/diagnostic_elements/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
45
+ mtppy/part3/data_assembly_set/diagnostic_elements/diagnostic_element.py,sha256=GWaK8RrPBwFZhSpoHQUCADwOF0W3f0S21xj3X01Axjw,612
46
+ mtppy/part3/data_assembly_set/indicator_elements/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
47
+ mtppy/part3/data_assembly_set/indicator_elements/indicator_element.py,sha256=SnwiY1g_Is4oFtXKUK06jyZNaFyQdvgydgwljTW6yM0,768
48
+ mtppy/part3/data_assembly_set/indicator_elements/views/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
49
+ mtppy/part3/data_assembly_set/indicator_elements/views/ana_view.py,sha256=wJoQ6k1SAx0H5e3jpo3kpOCOhJhLwDrwVaD5LhRBM_E,2048
50
+ mtppy/part3/data_assembly_set/indicator_elements/views/bin_view.py,sha256=cY6H9V9rw3ByIeL0Od7QoAM_l0XzpX-L6YNoC3lHZuk,2159
51
+ mtppy/part3/data_assembly_set/indicator_elements/views/dint_view.py,sha256=sJjgklolXXopUgKFsSK3_1mYnXs52W0BRCBZLm51aS0,2356
52
+ mtppy/part3/data_assembly_set/indicator_elements/views/string_view.py,sha256=XXZJ4AkM7bwrLqNhJW3c_Ewzy0DGSSMU9vjf4ae4CQE,1591
53
+ mtppy/part3/data_assembly_set/operation_elements/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
54
+ mtppy/part3/data_assembly_set/operation_elements/operation_element.py,sha256=3xTy3MfxbT4W7NQQAPZDihGgZFEkNhwjYdYyXC5QrzY,637
55
+ mtppy/part3/data_assembly_set/pea_elements/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
56
+ mtppy/part3/data_assembly_set/pea_elements/pea_element.py,sha256=iDMBcMWZDw20Al5ll4NuGK901CxuaaIwkAiEk6Tfurw,899
57
+ mtppy/part3/data_assembly_set/pea_elements/pea_information_label/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
58
+ mtppy/part3/data_assembly_set/pea_elements/pea_information_label/pea_information_label.py,sha256=DnH0YP4ipSQ0374y7Gk7HOiVQJadUdIzwoCvLafcfZQ,7809
59
+ mtppy/part3/data_assembly_set/pea_elements/web_server_url_info/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
60
+ mtppy/part3/data_assembly_set/pea_elements/web_server_url_info/web_server_url_info.py,sha256=rYDE4ZUZtq5ZtT625na16ArVmJx5m_k5sJStW5-quoo,1392
61
+ mtppy/part3/definitions/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
62
+ mtppy/part3/definitions/mtp_access.py,sha256=aSWnt5zFhgKSYWNXTuxjoUcWKBXQlm3V93zldmqLHss,293
63
+ mtppy/part4/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
64
+ mtppy/part4/automation_services/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
65
+ mtppy/part4/automation_services/procedure.py,sha256=gA3_s7WfflI9yWgz23W17SXd5MIGvGLzteWl-t2pQSI,3879
66
+ mtppy/part4/automation_services/procedure_test.py,sha256=bqNfpDrFcJAJ9F0SV3ZfXDO_L33lkimpa8rchscbH6A,6587
67
+ mtppy/part4/automation_services/service.py,sha256=ZP6A6w4taKn4MuSyxrB9PmJOdr0qhIwjlOHh5B1MTyI,15599
68
+ mtppy/part4/automation_services/service_test.py,sha256=p731mD5VjhYEZYCeyYV3wNdt6cea77-ExNQpocUC9RE,11726
69
+ mtppy/part4/automation_services/base_functions/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
70
+ mtppy/part4/automation_services/base_functions/service_operation_mode.py,sha256=kCw85qvYj3CR3FsFLcEEDZ256OFXSZzJEFpQ5LgvzpE,12442
71
+ mtppy/part4/automation_services/base_functions/service_operation_mode_test.py,sha256=hVVYj9kv9syPu65OPBEAlfYi-34sNTaBzfCbZqGjwkY,9407
72
+ mtppy/part4/automation_services/base_functions/service_operator_interaction.py,sha256=PWz42H9M6NqKsJ6Yagg5O2VIvgW3KoIGuCP06lLvo_0,2260
73
+ mtppy/part4/automation_services/base_functions/service_source_mode.py,sha256=BFcTZ3X7kmTlUauv956Cu4y_bSMGrPO2zLxdRGtBkyE,4758
74
+ mtppy/part4/automation_services/base_functions/service_source_mode_test.py,sha256=lLeZ73H439eUtZ3rfrJXu3eH0GuzaLXMotObTWdENtI,5938
75
+ mtppy/part4/automation_services/helpers/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
76
+ mtppy/part4/automation_services/helpers/command_en_control.py,sha256=-S-Qjkuk_QFsbcL5jJ1YthjpUwpTJAuy10hIcAhXDRM,12410
77
+ mtppy/part4/automation_services/helpers/command_en_control_test.py,sha256=3jsJHkMOtWUAzKTOsRmIzVt6GF5cPuZ2qmEdXdWmVgc,7763
78
+ mtppy/part4/automation_services/helpers/state_machine.py,sha256=dn-VXmqwqHUBq6ovH4lkoficilb7KZotsia7HI0XafU,6684
79
+ mtppy/part4/automation_services/helpers/state_machine_test.py,sha256=Lw_c2g1H9eRoITW7ItrDtFn6iM0iCobP5k5rnKEO0Aw,9823
80
+ mtppy/part4/automation_services/helpers/thread_control.py,sha256=WcPoYY_NorBXo6hr2lbAraP83sHUZADB_cKdNGSln68,1176
81
+ mtppy/part4/automation_services/helpers/thread_control_test.py,sha256=9IFUZo9oSnZ71Ic2ouKWa28RerzFSfMI002WtyO_0nc,2486
82
+ mtppy/part4/automation_services/service_elements/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
83
+ mtppy/part4/automation_services/service_elements/procedure_health_view.py,sha256=he52CbXzhNJKr73kO0WP1gmpKCrXbb9uSWTUte3R0vM,1239
84
+ mtppy/part4/automation_services/service_elements/service_control.py,sha256=SUlPryswIRlyoX5wVVog0U7ITVXdbFfd_YDwOMtVh5o,16228
85
+ mtppy/part4/automation_services/service_elements/service_control_test.py,sha256=RJ8_0YOmlPAicHeu2yUONnsf5i8-ElyTlIAoRx81xMY,4929
86
+ mtppy/part4/automation_services/service_elements/service_element.py,sha256=nIgpLa1_ZFqgHM7AHulgmUTUlqf-ruSh3nl52spqFRQ,606
87
+ mtppy/part4/automation_services/service_elements/parameter_elements/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
88
+ mtppy/part4/automation_services/service_elements/parameter_elements/ana_serv_param.py,sha256=h4ei3jOxFhHqcYqCO7WhmO0iInM0ZrnCDQ3tSlx86YE,4124
89
+ mtppy/part4/automation_services/service_elements/parameter_elements/ana_serv_param_test.py,sha256=nEVXvJ2otFuZhP__2TGsNAh9hJi3x5NCaF09Ks4pACc,1915
90
+ mtppy/part4/automation_services/service_elements/parameter_elements/bin_serv_param.py,sha256=61_kC7tsBJK1pm8vM_3SjDdMuADNTTlC1dkWzwaJf2A,2185
91
+ mtppy/part4/automation_services/service_elements/parameter_elements/bin_serv_param_test.py,sha256=q9YLHE5TXnN-ou1pEHXbQxQcXbQpSIbI-CzJxQgycnE,1226
92
+ mtppy/part4/automation_services/service_elements/parameter_elements/common_serv_param.py,sha256=ohu6LncXmX6ZIEg9kvuaSHgPO-W4bWY9BWnJx2srsfM,2973
93
+ mtppy/part4/automation_services/service_elements/parameter_elements/dint_serv_param.py,sha256=jwVqA8TyIU-0dXk-j7yN_uE3XuujrWA_s46O1Qq4GdY,2611
94
+ mtppy/part4/automation_services/service_elements/parameter_elements/dint_serv_param_test.py,sha256=2Dgtyk6opWUV5yOHA2SwGT3fz2O4P3g66B5WzCzWvYM,1734
95
+ mtppy/part4/automation_services/service_elements/parameter_elements/parameter_element.py,sha256=dPgyxGi_yj18SgEcniikhyJjNxSJ4ODM16VzO9PffoE,6003
96
+ mtppy/part4/automation_services/service_elements/parameter_elements/parameter_element_test.py,sha256=n5I1QDwc87tuNuUkPkBAxD3z2vklUzAa8WHELvmeC4s,7366
97
+ mtppy/part4/automation_services/service_elements/parameter_elements/string_serv_param.py,sha256=CGt7gULmibgHWnwABxUeICjaMZcNufky6u8IZYMWOmQ,1988
98
+ mtppy/part4/automation_services/service_elements/parameter_elements/string_serv_param_test.py,sha256=i2jjeNemEh-yu5EzDxvVhaH4JOY9MOSW52En08Fgsvw,1209
99
+ mtppy/part4/definitions/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
100
+ mtppy/part4/definitions/command_codes.py,sha256=l4Qh2KnVlIjga3N7CRtxuZdhXSgrTnszX2RcCBdGj6E,1452
101
+ mtppy/part4/definitions/command_codes_test.py,sha256=s8W831UtUMjdyi-38NqyGl_PyKj7YkwBsX6ZrMjV1mU,1501
102
+ mtppy/part4/definitions/state_codes.py,sha256=1PQx7h_dwLazJeYS2eGAOEISio_y8oBfwt3CMmhCMfQ,1708
103
+ mtppy/part4/definitions/state_codes_test.py,sha256=9wOFl9xn3CN2cUi-B6R1tiRWpc0L7SUK7YLN58icI9w,1442
104
+ mtppy/part4/process_values/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
105
+ mtppy/part4/process_values/base_functions/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
106
+ mtppy/part4/process_values/base_functions/vqc.py,sha256=S87Ynh5RL46mzwIU7lcdl_-nYXRjCAFTDGqfL1vcw7c,1328
107
+ mtppy/part4/process_values/input_elements/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
108
+ mtppy/part4/process_values/input_elements/ana_process_value_in.py,sha256=GIVoCe6eZJIoIdulrwwc-I1zQnQKnHjlkExtGSYjQdA,5414
109
+ mtppy/part4/process_values/input_elements/bin_process_value_in.py,sha256=LzoSQxySic-CNdaZHzew_b49ey_fv3_GjMqQs6yok2o,2605
110
+ mtppy/part4/process_values/input_elements/dint_process_value_in.py,sha256=AgyMNUWoFShjTXYhfnXwLGev4i5cRcsfUVGc-5Rv3B8,5353
111
+ mtppy/part4/process_values/input_elements/input_element.py,sha256=TsJC_UdvzbjNYoyLxnnmCuPWI7ZNazGKeYOP9DAT2bg,1486
112
+ mtppy/part4/process_values/input_elements/string_process_value_in.py,sha256=TMySzlEPN7X9h71KVkTacBS6KtJF8Wx6TGjgZWzMmu8,1473
113
+ mtppy/part5/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
114
+ mtppy/part5/communication_object.py,sha256=DBXxy8bidp7ECD4A6bRYxmz0rVMNsEoJM5a-3qxrLYY,3262
115
+ mtppy/part5/communication_object_test.py,sha256=6re6_JjFtAj7a516S2ZvkEDlcs0rn_zrwuQNwMQ7Rdo,1644
116
+ mtppy/part5/definitions/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
117
+ mtppy/part5/definitions/iec61131_data_types.py,sha256=PD-_u2q4qqtLv_FNvM5YgiqA0dz9tgodd9QxSIwj1FI,694
118
+ mtppy/part5/definitions/iec61131_data_types_test.py,sha256=x9vAhlGoMRFBlWCNcig6MYH_aaJETCsWZ7-wj0NcqT8,1860
119
+ mtppy/part5/definitions/opcua_data_types.py,sha256=2VNNWN0Bh0eWVwoN8adlIRBPHqfjJ0uSeKuFLjKAkh0,955
120
+ mtppy/part5/definitions/opcua_data_types_test.py,sha256=QCLTOrGBsv-M-C4gozsQLE0sBZ0ZkeJHH-KfRfUHQiU,2147
121
+ mtppy/part5/definitions/w3c_xml_data_types.py,sha256=adrx-dNs9UAIiwSoIerxE6PaEvCBUskPsA8ywrBrrWs,4269
122
+ mtppy/part5/definitions/w3c_xml_data_types_test.py,sha256=LQNWPRol1hmnYPU980HQzcaZKJ4cEUonz6lcr9pco-o,4384
123
+ mtppy/part5/server_assembly_set/__init__.py,sha256=7cxlQFFum530WdBpgePtNMAbJkgxSkxBP-0Xe2QO7NY,123
124
+ mtppy/part6/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
125
+ mtppy/part6/alarm_set/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
126
+ mtppy/part6/alarm_set/alarm.py,sha256=Cb6Z4BjXWmPSLb00k-Cl8iajH_p3lwewPUFr0TSjs50,5008
127
+ mtppy/part6/alarm_set/alarm_test.py,sha256=9Fj74PimwnwewKEhdhT7dfT7Hf2u6phom7kk8X5SQdQ,8811
128
+ mtppy/pea/__init__.py,sha256=9zWnHztfTEpvrg63-Lj0IBHchP1tJjhvkUrK1xbprDk,443
129
+ mtppy/pea/data_assembly_factory.py,sha256=7_avvkcoOvT7UXtFTZ73Gr2I6YkoXeMFX4ktCtJqMtQ,5067
130
+ mtppy/pea/data_assembly_factory_test.py,sha256=NUmxKugDA1BSzx-EMnWkkOxUX0jaB6tNRV-_j7u4FU0,8732
131
+ mtppy/pea/pea.py,sha256=JNrC5_Ju4dkFelQSZs-u-eGRFQF2HIraWSvQD2uF5Nk,5501
132
+ mtppy/pea/pea_test.py,sha256=cxKw_ZXNuWv4_MHOcmaoUZsoB_dUU8deqnOvscYZ8Kw,1651
133
+ mtppy/pea/rmtp_pea.py,sha256=cKqRP9jXaEtnMKOqME_3X-md76phc-82jhUqbc5XtYs,4962
134
+ mtppy/pea/rmtp_pea_test.py,sha256=rgg2NpMnVqh0_G86SlOHvCw1TE30GF3iJguuDLZ4acA,709
135
+ mtppy/pea/service_factory.py,sha256=aLlQrZMAC2o7EWN6pi2ohtnEhmLjmeRIlhufauAOCGc,6197
136
+ mtppy/pea/service_factory_test.py,sha256=MTkArD_T8GUBSRJv2sQu5PrDrzCJMWuivjL_zLkqBaU,5557
137
+ mtppy/pea/mtp_generator/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
138
+ mtppy/pea/mtp_generator/mtp_generator.py,sha256=grTGSpbo7HdnM_zqqBbD_cVL4-v-LxaZbHrPt851tf0,49699
139
+ mtppy/pea/mtp_generator/mtp_generator_test.py,sha256=17qEgU_ZAycsHoVDIwOz6aPwrxXZEH-mIw8vWmRE5k8,16562
140
+ mtppy/pea/pea_opcua_server/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
141
+ mtppy/pea/pea_opcua_server/marshalling.py,sha256=H94_txBpta_nAJsMgtzRH8TY9V4bf1jGgzbktAGjBJc,1968
142
+ mtppy/pea/pea_opcua_server/pea_opcua_server.py,sha256=jGRQXWEN31b6ePN3HsCFiIgQf7pYRyAwT9TCWS_WN84,20010
143
+ mtppy/pea/pea_opcua_server/subscription_list.py,sha256=C91ezAGzzV4JNtvBtbEUgYy6CLDqVKq-sddGS25lBWc,1745
144
+ mtppy/pea/pea_opcua_server/opcua_options_provider/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
145
+ mtppy/pea/pea_opcua_server/opcua_options_provider/opcua_options_provider.py,sha256=6qdo6DqqdKqqpbMmPutS__T5a19cWuvT8H0E3LX7WXY,3065
146
+ mtppy/pea/pea_opcua_server/opcua_options_provider/instances/basic_opcua_options_provider.py,sha256=XRhxEUN5BRbdVYMzB5KC9OD1TrDUTtC9p9qKyunS1Vw,1636
147
+ mtppy/pea/user_logic/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
148
+ mtppy/pea/user_logic/user_logic_pea.py,sha256=WWrxe_51uSA1s0V_VoImgM2RjYTFGti2TkoFJTC44Yc,2559
149
+ mtppy/pea/user_logic/user_logic_registry.py,sha256=L99qzAgXevEfxmwNwThWtqPjfjJEFRpbOciOH-Q8mZg,3796
150
+ mtppy/pea/user_logic/user_logic_registry_test.py,sha256=OmeDAYOugWLrwaefbv5oWr5EiGCWTn4Y1GsqhdJBQSQ,5894
151
+ mtppy/pea/user_logic/user_logic_service.py,sha256=ciI6srL2vaQm-fzA83jU8vX1qtzGsDOyNpYDdMmqTA8,8671
152
+ mtppy/pea/user_logic/user_logic_service_test.py,sha256=whP0Na58MLanvvQ-7SxMtI-Z7EY2e5lZQKrL4dJQGyI,12448
153
+ mtppy/utils/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
154
+ mtppy/utils/data_assembly_dict.py,sha256=Lx9lPm0BzYGl27_lq5pFqHZ5u3j3Smt386MZpLQqPjM,2063
155
+ mtppy/utils/data_assembly_dict_test.py,sha256=Wi39j3z-P_7ZTZzRa8ZAM_ubuzJWZ67eQhYYmSnQDHQ,3038
156
+ mtppy/utils/data_item.py,sha256=exmYGA-z8qzWCddl5g8IHYViA15sUjuSMw4-TqUiP-4,17002
157
+ mtppy/utils/data_item_com_test.py,sha256=Fk41XWQZAk6h3rcVl-BvrTEVNNktnWAzzTQtZGYee7A,2761
158
+ mtppy/utils/data_item_test.py,sha256=pufoIDLDP1CoP-wVDpQPNBkjmrkiHg1Gm3Ix9NBhcIU,8742
159
+ mtppy/utils/logging.py,sha256=VdAc6waGRc_Lv8XOVVlWWSquFQL6dJ4hlynai7VvU2E,711
160
+ mtppy/utils/logging_test.py,sha256=3GcNefqhk-fSEGDNQ-BMXHy8hQVcop8mQZv3KeEHx0A,821
161
+ mtppy/utils/testing.py,sha256=QrnwdbkqGcZkQfg26PnKtwvUoHbqJ7sDHrek9Ey2yaA,1022
162
+ mtppy/utils/mtp_file_handling/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
163
+ mtppy/utils/mtp_file_handling/extract_manifest_from_mtp_file.py,sha256=HyugEyjb0YkLky3-YH7-fe3t1I1bG2lLcpNWvHwaVB8,774
164
+ mtppy/utils/mtp_file_handling/extract_mtp_file.py,sha256=Z86gjoHo2M0qn2JDVZ1Ak6j_Bnd8chxXLxNIpZOhSNE,677
165
+ mtppy/utils/mtp_file_handling/is_valid_mtp.py,sha256=SxPNDqJWeUBdv1yuH65JB9l0oCeNL_BU0X72SqDkE4U,740
166
+ mtppy/utils/mtp_file_handling/is_valid_path_for_manifest.py,sha256=Nch5Oax0brHS_sqfVWHO9fl7qC-1W1tFIsnH7gM2XQk,370
167
+ mtppy/utils/mtp_file_handling/is_valid_path_to_manifest.py,sha256=K0poWg8Fb_nh62GgfAtrbch54rbs-m3GZv5LPanBoO8,464
168
+ mtppy/utils/mtp_file_handling/is_valid_path_to_mtp.py,sha256=fY--jg6SG_P71Y8s7mdCHsw17xGVA_G6Gjww16vAolI,378
169
+ mtppy/utils/mtp_file_handling/load_manifest_file.py,sha256=5eGhc32BdYtsNnneshZ4QMM1qDeRaeFWZjpWP-uN51s,676
170
+ mtppy/utils/mtp_file_handling/write_manifest_file.py,sha256=C89YkDGQzI9-ygEM6vqA8HLRDPNlW5xOq5ttq50KImY,942
171
+ mtppy/utils/mtp_file_handling/write_manifest_file_test.py,sha256=pq4eacu7O6PKzhzQZ9VLxXL4cziUISdTO858-GRXygA,804
172
+ mtppy/utils/mtp_file_handling/write_mtp_file.py,sha256=TRoUHNPfy6iKJI_JOr3RuAcZ4ohMXdtPTL9ZCHoUbP8,1688
173
+ mtppy/utils/mtp_file_handling/write_mtp_file_test.py,sha256=sjB8muVLBBaHHzxfEYfayD7IseQtkmRyO9IPJm2QoVc,753
174
+ mtppy/utils/mtp_file_handling/mtp_reader/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
175
+ mtppy/utils/mtp_file_handling/mtp_reader/mtp_reader.py,sha256=v9MS7pkL8KFK05vkG28Skqlzr_49-FpOviD9_o2HTUI,3585
176
+ mtppy/utils/mtp_file_handling/mtp_reader/mtp_reader_test.py,sha256=wCZQ4glvKOZBvyO2Vm9kNkbxubGp7PhCGarMDPZ3u2Y,3305
177
+ mtppy/utils/mtp_file_handling/mtp_reader/mtp_xml.py,sha256=RShLoOLsurnLzDxffV9EuE_pwGgz2sIaLzQSClvHAAo,7445
178
+ mtppy/utils/mtp_file_handling/mtp_reader/mtp_xml_test.py,sha256=rFKaSeyrSTrY73eMyOt5WXJ2-n9a4e-lfGcfLVvh6tg,4124
179
+ mtppy/utils/mtp_file_handling/mtp_writer/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
180
+ mtppy/utils/mtp_file_handling/mtp_writer/mtp_writer.py,sha256=IFV_mLbHDskktShUqxxm7Z0giH-P3b683zMu7KYfqfM,2792
181
+ mtppy/utils/mtp_file_handling/mtp_writer/test_mtp_writer.py,sha256=sFZfZFdbCx0eYDnMAwQf_zWL7s-vGTzze7IPzwDsAZE,751
182
+ mtppy/utils/mtp_file_handling/mtp_writer/ressources/get_content_types.py,sha256=Q3J_u3gIdtAkfJkgqUrwTTL9urhLc4uvyqg4OZPTLPs,549
183
+ mtppy/utils/mtp_file_handling/mtp_writer/ressources/get_rels.py,sha256=ls31qR-ITCU1K_3A8VmaO8JS5nA2XaPxwurYTpSsZ2U,621
184
+ mtppy2_0-0.1.5.dist-info/licenses/LICENSE,sha256=ZnWlgq7ZjQH3qGTqHlcFqzFkWUB6PJ07uXSUxlCqSSY,1113
185
+ tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
186
+ tools/create_bugreport.py,sha256=R0tzG0amHKHRO9OAoz0u6KCeClkBUdkqjDPe3zpNZxo,5178
187
+ tools/inspect_mtp.py,sha256=BGkPnNdXh0amW3FroidMtNQGP_Fu_yzbFl-JFIxy7Pw,3113
188
+ utils/__init__.py,sha256=sXLh7g3KC4QCFxcZGBTpG2scR7hmmBsMjq6LqRptkRg,22
189
+ utils/get_uuid.py,sha256=cwOGiaIcsw6aYaML2kj2wFRxZRCL6stWIUwbr4YLdqE,339
190
+ utils/get_uuid_test.py,sha256=77WqK6u-tvHwBonJfL5Hpn_d1OOAzEqwJPTKQl6T6W4,370
191
+ utils/logging.py,sha256=HQ9mANAVMFWd-djAtVdiK_t0ARG_u-8HZS_QT9VWkWs,3669
192
+ utils/logging_test.py,sha256=9bMtxi9mEIPlTKuZTe029vV_gTfG3Gs8rvGVRFVzDc0,1909
193
+ utils/type_conversion.py,sha256=D9MIPEiCGjS4tpZEvTqhADnq8gcGy4D6rjQyro3Mzos,6624
194
+ utils/type_conversion_test.py,sha256=XCPraiWzzNu62vDa-kFPKPSkEjbcwOJqLChUcuyZVUg,3416
195
+ utils/file_handling/__init__.py,sha256=iKoAq07f068so4q3jEZ8Sca9-KgKP2GlXU5wEkGjvao,122
196
+ utils/file_handling/cleanup_folder.py,sha256=IGIGogVIuO7NG7WOaqmMZJE3qPKwJKibHh7ChpCxn0g,226
197
+ utils/file_handling/get_utc_foldername_with_ms.py,sha256=WKp_d3TfmLOyse15RGENKcyPfxi83C6E01kjpfyxaug,388
198
+ utils/file_handling/get_work_dir.py,sha256=ggqQUJhyrmtVKEUa9xDK2YmJkQSFPXn1YzEbCrw6bJ4,274
199
+ utils/file_handling/is_valid_path_for_json.py,sha256=epj8TRBL--dlEBav_qwVxZjJvJ7xf1yWUcdJO7tKm5Q,318
200
+ utils/file_handling/is_valid_path_to_json.py,sha256=R0Nw_1u0J0cfOeA79xvCOek35Fs7hVq9YOzRxwCsIAI,470
201
+ utils/file_handling/load_json_file.py,sha256=UmZ6lOZRq0MnaG3-C6r47qGjXwB7hnqyAKiNSllu18g,516
202
+ utils/file_handling/read_file_from_file_archive.py,sha256=wjwOEUf1L4hX1F18nPK6IORwQeQdPg0ipDZ0-JKdZUo,1388
203
+ utils/file_handling/read_file_string.py,sha256=d6C9yPOF4xn6kxKknWXmB9xlMz093V8isbmx4M4kj2w,265
204
+ utils/file_handling/validate_json_data.py,sha256=Zkwqc63R3v1MsAq62sG5px5yeRv4-EAZGL69uHHVLhk,919
205
+ utils/file_handling/write_json_file.py,sha256=-4MyRj_E_EAiKfpRS3mjKODw87rDOic8IP5KZTYgqTg,642
206
+ utils/opcua/check_node.py,sha256=84MfRrFDmb9LKVACGW6fUDj8314Xt0W7j1EqPOJ5tlM,2525
207
+ utils/resolve_unit/resolve_unit.py,sha256=zYL9YSGSdPqr1F5So96ExjZAoCQQ1i00aE5NFnjANk8,256
208
+ utils/resolve_unit/unit_lib.py,sha256=40buA20cuZNYJCjdRJNBmGxP5jnFWN6BjfCxbe4R_mU,75306
209
+ utils/resolve_unit/unit_lib_test.py,sha256=IMVDfUJ2z_XL1s_rHvhEq1eKJmRXlWhHEcU8SH5fIgw,1212
210
+ mtppy2_0-0.1.5.dist-info/METADATA,sha256=HcVjuCyL-je45FYpyi-P4tu1DGIaAdlPQ6nugetehA0,3831
211
+ mtppy2_0-0.1.5.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
212
+ mtppy2_0-0.1.5.dist-info/entry_points.txt,sha256=zLbUIISKRY5zBTUyhyrotxKl_1BYlIEzUiWW5jjcJY8,90
213
+ mtppy2_0-0.1.5.dist-info/top_level.txt,sha256=wS8FYIL0ihs5aFn7AWh5NMtRaSEiTmJwOfs3UquKWNs,27
214
+ mtppy2_0-0.1.5.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ inspect_mtp = tools.inspect_mtp:main
3
+ rmtp_pea = mtppy.pea.rmtp_pea:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dresden University of Technology, Process-to-Order Group
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,4 @@
1
+ examples
2
+ mtppy
3
+ tools
4
+ utils
tools/__init__.py ADDED
File without changes
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env python3
2
+ """Parse pytest.log and produce a Markdown failure report."""
3
+
4
+ import argparse
5
+ import re
6
+ import sys
7
+ from pathlib import Path
8
+
9
+ # Test case header: "_+ test_name[params] _+"
10
+ TEST_HEADER_PATTERN = re.compile(r'___+\s+(.*)\s+___+')
11
+
12
+ # Assertion lines in a failure block, starting with ">" or "E" and not "+" as first character after the spaces
13
+ FAILED_ASSERT_PATTERN = re.compile(r'^[E>](?!\s*\+)\s*(.*)\s*$', re.MULTILINE)
14
+
15
+ # Summary line: "FAILED <file>::<test_name[params]>"
16
+ FAILED_SUMMARY_PATTERN = re.compile(r'^FAILED\s+(.+)::.+$', re.MULTILINE)
17
+
18
+ # How many lines after a test header to scan for the failed assertion
19
+ SCAN_WINDOW = 50
20
+
21
+ def parse_failures(log_text : str) -> tuple[list[tuple[str,str]],list[str]]:
22
+ """Parse a pytest log and extract the failures.
23
+
24
+ Iterates over the log lines looking for test failure headers, captures
25
+ the first failing ``assert`` statement after each header, and collects
26
+ the set of file paths reported in the ``FAILED`` summary section.
27
+
28
+ Args:
29
+ log_text: Full contents of the pytest log file as a string.
30
+
31
+ Returns:
32
+ A tuple ``(failures, failed_files)`` where:
33
+ ``failures`` is a list of ``(test_name, error_message)`` tuples,
34
+ with ``test_name`` and ``error_message`` extracted from report.
35
+ ``failed_files`` is a unique set of file paths containing failed
36
+ tests, as they appear in the ``FAILED`` summary lines.
37
+ """
38
+ failures = []
39
+ lines = log_text.split('\n')
40
+
41
+ for i, line in enumerate(lines):
42
+ header_match = TEST_HEADER_PATTERN.search(line)
43
+ if not header_match:
44
+ continue
45
+ test_name = header_match.group(1)
46
+ error_text = []
47
+ for j in range(i + 1, min(i + SCAN_WINDOW, len(lines))):
48
+ if TEST_HEADER_PATTERN.search(lines[j]):
49
+ break
50
+ assert_match = FAILED_ASSERT_PATTERN.match(lines[j])
51
+ if assert_match:
52
+ error_text.append(assert_match.group(1).strip())
53
+
54
+ failures.append((test_name, "\n - ".join(error_text)))
55
+
56
+ failed_files = set(FAILED_SUMMARY_PATTERN.findall(log_text))
57
+ return failures, failed_files
58
+
59
+
60
+ def format_report(failures : list[tuple[str,str]], failed_files : list[str]) -> str:
61
+ """Format the parsed failures as a markdown failure report.
62
+
63
+ The report follows a fixed template with sections for Observation,
64
+ Effect/Impact, Recommended Actions, and Reproduction. Windows-style
65
+ backslashes in the reproduction paths are normalized to forward slashes.
66
+
67
+ Args:
68
+ failures: List of ``(test_name, error_message)`` tuples as produced
69
+ by `parse_failures`.
70
+ failed_files: Iterable of file paths containing failed tests. They
71
+ are deduplicated and sorted alphabetically before being emitted
72
+ as ``uv run pytest <path>`` commands.
73
+
74
+ Returns:
75
+ The complete markdown report as a single string.
76
+ """
77
+ lines = []
78
+ lines.append("## Observation:")
79
+ lines.append("")
80
+
81
+ lines.append("test suite fails")
82
+ lines.append("")
83
+ for test_name, error_msg in failures:
84
+ lines.append(f"- [ ] {test_name}:\n - {error_msg}")
85
+
86
+ lines.append("")
87
+ lines.append("## Effect/Impact:")
88
+ lines.append("")
89
+ lines.append("- ci/cd fails")
90
+ lines.append("- nonconformant behaviour or specification")
91
+ lines.append("")
92
+ lines.append("## Recommended Actions:")
93
+ lines.append("")
94
+ lines.append("- fix")
95
+ lines.append("")
96
+ lines.append("## Reproduction:")
97
+ lines.append("")
98
+ lines.append("```")
99
+
100
+ for path in sorted(failed_files):
101
+ normalized = path.replace('\\', '/')
102
+ lines.append(f"uv run pytest {normalized}")
103
+
104
+ lines.append("```")
105
+ return '\n'.join(lines)
106
+
107
+
108
+ def arg_parse() -> argparse.Namespace:
109
+ """Parse command-line arguments.
110
+
111
+ Defines a single optional positional argument that names the pytest log
112
+ file to read. When omitted, the caller is expected to feed the log via
113
+ stdin.
114
+
115
+ Returns:
116
+ The parsed arguments. The ``filename`` attribute contains the
117
+ optional path to a pytest log file, or ``None`` if the
118
+ log should be read from stdin.
119
+ """
120
+ parser = argparse.ArgumentParser(
121
+ description='Parse a pytest log and produce a markdown failure report.'
122
+ )
123
+ parser.add_argument(
124
+ 'filename',
125
+ nargs='?',
126
+ default=None,
127
+ help='Path to the pytest log file. If omitted, the log is read from stdin.',
128
+ )
129
+ return parser.parse_args()
130
+
131
+
132
+ def main():
133
+ """Entry point for the script.
134
+
135
+ Reads the pytest log from the path supplied on the command line, or from
136
+ stdin if no path was given, parses the test report, and prints the markdown
137
+ report to stdout. Nothing is printed when the log contains no
138
+ failures.
139
+ """
140
+ args = arg_parse()
141
+ if args.filename:
142
+ log_text = Path(args.filename).read_text(encoding='utf-8')
143
+ else:
144
+ log_text = sys.stdin.read()
145
+ failures, failed_files = parse_failures(log_text)
146
+ if len(failures):
147
+ print(format_report(failures, failed_files))
148
+
149
+ if __name__ == '__main__':
150
+ main()