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.
- examples/__init__.py +0 -0
- examples/minimal+pid.py +82 -0
- examples/minimal.py +32 -0
- examples/minimal_recipe.py +117 -0
- examples/pea_alarm_base.py +47 -0
- examples/pea_minimal.py +258 -0
- mtppy/__init__.py +1 -0
- mtppy/part1/__init__.py +4 -0
- mtppy/part1/empty_folder_test.py +7 -0
- mtppy/part3/__init__.py +4 -0
- mtppy/part3/data_assembly_set/__init__.py +4 -0
- mtppy/part3/data_assembly_set/active_elements/__init__.py +4 -0
- mtppy/part3/data_assembly_set/active_elements/active_element.py +22 -0
- mtppy/part3/data_assembly_set/active_elements/drives/__init__.py +4 -0
- mtppy/part3/data_assembly_set/active_elements/drives/ana_drv.py +446 -0
- mtppy/part3/data_assembly_set/active_elements/drives/ana_drv_test.py +567 -0
- mtppy/part3/data_assembly_set/active_elements/drives/bin_drv.py +365 -0
- mtppy/part3/data_assembly_set/active_elements/drives/bin_drv_test.py +503 -0
- mtppy/part3/data_assembly_set/active_elements/drives/mon_ana_drv.py +469 -0
- mtppy/part3/data_assembly_set/active_elements/drives/mon_ana_drv_test.py +418 -0
- mtppy/part3/data_assembly_set/active_elements/drives/mon_bin_drv.py +295 -0
- mtppy/part3/data_assembly_set/active_elements/drives/mon_bin_drv_test.py +265 -0
- mtppy/part3/data_assembly_set/active_elements/pid/__init__.py +4 -0
- mtppy/part3/data_assembly_set/active_elements/pid/pid_ctrl.py +333 -0
- mtppy/part3/data_assembly_set/active_elements/pid/pid_ctrl_test.py +156 -0
- mtppy/part3/data_assembly_set/active_elements/valves/__init__.py +4 -0
- mtppy/part3/data_assembly_set/active_elements/valves/ana_vlv.py +402 -0
- mtppy/part3/data_assembly_set/active_elements/valves/ana_vlv_test.py +732 -0
- mtppy/part3/data_assembly_set/active_elements/valves/bin_vlv.py +279 -0
- mtppy/part3/data_assembly_set/active_elements/valves/bin_vlv_test.py +585 -0
- mtppy/part3/data_assembly_set/active_elements/valves/mon_ana_vlv.py +402 -0
- mtppy/part3/data_assembly_set/active_elements/valves/mon_ana_vlv_test.py +270 -0
- mtppy/part3/data_assembly_set/active_elements/valves/mon_bin_vlv.py +286 -0
- mtppy/part3/data_assembly_set/active_elements/valves/mon_bin_vlv_test.py +224 -0
- mtppy/part3/data_assembly_set/base_functions/__init__.py +4 -0
- mtppy/part3/data_assembly_set/base_functions/operation_mode.py +252 -0
- mtppy/part3/data_assembly_set/base_functions/operation_mode_test.py +260 -0
- mtppy/part3/data_assembly_set/base_functions/oslevel.py +35 -0
- mtppy/part3/data_assembly_set/base_functions/source_mode.py +189 -0
- mtppy/part3/data_assembly_set/base_functions/source_mode_test.py +112 -0
- mtppy/part3/data_assembly_set/base_functions/wqc.py +75 -0
- mtppy/part3/data_assembly_set/base_functions/wqc_test.py +86 -0
- mtppy/part3/data_assembly_set/data_assembly.py +65 -0
- mtppy/part3/data_assembly_set/diagnostic_elements/__init__.py +4 -0
- mtppy/part3/data_assembly_set/diagnostic_elements/diagnostic_element.py +19 -0
- mtppy/part3/data_assembly_set/indicator_elements/__init__.py +4 -0
- mtppy/part3/data_assembly_set/indicator_elements/indicator_element.py +22 -0
- mtppy/part3/data_assembly_set/indicator_elements/views/__init__.py +4 -0
- mtppy/part3/data_assembly_set/indicator_elements/views/ana_view.py +68 -0
- mtppy/part3/data_assembly_set/indicator_elements/views/bin_view.py +73 -0
- mtppy/part3/data_assembly_set/indicator_elements/views/dint_view.py +76 -0
- mtppy/part3/data_assembly_set/indicator_elements/views/string_view.py +55 -0
- mtppy/part3/data_assembly_set/operation_elements/__init__.py +4 -0
- mtppy/part3/data_assembly_set/operation_elements/operation_element.py +19 -0
- mtppy/part3/data_assembly_set/pea_elements/__init__.py +4 -0
- mtppy/part3/data_assembly_set/pea_elements/pea_element.py +28 -0
- mtppy/part3/data_assembly_set/pea_elements/pea_information_label/__init__.py +4 -0
- mtppy/part3/data_assembly_set/pea_elements/pea_information_label/pea_information_label.py +231 -0
- mtppy/part3/data_assembly_set/pea_elements/web_server_url_info/__init__.py +4 -0
- mtppy/part3/data_assembly_set/pea_elements/web_server_url_info/web_server_url_info.py +42 -0
- mtppy/part3/definitions/__init__.py +4 -0
- mtppy/part3/definitions/mtp_access.py +15 -0
- mtppy/part4/__init__.py +4 -0
- mtppy/part4/automation_services/__init__.py +4 -0
- mtppy/part4/automation_services/base_functions/__init__.py +4 -0
- mtppy/part4/automation_services/base_functions/service_operation_mode.py +368 -0
- mtppy/part4/automation_services/base_functions/service_operation_mode_test.py +242 -0
- mtppy/part4/automation_services/base_functions/service_operator_interaction.py +62 -0
- mtppy/part4/automation_services/base_functions/service_source_mode.py +138 -0
- mtppy/part4/automation_services/base_functions/service_source_mode_test.py +179 -0
- mtppy/part4/automation_services/helpers/__init__.py +4 -0
- mtppy/part4/automation_services/helpers/command_en_control.py +330 -0
- mtppy/part4/automation_services/helpers/command_en_control_test.py +302 -0
- mtppy/part4/automation_services/helpers/state_machine.py +167 -0
- mtppy/part4/automation_services/helpers/state_machine_test.py +294 -0
- mtppy/part4/automation_services/helpers/thread_control.py +39 -0
- mtppy/part4/automation_services/helpers/thread_control_test.py +80 -0
- mtppy/part4/automation_services/procedure.py +111 -0
- mtppy/part4/automation_services/procedure_test.py +185 -0
- mtppy/part4/automation_services/service.py +463 -0
- mtppy/part4/automation_services/service_elements/__init__.py +4 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/__init__.py +4 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/ana_serv_param.py +108 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/ana_serv_param_test.py +59 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/bin_serv_param.py +70 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/bin_serv_param_test.py +39 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/common_serv_param.py +111 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/dint_serv_param.py +77 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/dint_serv_param_test.py +58 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/parameter_element.py +175 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/parameter_element_test.py +246 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/string_serv_param.py +48 -0
- mtppy/part4/automation_services/service_elements/parameter_elements/string_serv_param_test.py +37 -0
- mtppy/part4/automation_services/service_elements/procedure_health_view.py +36 -0
- mtppy/part4/automation_services/service_elements/service_control.py +473 -0
- mtppy/part4/automation_services/service_elements/service_control_test.py +150 -0
- mtppy/part4/automation_services/service_elements/service_element.py +20 -0
- mtppy/part4/automation_services/service_test.py +407 -0
- mtppy/part4/definitions/__init__.py +4 -0
- mtppy/part4/definitions/command_codes.py +58 -0
- mtppy/part4/definitions/command_codes_test.py +44 -0
- mtppy/part4/definitions/state_codes.py +65 -0
- mtppy/part4/definitions/state_codes_test.py +44 -0
- mtppy/part4/process_values/__init__.py +4 -0
- mtppy/part4/process_values/base_functions/__init__.py +4 -0
- mtppy/part4/process_values/base_functions/vqc.py +48 -0
- mtppy/part4/process_values/input_elements/__init__.py +4 -0
- mtppy/part4/process_values/input_elements/ana_process_value_in.py +160 -0
- mtppy/part4/process_values/input_elements/bin_process_value_in.py +83 -0
- mtppy/part4/process_values/input_elements/dint_process_value_in.py +159 -0
- mtppy/part4/process_values/input_elements/input_element.py +40 -0
- mtppy/part4/process_values/input_elements/string_process_value_in.py +45 -0
- mtppy/part5/__init__.py +4 -0
- mtppy/part5/communication_object.py +99 -0
- mtppy/part5/communication_object_test.py +59 -0
- mtppy/part5/definitions/__init__.py +4 -0
- mtppy/part5/definitions/iec61131_data_types.py +31 -0
- mtppy/part5/definitions/iec61131_data_types_test.py +82 -0
- mtppy/part5/definitions/opcua_data_types.py +36 -0
- mtppy/part5/definitions/opcua_data_types_test.py +90 -0
- mtppy/part5/definitions/w3c_xml_data_types.py +177 -0
- mtppy/part5/definitions/w3c_xml_data_types_test.py +143 -0
- mtppy/part5/server_assembly_set/__init__.py +5 -0
- mtppy/part6/__init__.py +4 -0
- mtppy/part6/alarm_set/__init__.py +4 -0
- mtppy/part6/alarm_set/alarm.py +132 -0
- mtppy/part6/alarm_set/alarm_test.py +265 -0
- mtppy/pea/__init__.py +19 -0
- mtppy/pea/data_assembly_factory.py +124 -0
- mtppy/pea/data_assembly_factory_test.py +229 -0
- mtppy/pea/mtp_generator/__init__.py +4 -0
- mtppy/pea/mtp_generator/mtp_generator.py +1183 -0
- mtppy/pea/mtp_generator/mtp_generator_test.py +518 -0
- mtppy/pea/pea.py +139 -0
- mtppy/pea/pea_opcua_server/__init__.py +4 -0
- mtppy/pea/pea_opcua_server/marshalling.py +60 -0
- mtppy/pea/pea_opcua_server/opcua_options_provider/__init__.py +4 -0
- mtppy/pea/pea_opcua_server/opcua_options_provider/instances/basic_opcua_options_provider.py +50 -0
- mtppy/pea/pea_opcua_server/opcua_options_provider/opcua_options_provider.py +103 -0
- mtppy/pea/pea_opcua_server/pea_opcua_server.py +492 -0
- mtppy/pea/pea_opcua_server/subscription_list.py +55 -0
- mtppy/pea/pea_test.py +59 -0
- mtppy/pea/rmtp_pea.py +155 -0
- mtppy/pea/rmtp_pea_test.py +27 -0
- mtppy/pea/service_factory.py +178 -0
- mtppy/pea/service_factory_test.py +156 -0
- mtppy/pea/user_logic/__init__.py +4 -0
- mtppy/pea/user_logic/user_logic_pea.py +72 -0
- mtppy/pea/user_logic/user_logic_registry.py +106 -0
- mtppy/pea/user_logic/user_logic_registry_test.py +167 -0
- mtppy/pea/user_logic/user_logic_service.py +228 -0
- mtppy/pea/user_logic/user_logic_service_test.py +289 -0
- mtppy/utils/__init__.py +4 -0
- mtppy/utils/data_assembly_dict.py +61 -0
- mtppy/utils/data_assembly_dict_test.py +107 -0
- mtppy/utils/data_item.py +446 -0
- mtppy/utils/data_item_com_test.py +82 -0
- mtppy/utils/data_item_test.py +325 -0
- mtppy/utils/logging.py +23 -0
- mtppy/utils/logging_test.py +26 -0
- mtppy/utils/mtp_file_handling/__init__.py +4 -0
- mtppy/utils/mtp_file_handling/extract_manifest_from_mtp_file.py +22 -0
- mtppy/utils/mtp_file_handling/extract_mtp_file.py +22 -0
- mtppy/utils/mtp_file_handling/is_valid_mtp.py +22 -0
- mtppy/utils/mtp_file_handling/is_valid_path_for_manifest.py +15 -0
- mtppy/utils/mtp_file_handling/is_valid_path_to_manifest.py +17 -0
- mtppy/utils/mtp_file_handling/is_valid_path_to_mtp.py +17 -0
- mtppy/utils/mtp_file_handling/load_manifest_file.py +24 -0
- mtppy/utils/mtp_file_handling/mtp_reader/__init__.py +4 -0
- mtppy/utils/mtp_file_handling/mtp_reader/mtp_reader.py +103 -0
- mtppy/utils/mtp_file_handling/mtp_reader/mtp_reader_test.py +96 -0
- mtppy/utils/mtp_file_handling/mtp_reader/mtp_xml.py +226 -0
- mtppy/utils/mtp_file_handling/mtp_reader/mtp_xml_test.py +108 -0
- mtppy/utils/mtp_file_handling/mtp_writer/__init__.py +4 -0
- mtppy/utils/mtp_file_handling/mtp_writer/mtp_writer.py +77 -0
- mtppy/utils/mtp_file_handling/mtp_writer/ressources/get_content_types.py +10 -0
- mtppy/utils/mtp_file_handling/mtp_writer/ressources/get_rels.py +11 -0
- mtppy/utils/mtp_file_handling/mtp_writer/test_mtp_writer.py +25 -0
- mtppy/utils/mtp_file_handling/write_manifest_file.py +29 -0
- mtppy/utils/mtp_file_handling/write_manifest_file_test.py +22 -0
- mtppy/utils/mtp_file_handling/write_mtp_file.py +43 -0
- mtppy/utils/mtp_file_handling/write_mtp_file_test.py +22 -0
- mtppy/utils/testing.py +31 -0
- mtppy2_0-0.1.5.dist-info/METADATA +75 -0
- mtppy2_0-0.1.5.dist-info/RECORD +214 -0
- mtppy2_0-0.1.5.dist-info/WHEEL +5 -0
- mtppy2_0-0.1.5.dist-info/entry_points.txt +3 -0
- mtppy2_0-0.1.5.dist-info/licenses/LICENSE +21 -0
- mtppy2_0-0.1.5.dist-info/top_level.txt +4 -0
- tools/__init__.py +0 -0
- tools/create_bugreport.py +150 -0
- tools/inspect_mtp.py +110 -0
- utils/__init__.py +1 -0
- utils/file_handling/__init__.py +4 -0
- utils/file_handling/cleanup_folder.py +9 -0
- utils/file_handling/get_utc_foldername_with_ms.py +15 -0
- utils/file_handling/get_work_dir.py +9 -0
- utils/file_handling/is_valid_path_for_json.py +11 -0
- utils/file_handling/is_valid_path_to_json.py +17 -0
- utils/file_handling/load_json_file.py +18 -0
- utils/file_handling/read_file_from_file_archive.py +43 -0
- utils/file_handling/read_file_string.py +10 -0
- utils/file_handling/validate_json_data.py +28 -0
- utils/file_handling/write_json_file.py +23 -0
- utils/get_uuid.py +18 -0
- utils/get_uuid_test.py +17 -0
- utils/logging.py +100 -0
- utils/logging_test.py +67 -0
- utils/opcua/check_node.py +79 -0
- utils/resolve_unit/resolve_unit.py +11 -0
- utils/resolve_unit/unit_lib.py +2101 -0
- utils/resolve_unit/unit_lib_test.py +36 -0
- utils/type_conversion.py +236 -0
- 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
|
+
[](https://gitlab.hrz.tu-chemnitz.de/process-to-order-group/mtppy2.0/-/releases)
|
|
39
|
+
[](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,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.
|
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()
|