conson-xp 1.38.0__tar.gz → 1.39.0__tar.gz

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 (322) hide show
  1. {conson_xp-1.38.0 → conson_xp-1.39.0}/PKG-INFO +1 -1
  2. {conson_xp-1.38.0 → conson_xp-1.39.0}/pyproject.toml +1 -1
  3. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/__init__.py +1 -1
  4. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/msactiontable_xp24.py +29 -34
  5. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_xp24_action_table_short_format.py +27 -13
  6. conson_xp-1.38.0/src/xp/connection/__init__.py +0 -13
  7. conson_xp-1.38.0/src/xp/connection/exceptions.py +0 -22
  8. conson_xp-1.38.0/tests/unit/test_connection/__init__.py +0 -1
  9. conson_xp-1.38.0/tests/unit/test_connection/test_connection_init.py +0 -33
  10. conson_xp-1.38.0/tests/unit/test_connection/test_exceptions.py +0 -88
  11. {conson_xp-1.38.0 → conson_xp-1.39.0}/LICENSE +0 -0
  12. {conson_xp-1.38.0 → conson_xp-1.39.0}/README.md +0 -0
  13. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/__init__.py +0 -0
  14. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/__main__.py +0 -0
  15. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/__init__.py +0 -0
  16. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/__init__.py +0 -0
  17. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus.py +0 -0
  18. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -0
  19. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
  20. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
  21. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  22. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  23. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  24. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  25. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
  26. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_export_commands.py +0 -0
  27. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
  28. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
  29. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
  30. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
  31. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
  32. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
  33. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  34. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  35. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/file_commands.py +0 -0
  36. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
  37. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
  38. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  39. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/module_commands.py +0 -0
  40. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  41. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/server/__init__.py +0 -0
  42. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/server/server_commands.py +0 -0
  43. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
  44. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
  45. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  46. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  47. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  48. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  49. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  50. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  51. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/term/__init__.py +0 -0
  52. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/term/term.py +0 -0
  53. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/term/term_commands.py +0 -0
  54. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/main.py +0 -0
  55. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/__init__.py +0 -0
  56. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/click_tree.py +0 -0
  57. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  58. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/decorators.py +0 -0
  59. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/error_handlers.py +0 -0
  60. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/formatters.py +0 -0
  61. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/module_type_choice.py +0 -0
  62. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/serial_number_type.py +0 -0
  63. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/system_function_choice.py +0 -0
  64. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/xp_module_type.py +0 -0
  65. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/__init__.py +0 -0
  66. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/__init__.py +0 -0
  67. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/actiontable.py +0 -0
  68. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/msactiontable.py +0 -0
  69. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
  70. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
  71. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/__init__.py +0 -0
  72. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus.py +0 -0
  73. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  74. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_blink.py +0 -0
  75. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
  76. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  77. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_custom.py +0 -0
  78. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  79. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_discover.py +0 -0
  80. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_event_list.py +0 -0
  81. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_event_raw.py +0 -0
  82. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_export.py +0 -0
  83. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  84. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  85. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_logger_config.py +0 -0
  86. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_output.py +0 -0
  87. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_raw.py +0 -0
  88. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_receive.py +0 -0
  89. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
  90. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/config/__init__.py +0 -0
  91. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/config/conson_module_config.py +0 -0
  92. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/homekit/__init__.py +0 -0
  93. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
  94. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/homekit/homekit_config.py +0 -0
  95. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/log_entry.py +0 -0
  96. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/protocol/__init__.py +0 -0
  97. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/protocol/conbus_protocol.py +0 -0
  98. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/response.py +0 -0
  99. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/__init__.py +0 -0
  100. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/action_type.py +0 -0
  101. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/datapoint_type.py +0 -0
  102. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/event_telegram.py +0 -0
  103. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/event_type.py +0 -0
  104. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/input_action_type.py +0 -0
  105. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/input_type.py +0 -0
  106. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/module_type.py +0 -0
  107. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/module_type_code.py +0 -0
  108. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/output_telegram.py +0 -0
  109. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/reply_telegram.py +0 -0
  110. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/system_function.py +0 -0
  111. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/system_telegram.py +0 -0
  112. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/telegram.py +0 -0
  113. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/telegram_type.py +0 -0
  114. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/timeparam_type.py +0 -0
  115. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/__init__.py +0 -0
  116. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/connection_state.py +0 -0
  117. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/module_state.py +0 -0
  118. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/protocol_keys_config.py +0 -0
  119. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/status_message.py +0 -0
  120. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/telegram_display.py +0 -0
  121. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/write_config_type.py +0 -0
  122. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/__init__.py +0 -0
  123. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/__init__.py +0 -0
  124. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
  125. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
  126. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +0 -0
  127. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +0 -0
  128. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +0 -0
  129. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/__init__.py +0 -0
  130. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  131. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +0 -0
  132. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
  133. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
  134. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
  135. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
  136. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
  137. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  138. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  139. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
  140. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_discover_service.py +0 -0
  141. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
  142. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
  143. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_export_service.py +0 -0
  144. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
  145. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
  146. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  147. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  148. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/msactiontable/__init__.py +0 -0
  149. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/msactiontable/msactiontable_download_service.py +0 -0
  150. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/msactiontable/msactiontable_list_service.py +0 -0
  151. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/msactiontable/msactiontable_show_service.py +0 -0
  152. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/write_config_service.py +0 -0
  153. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/__init__.py +0 -0
  154. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  155. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
  156. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_config_validator.py +0 -0
  157. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
  158. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
  159. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  160. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  161. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
  162. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
  163. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_module_service.py +0 -0
  164. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_outlet.py +0 -0
  165. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
  166. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_service.py +0 -0
  167. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/log_file_service.py +0 -0
  168. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/module_type_service.py +0 -0
  169. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/protocol/__init__.py +0 -0
  170. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/protocol/conbus_event_protocol.py +0 -0
  171. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/protocol/conbus_protocol.py +0 -0
  172. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/protocol/protocol_factory.py +0 -0
  173. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
  174. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/reverse_proxy_service.py +0 -0
  175. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/__init__.py +0 -0
  176. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/base_server_service.py +0 -0
  177. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/client_buffer_manager.py +0 -0
  178. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/cp20_server_service.py +0 -0
  179. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/device_service_factory.py +0 -0
  180. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/server_service.py +0 -0
  181. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/xp130_server_service.py +0 -0
  182. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/xp20_server_service.py +0 -0
  183. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/xp230_server_service.py +0 -0
  184. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/xp24_server_service.py +0 -0
  185. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/xp33_server_service.py +0 -0
  186. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/__init__.py +0 -0
  187. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  188. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  189. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
  190. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  191. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  192. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
  193. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_service.py +0 -0
  194. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
  195. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/term/__init__.py +0 -0
  196. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/term/protocol_monitor_service.py +0 -0
  197. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/term/state_monitor_service.py +0 -0
  198. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/__init__.py +0 -0
  199. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/protocol.py +0 -0
  200. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/protocol.tcss +0 -0
  201. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/state.py +0 -0
  202. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/state.tcss +0 -0
  203. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/widgets/__init__.py +0 -0
  204. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/widgets/help_menu.py +0 -0
  205. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/widgets/modules_list.py +0 -0
  206. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/widgets/protocol_log.py +0 -0
  207. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/widgets/status_footer.py +0 -0
  208. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/__init__.py +0 -0
  209. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/checksum.py +0 -0
  210. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/dependencies.py +0 -0
  211. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/event_helper.py +0 -0
  212. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/logging.py +0 -0
  213. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/serialization.py +0 -0
  214. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/state_machine.py +0 -0
  215. {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/time_utils.py +0 -0
  216. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/.coverage +0 -0
  217. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/__init__.py +0 -0
  218. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/conftest.py +0 -0
  219. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/.coverage +0 -0
  220. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/__init__.py +0 -0
  221. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/telegram_test_data.py +0 -0
  222. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_actiontable_integration.py +0 -0
  223. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_api/.coverage +0 -0
  224. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_api/__init__.py +0 -0
  225. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_blink_integration.py +0 -0
  226. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_checksum_integration.py +0 -0
  227. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_conbus_blink_integration.py +0 -0
  228. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  229. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_conbus_raw_integration.py +0 -0
  230. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_conbus_receive_integration.py +0 -0
  231. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_discovery_integration.py +0 -0
  232. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_event_telegram_integration.py +0 -0
  233. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_homekit_config_integration.py +0 -0
  234. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_link_number_integration.py +0 -0
  235. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_module_integration.py +0 -0
  236. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_output_integration.py +0 -0
  237. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
  238. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  239. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_term_logging_integration.py +0 -0
  240. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_version_integration.py +0 -0
  241. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_xp20_action_table_integration.py +0 -0
  242. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_xp24_action_table_integration.py +0 -0
  243. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/__init__.py +0 -0
  244. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_api/__init__.py +0 -0
  245. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/__init__.py +0 -0
  246. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_click_tree.py +0 -0
  247. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
  248. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  249. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  250. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_decorators.py +0 -0
  251. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
  252. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_formatters.py +0 -0
  253. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  254. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  255. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_term_commands.py +0 -0
  256. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_encoding/__init__.py +0 -0
  257. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  258. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/__init__.py +0 -0
  259. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_conbus.py +0 -0
  260. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  261. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
  262. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  263. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_event_telegram.py +0 -0
  264. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_log_entry.py +0 -0
  265. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_logger_config.py +0 -0
  266. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_module_type.py +0 -0
  267. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
  268. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_system_telegram.py +0 -0
  269. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  270. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_version_telegram.py +0 -0
  271. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_write_config_type.py +0 -0
  272. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  273. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_xp24_action_table.py +0 -0
  274. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  275. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/__init__.py +0 -0
  276. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
  277. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_actiontable_service.py +0 -0
  278. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
  279. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_base_server_service.py +0 -0
  280. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_blink_service.py +0 -0
  281. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_checksum_service.py +0 -0
  282. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
  283. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
  284. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
  285. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
  286. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
  287. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_output_service.py +0 -0
  288. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
  289. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
  290. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  291. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_scan_service.py +0 -0
  292. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
  293. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_discovery_service.py +0 -0
  294. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  295. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
  296. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
  297. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_homekit_services.py +0 -0
  298. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_log_file_service.py +0 -0
  299. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_module_type_service.py +0 -0
  300. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_protocol.py +0 -0
  301. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
  302. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_server_service.py +0 -0
  303. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_state_monitor_service.py +0 -0
  304. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  305. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_telegram_output_service.py +0 -0
  306. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  307. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_telegram_service.py +0 -0
  308. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_version_service.py +0 -0
  309. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
  310. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  311. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
  312. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
  313. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
  314. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
  315. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_tui/__init__.py +0 -0
  316. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_tui/test_protocol_log.py +0 -0
  317. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/__init__.py +0 -0
  318. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/test_checksum.py +0 -0
  319. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/test_event_helper.py +0 -0
  320. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/test_logging.py +0 -0
  321. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/test_serialization.py +0 -0
  322. {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/test_time_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conson-xp
3
- Version: 1.38.0
3
+ Version: 1.39.0
4
4
  Summary: XP Protocol Communication Tools
5
5
  Author-Email: ldvchosal <ldvchosal@github.com>
6
6
  License: MIT License
@@ -22,7 +22,7 @@ dependencies = [
22
22
  ]
23
23
  requires-python = ">=3.11"
24
24
  readme = "README.md"
25
- version = "1.38.0"
25
+ version = "1.39.0"
26
26
 
27
27
  [project.license]
28
28
  file = "LICENSE"
@@ -3,7 +3,7 @@
3
3
  conson-xp package.
4
4
  """
5
5
 
6
- __version__ = "1.38.0"
6
+ __version__ = "1.39.0"
7
7
  __manufacturer__ = "salchichon"
8
8
  __model__ = "xp.cli"
9
9
  __serial__ = "2025.09.23.000"
@@ -159,14 +159,11 @@ class Xp24MsActionTable(MsActionTable):
159
159
  curtain34: bool = False # Curtain setting for inputs 3-4
160
160
  mutual_deadtime: int = MS300 # Master timing (MS300=12 or MS500=20)
161
161
 
162
- def to_short_format(self, include_settings: bool = False) -> str:
162
+ def to_short_format(self) -> str:
163
163
  """Convert action table to short format string.
164
164
 
165
- Args:
166
- include_settings: Include settings after pipe separator.
167
-
168
165
  Returns:
169
- Short format string (e.g., "XP24 T:1 T:2 T:0 T:0").
166
+ Short format string with settings (e.g., "XP24 T:1 T:2 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12").
170
167
  """
171
168
  # Format input actions
172
169
  actions = [
@@ -184,16 +181,15 @@ class Xp24MsActionTable(MsActionTable):
184
181
 
185
182
  result = f"XP24 {' '.join(action_parts)}"
186
183
 
187
- # Add settings if requested
188
- if include_settings:
189
- settings = (
190
- f"M12:{1 if self.mutex12 else 0} "
191
- f"M34:{1 if self.mutex34 else 0} "
192
- f"C12:{1 if self.curtain12 else 0} "
193
- f"C34:{1 if self.curtain34 else 0} "
194
- f"DT:{self.mutual_deadtime}"
195
- )
196
- result = f"{result} | {settings}"
184
+ # Add settings
185
+ settings = (
186
+ f"M12:{1 if self.mutex12 else 0} "
187
+ f"M34:{1 if self.mutex34 else 0} "
188
+ f"C12:{1 if self.curtain12 else 0} "
189
+ f"C34:{1 if self.curtain34 else 0} "
190
+ f"DT:{self.mutual_deadtime}"
191
+ )
192
+ result = f"{result} | {settings}"
197
193
 
198
194
  return result
199
195
 
@@ -213,7 +209,7 @@ class Xp24MsActionTable(MsActionTable):
213
209
  # Split by pipe to separate actions from settings
214
210
  parts = short_str.split("|")
215
211
  action_part = parts[0].strip()
216
- settings_part = parts[1].strip() if len(parts) > 1 else None
212
+ settings_part = parts[1].strip()
217
213
 
218
214
  # Parse action part
219
215
  tokens = action_part.split()
@@ -253,23 +249,22 @@ class Xp24MsActionTable(MsActionTable):
253
249
  "input4_action": input_actions[3],
254
250
  }
255
251
 
256
- if settings_part:
257
- # Parse settings: M12:0 M34:1 C12:0 C34:1 DT:12
258
- for setting in settings_part.split():
259
- if ":" not in setting:
260
- continue
261
-
262
- key, value = setting.split(":", 1)
263
-
264
- if key == "M12":
265
- kwargs["mutex12"] = value == "1"
266
- elif key == "M34":
267
- kwargs["mutex34"] = value == "1"
268
- elif key == "C12":
269
- kwargs["curtain12"] = value == "1"
270
- elif key == "C34":
271
- kwargs["curtain34"] = value == "1"
272
- elif key == "DT":
273
- kwargs["mutual_deadtime"] = int(value)
252
+ # Parse settings: M12:0 M34:1 C12:0 C34:1 DT:12
253
+ for setting in settings_part.split():
254
+ if ":" not in setting:
255
+ continue
256
+
257
+ key, value = setting.split(":", 1)
258
+
259
+ if key == "M12":
260
+ kwargs["mutex12"] = value == "1"
261
+ elif key == "M34":
262
+ kwargs["mutex34"] = value == "1"
263
+ elif key == "C12":
264
+ kwargs["curtain12"] = value == "1"
265
+ elif key == "C34":
266
+ kwargs["curtain34"] = value == "1"
267
+ elif key == "DT":
268
+ kwargs["mutual_deadtime"] = int(value)
274
269
 
275
270
  return cls(**kwargs)
@@ -27,7 +27,10 @@ class TestXp24ShortFormat:
27
27
  ),
28
28
  )
29
29
 
30
- assert action_table.to_short_format() == "XP24 T:1 T:2 T:0 T:0"
30
+ assert (
31
+ action_table.to_short_format()
32
+ == "XP24 T:1 T:2 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
33
+ )
31
34
 
32
35
  def test_to_short_format_with_settings(self):
33
36
  """Test conversion to short format with settings."""
@@ -49,7 +52,7 @@ class TestXp24ShortFormat:
49
52
  curtain12=False,
50
53
  curtain34=False,
51
54
  mutual_deadtime=20,
52
- ).to_short_format(include_settings=True)
55
+ ).to_short_format()
53
56
  assert short == "XP24 T:0 T:0 T:0 T:0 | M12:1 M34:1 C12:0 C34:0 DT:20"
54
57
 
55
58
  def test_to_short_format_mixed_actions(self):
@@ -64,7 +67,7 @@ class TestXp24ShortFormat:
64
67
  type=InputActionType.SCENESET, param=TimeParam.T2MIN
65
68
  ),
66
69
  ).to_short_format()
67
- assert short == "XP24 ON:4 OF:0 LS:12 SS:11"
70
+ assert short == "XP24 ON:4 OF:0 LS:12 SS:11 | M12:0 M34:0 C12:0 C34:0 DT:12"
68
71
 
69
72
  def test_to_short_format_all_void(self):
70
73
  """Test conversion with all VOID actions."""
@@ -74,11 +77,11 @@ class TestXp24ShortFormat:
74
77
  input3_action=InputAction(type=InputActionType.VOID, param=TimeParam.NONE),
75
78
  input4_action=InputAction(type=InputActionType.VOID, param=TimeParam.NONE),
76
79
  ).to_short_format()
77
- assert short == "XP24 V:0 V:0 V:0 V:0"
80
+ assert short == "XP24 V:0 V:0 V:0 V:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
78
81
 
79
82
  def test_from_short_format_basic(self):
80
83
  """Test parsing basic short format."""
81
- short = "XP24 T:1 T:2 T:0 T:0"
84
+ short = "XP24 T:1 T:2 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
82
85
  action_table = Xp24MsActionTable.from_short_format(short)
83
86
 
84
87
  assert action_table.input1_action.type == InputActionType.TOGGLE
@@ -103,7 +106,7 @@ class TestXp24ShortFormat:
103
106
 
104
107
  def test_from_short_format_mixed_actions(self):
105
108
  """Test parsing mixed action types."""
106
- short = "XP24 ON:4 OF:0 LS:12 SS:11"
109
+ short = "XP24 ON:4 OF:0 LS:12 SS:11 | M12:0 M34:0 C12:0 C34:0 DT:12"
107
110
  action_table = Xp24MsActionTable.from_short_format(short)
108
111
 
109
112
  assert action_table.input1_action.type == InputActionType.ON
@@ -135,7 +138,7 @@ class TestXp24ShortFormat:
135
138
  mutual_deadtime=20,
136
139
  )
137
140
 
138
- short = original.to_short_format(include_settings=True)
141
+ short = original.to_short_format()
139
142
  restored = Xp24MsActionTable.from_short_format(short)
140
143
 
141
144
  assert restored == original
@@ -143,22 +146,30 @@ class TestXp24ShortFormat:
143
146
  def test_from_short_format_invalid_format(self):
144
147
  """Test that invalid format raises ValueError."""
145
148
  with pytest.raises(ValueError, match="Invalid short format"):
146
- Xp24MsActionTable.from_short_format("INVALID")
149
+ Xp24MsActionTable.from_short_format(
150
+ "INVALID | M12:0 M34:0 C12:0 C34:0 DT:12"
151
+ )
147
152
 
148
153
  def test_from_short_format_invalid_action_code(self):
149
154
  """Test that invalid action code raises ValueError."""
150
155
  with pytest.raises(ValueError, match="Unknown action code"):
151
- Xp24MsActionTable.from_short_format("XP24 XX:0 T:0 T:0 T:0")
156
+ Xp24MsActionTable.from_short_format(
157
+ "XP24 XX:0 T:0 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
158
+ )
152
159
 
153
160
  def test_from_short_format_invalid_param(self):
154
161
  """Test that invalid param raises ValueError."""
155
162
  with pytest.raises(ValueError, match="Invalid time param"):
156
- Xp24MsActionTable.from_short_format("XP24 T:999 T:0 T:0 T:0")
163
+ Xp24MsActionTable.from_short_format(
164
+ "XP24 T:999 T:0 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
165
+ )
157
166
 
158
167
  def test_from_short_format_missing_colon(self):
159
168
  """Test that missing colon raises ValueError."""
160
169
  with pytest.raises(ValueError, match="Invalid action format"):
161
- Xp24MsActionTable.from_short_format("XP24 T1 T:0 T:0 T:0")
170
+ Xp24MsActionTable.from_short_format(
171
+ "XP24 T1 T:0 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
172
+ )
162
173
 
163
174
  def test_all_action_types(self):
164
175
  """Test that all action types can be converted."""
@@ -199,7 +210,7 @@ class TestXp24ShortFormat:
199
210
  input1_action=InputAction(type=action_type, param=TimeParam.NONE),
200
211
  )
201
212
  short = action_table.to_short_format()
202
- assert short.startswith(f"XP24 {expected_code}:0")
213
+ assert short.startswith(f"XP24 {expected_code}:0 ")
203
214
 
204
215
  # Test round-trip
205
216
  restored = Xp24MsActionTable.from_short_format(short)
@@ -237,7 +248,10 @@ class TestXp24ShortFormat:
237
248
  ),
238
249
  )
239
250
  short = action_table.to_short_format()
240
- assert short == f"XP24 T:{time_param.value} T:0 T:0 T:0"
251
+ assert (
252
+ short
253
+ == f"XP24 T:{time_param.value} T:0 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
254
+ )
241
255
 
242
256
  # Test round-trip
243
257
  restored = Xp24MsActionTable.from_short_format(short)
@@ -1,13 +0,0 @@
1
- """Connection layer for XP CLI tool."""
2
-
3
- from xp.connection.exceptions import (
4
- ProtocolError,
5
- ValidationError,
6
- XPError,
7
- )
8
-
9
- __all__ = [
10
- "XPError",
11
- "ProtocolError",
12
- "ValidationError",
13
- ]
@@ -1,22 +0,0 @@
1
- """Connection-related exceptions for XP CLI tool.
2
-
3
- Following the architecture requirement for structured error handling.
4
- """
5
-
6
-
7
- class XPError(Exception):
8
- """Base exception for XP CLI tool."""
9
-
10
- pass
11
-
12
-
13
- class ProtocolError(XPError):
14
- """Console bus protocol errors."""
15
-
16
- pass
17
-
18
-
19
- class ValidationError(XPError):
20
- """Input validation errors."""
21
-
22
- pass
@@ -1 +0,0 @@
1
- """Unit tests for connection handling."""
@@ -1,33 +0,0 @@
1
- """Tests for connection module initialization."""
2
-
3
- import xp.connection as connection_module
4
- from xp.connection import ProtocolError, ValidationError, XPError
5
-
6
-
7
- class TestConnectionInit:
8
- """Test connection module initialization."""
9
-
10
- def test_xp_error_imported(self):
11
- """Test XPError is importable from connection module."""
12
- assert hasattr(connection_module, "XPError")
13
- assert connection_module.XPError is XPError
14
-
15
- def test_protocol_error_imported(self):
16
- """Test ProtocolError is importable from connection module."""
17
- assert hasattr(connection_module, "ProtocolError")
18
- assert connection_module.ProtocolError is ProtocolError
19
-
20
- def test_validation_error_imported(self):
21
- """Test ValidationError is importable from connection module."""
22
- assert hasattr(connection_module, "ValidationError")
23
- assert connection_module.ValidationError is ValidationError
24
-
25
- def test_all_exports(self):
26
- """Test __all__ contains expected exports."""
27
- expected = ["XPError", "ProtocolError", "ValidationError"]
28
- assert connection_module.__all__ == expected
29
-
30
- def test_all_members_accessible(self):
31
- """Test all members in __all__ are accessible."""
32
- for member in connection_module.__all__:
33
- assert hasattr(connection_module, member)
@@ -1,88 +0,0 @@
1
- """Tests for connection exceptions."""
2
-
3
- import pytest
4
-
5
- from xp.connection.exceptions import ProtocolError, ValidationError, XPError
6
-
7
-
8
- class TestXPError:
9
- """Test XPError base exception."""
10
-
11
- def test_xp_error_is_exception(self):
12
- """Test XPError inherits from Exception."""
13
- assert issubclass(XPError, Exception)
14
-
15
- def test_xp_error_can_be_raised(self):
16
- """Test XPError can be raised."""
17
- with pytest.raises(XPError):
18
- raise XPError("Test error")
19
-
20
- def test_xp_error_with_message(self):
21
- """Test XPError with custom message."""
22
- msg = "Custom error message"
23
- with pytest.raises(XPError) as exc_info:
24
- raise XPError(msg)
25
- assert str(exc_info.value) == msg
26
-
27
- def test_xp_error_without_message(self):
28
- """Test XPError without message."""
29
- with pytest.raises(XPError):
30
- raise XPError()
31
-
32
-
33
- class TestProtocolError:
34
- """Test ProtocolError exception."""
35
-
36
- def test_protocol_error_inherits_from_xp_error(self):
37
- """Test ProtocolError inherits from XPError."""
38
- assert issubclass(ProtocolError, XPError)
39
-
40
- def test_protocol_error_is_exception(self):
41
- """Test ProtocolError is also an Exception."""
42
- assert issubclass(ProtocolError, Exception)
43
-
44
- def test_protocol_error_can_be_raised(self):
45
- """Test ProtocolError can be raised."""
46
- with pytest.raises(ProtocolError):
47
- raise ProtocolError("Protocol error")
48
-
49
- def test_protocol_error_with_message(self):
50
- """Test ProtocolError with custom message."""
51
- msg = "Invalid protocol format"
52
- with pytest.raises(ProtocolError) as exc_info:
53
- raise ProtocolError(msg)
54
- assert str(exc_info.value) == msg
55
-
56
- def test_protocol_error_caught_as_xp_error(self):
57
- """Test ProtocolError can be caught as XPError."""
58
- with pytest.raises(XPError):
59
- raise ProtocolError("Protocol error")
60
-
61
-
62
- class TestValidationError:
63
- """Test ValidationError exception."""
64
-
65
- def test_validation_error_inherits_from_xp_error(self):
66
- """Test ValidationError inherits from XPError."""
67
- assert issubclass(ValidationError, XPError)
68
-
69
- def test_validation_error_is_exception(self):
70
- """Test ValidationError is also an Exception."""
71
- assert issubclass(ValidationError, Exception)
72
-
73
- def test_validation_error_can_be_raised(self):
74
- """Test ValidationError can be raised."""
75
- with pytest.raises(ValidationError):
76
- raise ValidationError("Validation failed")
77
-
78
- def test_validation_error_with_message(self):
79
- """Test ValidationError with custom message."""
80
- msg = "Invalid input data"
81
- with pytest.raises(ValidationError) as exc_info:
82
- raise ValidationError(msg)
83
- assert str(exc_info.value) == msg
84
-
85
- def test_validation_error_caught_as_xp_error(self):
86
- """Test ValidationError can be caught as XPError."""
87
- with pytest.raises(XPError):
88
- raise ValidationError("Validation error")
File without changes
File without changes