dsf-python 3.4.6.post2__tar.gz → 3.4.6.post3__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.
- {dsf-python-3.4.6.post2/src/dsf_python.egg-info → dsf-python-3.4.6.post3}/PKG-INFO +20 -17
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/setup.py +1 -1
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3/src/dsf_python.egg-info}/PKG-INFO +20 -17
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf_python.egg-info/SOURCES.txt +1 -7
- dsf-python-3.4.6.post2/tests/test_code.py +0 -37
- dsf-python-3.4.6.post2/tests/test_custom_http_endpoint.py +0 -53
- dsf-python-3.4.6.post2/tests/test_custom_m_codes.py +0 -70
- dsf-python-3.4.6.post2/tests/test_object_model.py +0 -149
- dsf-python-3.4.6.post2/tests/test_send_simple_code.py +0 -46
- dsf-python-3.4.6.post2/tests/test_subscribe_object_model.py +0 -54
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/LICENSE +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/MANIFEST.in +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/README.md +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/pyproject.toml +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/setup.cfg +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/base_command.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/code.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/code_channel.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/code_flags.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/code_interception.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/code_parameter.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/code_type.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/condition_type.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/files.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/generic.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/http_endpoints.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/model_subscription.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/object_model.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/packages.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/plugins.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/responses.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/commands/user_sessions.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/base_command_connection.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/base_connection.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/command_connection.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/exceptions.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/init_messages/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/init_messages/client_init_messages.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/init_messages/server_init_message.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/intercept_connection.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/subscribe_connection.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/exceptions.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/http.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/boards/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/boards/accelerometer.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/boards/boards.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/boards/closed_loop.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/boards/direct_display.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/boards/driver.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/boards/driver_settings.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/boards/min_max_current.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/boards/stall_detect_settings.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/directories/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/directories/directories.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/fans/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/fans/fan_thermostatic_control.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/fans/fans.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/heat/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/heat/heat.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/heat/heater.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/heat/heater_model.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/heat/heater_model_pid.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/heat/heater_monitor.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/http_endpoints/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/http_endpoints/http_endpoint_type.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/http_endpoints/http_endpoints.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/inputs/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/inputs/compatibility.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/inputs/distance_unit.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/inputs/input_channel.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/inputs/input_channel_state.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/job/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/job/build.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/job/build_object.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/job/gcode_fileinfo.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/job/job.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/job/layer.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/job/thumbnail_info.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/job/times_left.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/limits/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/limits/limits.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/messages/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/messages/messages.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/model_collection.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/model_dictionary.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/model_object.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/axis.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/current_move.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/driver_id.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/extruder.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/extruder_non_linear.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/input_shaping.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/kinematics/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/kinematics/core_kinematics.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/kinematics/delta_kinematics.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/kinematics/delta_tower.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/kinematics/hangprinter_kinematics.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/kinematics/kinematics.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/kinematics/kinematics_name.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/kinematics/polar_kinematics.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/kinematics/scara_kinematics.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/kinematics/tilt_correction.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/kinematics/zleadscrew_kinematics.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/microstepping.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/motors_idle_control.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/move.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/move_calibration.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/move_compensation.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/move_deviations.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/move_queue_item.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/move_rotation.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/move_segmentation.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/probe_grid.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/move/skew.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/network/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/network/network.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/network/network_interface.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/network/network_interface_type.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/network/network_protocol.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/network/network_state.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/object_model.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/plugins/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/plugins/plugin_manifest.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/plugins/plugins.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/plugins/sbc_permissions.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/scanner/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/scanner/scanner.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/scanner/scanner_status.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/analog_sensor.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/analog_sensor_type.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/endstop.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/endstop_type.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/filament_monitors/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/filament_monitors/filament_monitor.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/filament_monitors/filament_monitor_status.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/filament_monitors/filament_monitor_type.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/filament_monitors/laser_filament_monitor.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/filament_monitors/pulsed_filament_monitor.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/filament_monitors/rotating_magnet_filament_monitor.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/gp_input_port.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/probe.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/probe_type.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/sensors/sensors.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/spindles/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/spindles/spindle_state.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/spindles/spindles.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/state/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/state/beep_request.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/state/gp_output_port.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/state/log_level.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/state/machine_mode.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/state/machine_status.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/state/message_box.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/state/restore_point.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/state/state.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/tools/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/tools/tool_retraction.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/tools/tool_state.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/tools/tools.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/user_sessions/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/user_sessions/access_level.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/user_sessions/session_type.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/user_sessions/user_sessions.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/utils.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/volumes/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/object_model/volumes/volumes.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/utility/__init__.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/utils.py +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf_python.egg-info/dependency_links.txt +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf_python.egg-info/requires.txt +0 -0
- {dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf_python.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dsf-python
|
|
3
|
-
Version: 3.4.6.
|
|
3
|
+
Version: 3.4.6.post3
|
|
4
4
|
Summary: Python interface to access DuetSoftwareFramework
|
|
5
5
|
Home-page: https://github.com/Duet3D/dsf-python
|
|
6
6
|
Author: Duet3D Ltd.
|
|
@@ -9,22 +9,6 @@ License: UNKNOWN
|
|
|
9
9
|
Project-URL: Duet3D Support, https://forum.duet3d.com/
|
|
10
10
|
Project-URL: Bug Reports, https://github.com/Duet3D/dsf-python/issues
|
|
11
11
|
Project-URL: Source, https://github.com/Duet3D/dsf-python/
|
|
12
|
-
Description: # Duet Software Framework Python Bindings
|
|
13
|
-
|
|
14
|
-
This is also availabe as a [pip package on pypi](https://pypi.org/project/dsf-python/)
|
|
15
|
-
|
|
16
|
-
Find out more about [Duet Software Framework](https://github.com/Duet3D/DuetSoftwareFramework).
|
|
17
|
-
|
|
18
|
-
Find out more about [Duet Software Framework Python Bindings](https://github.com/Duet3D/dsf-python).
|
|
19
|
-
|
|
20
|
-
Get in touch with the community at [Duet Software Framework Forum](https://forum.duet3d.com/category/31/dsf-development) for bug reports, discussion and any kind of exchange.
|
|
21
|
-
|
|
22
|
-
## Installation
|
|
23
|
-
This package contains a `setup.py` so it can be installed with `python3 setup.py install`.
|
|
24
|
-
|
|
25
|
-
## Usage
|
|
26
|
-
See included `examples/` folder for various use cases.
|
|
27
|
-
|
|
28
12
|
Keywords: Duet3D,DuetSoftwareFramework,DSF,dsf-python
|
|
29
13
|
Platform: UNKNOWN
|
|
30
14
|
Classifier: Development Status :: 5 - Production/Stable
|
|
@@ -39,3 +23,22 @@ Classifier: Programming Language :: Python :: 3 :: Only
|
|
|
39
23
|
Requires-Python: >=3.7, <4
|
|
40
24
|
Description-Content-Type: text/markdown
|
|
41
25
|
Provides-Extra: dev
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
|
|
28
|
+
# Duet Software Framework Python Bindings
|
|
29
|
+
|
|
30
|
+
This is also availabe as a [pip package on pypi](https://pypi.org/project/dsf-python/)
|
|
31
|
+
|
|
32
|
+
Find out more about [Duet Software Framework](https://github.com/Duet3D/DuetSoftwareFramework).
|
|
33
|
+
|
|
34
|
+
Find out more about [Duet Software Framework Python Bindings](https://github.com/Duet3D/dsf-python).
|
|
35
|
+
|
|
36
|
+
Get in touch with the community at [Duet Software Framework Forum](https://forum.duet3d.com/category/31/dsf-development) for bug reports, discussion and any kind of exchange.
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
This package contains a `setup.py` so it can be installed with `python3 setup.py install`.
|
|
40
|
+
|
|
41
|
+
## Usage
|
|
42
|
+
See included `examples/` folder for various use cases.
|
|
43
|
+
|
|
44
|
+
|
|
@@ -6,7 +6,7 @@ long_description = open("README.md", encoding="utf-8").read()
|
|
|
6
6
|
|
|
7
7
|
setuptools.setup(
|
|
8
8
|
name="dsf-python",
|
|
9
|
-
version="3.4.6
|
|
9
|
+
version="3.4.6.post3",
|
|
10
10
|
description="Python interface to access DuetSoftwareFramework",
|
|
11
11
|
long_description=long_description,
|
|
12
12
|
long_description_content_type="text/markdown",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dsf-python
|
|
3
|
-
Version: 3.4.6.
|
|
3
|
+
Version: 3.4.6.post3
|
|
4
4
|
Summary: Python interface to access DuetSoftwareFramework
|
|
5
5
|
Home-page: https://github.com/Duet3D/dsf-python
|
|
6
6
|
Author: Duet3D Ltd.
|
|
@@ -9,22 +9,6 @@ License: UNKNOWN
|
|
|
9
9
|
Project-URL: Duet3D Support, https://forum.duet3d.com/
|
|
10
10
|
Project-URL: Bug Reports, https://github.com/Duet3D/dsf-python/issues
|
|
11
11
|
Project-URL: Source, https://github.com/Duet3D/dsf-python/
|
|
12
|
-
Description: # Duet Software Framework Python Bindings
|
|
13
|
-
|
|
14
|
-
This is also availabe as a [pip package on pypi](https://pypi.org/project/dsf-python/)
|
|
15
|
-
|
|
16
|
-
Find out more about [Duet Software Framework](https://github.com/Duet3D/DuetSoftwareFramework).
|
|
17
|
-
|
|
18
|
-
Find out more about [Duet Software Framework Python Bindings](https://github.com/Duet3D/dsf-python).
|
|
19
|
-
|
|
20
|
-
Get in touch with the community at [Duet Software Framework Forum](https://forum.duet3d.com/category/31/dsf-development) for bug reports, discussion and any kind of exchange.
|
|
21
|
-
|
|
22
|
-
## Installation
|
|
23
|
-
This package contains a `setup.py` so it can be installed with `python3 setup.py install`.
|
|
24
|
-
|
|
25
|
-
## Usage
|
|
26
|
-
See included `examples/` folder for various use cases.
|
|
27
|
-
|
|
28
12
|
Keywords: Duet3D,DuetSoftwareFramework,DSF,dsf-python
|
|
29
13
|
Platform: UNKNOWN
|
|
30
14
|
Classifier: Development Status :: 5 - Production/Stable
|
|
@@ -39,3 +23,22 @@ Classifier: Programming Language :: Python :: 3 :: Only
|
|
|
39
23
|
Requires-Python: >=3.7, <4
|
|
40
24
|
Description-Content-Type: text/markdown
|
|
41
25
|
Provides-Extra: dev
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
|
|
28
|
+
# Duet Software Framework Python Bindings
|
|
29
|
+
|
|
30
|
+
This is also availabe as a [pip package on pypi](https://pypi.org/project/dsf-python/)
|
|
31
|
+
|
|
32
|
+
Find out more about [Duet Software Framework](https://github.com/Duet3D/DuetSoftwareFramework).
|
|
33
|
+
|
|
34
|
+
Find out more about [Duet Software Framework Python Bindings](https://github.com/Duet3D/dsf-python).
|
|
35
|
+
|
|
36
|
+
Get in touch with the community at [Duet Software Framework Forum](https://forum.duet3d.com/category/31/dsf-development) for bug reports, discussion and any kind of exchange.
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
This package contains a `setup.py` so it can be installed with `python3 setup.py install`.
|
|
40
|
+
|
|
41
|
+
## Usage
|
|
42
|
+
See included `examples/` folder for various use cases.
|
|
43
|
+
|
|
44
|
+
|
|
@@ -167,10 +167,4 @@ src/dsf_python.egg-info/PKG-INFO
|
|
|
167
167
|
src/dsf_python.egg-info/SOURCES.txt
|
|
168
168
|
src/dsf_python.egg-info/dependency_links.txt
|
|
169
169
|
src/dsf_python.egg-info/requires.txt
|
|
170
|
-
src/dsf_python.egg-info/top_level.txt
|
|
171
|
-
tests/test_code.py
|
|
172
|
-
tests/test_custom_http_endpoint.py
|
|
173
|
-
tests/test_custom_m_codes.py
|
|
174
|
-
tests/test_object_model.py
|
|
175
|
-
tests/test_send_simple_code.py
|
|
176
|
-
tests/test_subscribe_object_model.py
|
|
170
|
+
src/dsf_python.egg-info/top_level.txt
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import unittest
|
|
2
|
-
import json
|
|
3
|
-
|
|
4
|
-
from src.dsf.commands.code import Code, CodeChannel, CodeFlags, CodeType, KeywordType
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class Model(unittest.TestCase):
|
|
8
|
-
|
|
9
|
-
def setUp(self):
|
|
10
|
-
self.maxDiff = None
|
|
11
|
-
|
|
12
|
-
def tearDown(self):
|
|
13
|
-
pass
|
|
14
|
-
|
|
15
|
-
def test_code(self):
|
|
16
|
-
json_str = '{"sourceConnection":30,"result":null,"type":"M","channel":"HTTP","lineNumber":null,"indent":0,"keyword":0,"keywordArgument":null,"majorNumber":98,"minorNumber":null,"flags":2048,"comment":null,"filePosition":null,"length":22,"parameters":[{"letter":"P","value":"0:/macros/test","isString":true}],"command":"Code"}'
|
|
17
|
-
c = Code.from_json(json.loads(json_str))
|
|
18
|
-
self.assertEqual(str(c), 'M98 P"0:/macros/test"')
|
|
19
|
-
self.assertEqual(c.type, CodeType.MCode)
|
|
20
|
-
self.assertEqual(c.majorNumber, 98)
|
|
21
|
-
self.assertEqual(c.minorNumber, None)
|
|
22
|
-
self.assertEqual(c.flags, CodeFlags.IsLastCode)
|
|
23
|
-
self.assertEqual(c.keyword, KeywordType.KeywordNone)
|
|
24
|
-
self.assertEqual(c.keywordArgument, None)
|
|
25
|
-
self.assertEqual(c.comment, None)
|
|
26
|
-
self.assertEqual(c.length, 22)
|
|
27
|
-
self.assertEqual(c.lineNumber, None)
|
|
28
|
-
self.assertEqual(c.filePosition, None)
|
|
29
|
-
self.assertEqual(c.indent, 0)
|
|
30
|
-
self.assertEqual(c.channel, CodeChannel.HTTP)
|
|
31
|
-
self.assertEqual(c.command, 'Code')
|
|
32
|
-
|
|
33
|
-
def test_code_keyword(self):
|
|
34
|
-
json_str = '{"sourceConnection":33,"result":null,"type":"K","channel":"HTTP","lineNumber":null,"indent":0,"keyword":9,"keywordArgument":"test","majorNumber":null,"minorNumber":null,"flags":2048,"comment":null,"filePosition":null,"length":12,"parameters":[],"command":"Code"}'
|
|
35
|
-
c = Code.from_json(json.loads(json_str))
|
|
36
|
-
self.assertEqual(c.type, CodeType.Keyword)
|
|
37
|
-
self.assertEqual(c.keyword, KeywordType.Echo)
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import threading
|
|
2
|
-
import os
|
|
3
|
-
import pathlib
|
|
4
|
-
import socket
|
|
5
|
-
import time
|
|
6
|
-
import importlib.util
|
|
7
|
-
|
|
8
|
-
here = pathlib.Path(__file__).parent.parent.resolve()
|
|
9
|
-
example_path = here / "examples/custom_http_endpoint.py"
|
|
10
|
-
spec = importlib.util.spec_from_file_location("custom_http_endpoint", example_path)
|
|
11
|
-
custom_http_endpoint = importlib.util.module_from_spec(spec)
|
|
12
|
-
spec.loader.exec_module(custom_http_endpoint)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def test_custom_http_endpoint(monkeypatch, tmp_path):
|
|
16
|
-
mock_dcs_socket_file = os.path.join(tmp_path, "dsf.socket")
|
|
17
|
-
monkeypatch.setattr(
|
|
18
|
-
"dsf.connections.CommandConnection.connect.__defaults__",
|
|
19
|
-
(mock_dcs_socket_file,),
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
dcs_passed = threading.Event()
|
|
23
|
-
|
|
24
|
-
def mock_dcs():
|
|
25
|
-
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
26
|
-
server.bind(mock_dcs_socket_file)
|
|
27
|
-
server.listen(1)
|
|
28
|
-
conn, _ = server.accept()
|
|
29
|
-
conn.sendall('{"version":11, "id":"foobar"}'.encode())
|
|
30
|
-
assert conn.recv(1024) == b'{"mode":"Command","version":11}'
|
|
31
|
-
conn.sendall('{"success":true}'.encode())
|
|
32
|
-
assert (
|
|
33
|
-
conn.recv(1024) == b"{"
|
|
34
|
-
b'"command":"AddHttpEndpoint","EndpointType":"GET",'
|
|
35
|
-
b'"Namespace":"custom","Path":"getIt","IsUploadRequest":false'
|
|
36
|
-
b"}"
|
|
37
|
-
)
|
|
38
|
-
conn.sendall('{"result":"/var/run/dsf/custom/getIt-GET.sock","success":true}'.encode())
|
|
39
|
-
conn.close()
|
|
40
|
-
dcs_passed.set() # indicate that all asserts passed and the mock_dcs is shutting down
|
|
41
|
-
|
|
42
|
-
thread = threading.Thread(target=mock_dcs, daemon=True)
|
|
43
|
-
thread.start()
|
|
44
|
-
time.sleep(1)
|
|
45
|
-
|
|
46
|
-
cmd_conn, endpoint = custom_http_endpoint.custom_http_endpoint()
|
|
47
|
-
dcs_passed.wait(5)
|
|
48
|
-
endpoint.close()
|
|
49
|
-
cmd_conn.close()
|
|
50
|
-
|
|
51
|
-
thread.join()
|
|
52
|
-
|
|
53
|
-
assert dcs_passed.is_set()
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import threading
|
|
2
|
-
import os
|
|
3
|
-
import pathlib
|
|
4
|
-
import socket
|
|
5
|
-
import time
|
|
6
|
-
import importlib.util
|
|
7
|
-
|
|
8
|
-
here = pathlib.Path(__file__).parent.parent.resolve()
|
|
9
|
-
example_path = here / "examples/custom_m_codes.py"
|
|
10
|
-
spec = importlib.util.spec_from_file_location("custom_m_codes", example_path)
|
|
11
|
-
custom_m_codes = importlib.util.module_from_spec(spec)
|
|
12
|
-
spec.loader.exec_module(custom_m_codes)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def test_custom_m_codes(monkeypatch, tmp_path):
|
|
16
|
-
mock_dcs_socket_file = os.path.join(tmp_path, "dsf.socket")
|
|
17
|
-
monkeypatch.setattr(
|
|
18
|
-
"dsf.connections.InterceptConnection.connect.__defaults__",
|
|
19
|
-
(mock_dcs_socket_file,),
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
dcs_passed = threading.Event()
|
|
23
|
-
|
|
24
|
-
def mock_dcs():
|
|
25
|
-
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
26
|
-
server.bind(mock_dcs_socket_file)
|
|
27
|
-
server.listen(1)
|
|
28
|
-
conn, _ = server.accept()
|
|
29
|
-
print("send all")
|
|
30
|
-
conn.sendall(b'{"version":11, "id":"foobar"}')
|
|
31
|
-
assert (
|
|
32
|
-
conn.recv(1024) == b"{"
|
|
33
|
-
b'"mode":"Intercept","version":11,"InterceptionMode":"Pre","Channels":["HTTP","Telnet",'
|
|
34
|
-
b'"File","USB","Aux","Trigger","Queue","LCD","SBC","Daemon","Aux2","AutoPause","Unknown"],'
|
|
35
|
-
b'"Filters":null,"PriorityCodes":false'
|
|
36
|
-
b"}"
|
|
37
|
-
)
|
|
38
|
-
conn.sendall(b'{"success":true}')
|
|
39
|
-
conn.sendall(
|
|
40
|
-
b"{"
|
|
41
|
-
b'"connection":{"id":12,"apiVersion":10,"isConnected":true},"sourceConnection":12,'
|
|
42
|
-
b'"result":null,"type":"M","channel":"HTTP","lineNumber":null,"indent":0,"keyword":0,'
|
|
43
|
-
b'"keywordArgument":null,"majorNumber":1234,"minorNumber":null,"flags":2048,"comment":null,'
|
|
44
|
-
b'"filePosition":null,"length":6,"parameters":[],"command":"Code"'
|
|
45
|
-
b"}"
|
|
46
|
-
)
|
|
47
|
-
assert conn.recv(1024) == b'{"command":"Flush","Channel":"HTTP"}'
|
|
48
|
-
conn.sendall(b'{"result":true,"success":true}')
|
|
49
|
-
assert conn.recv(1024) == b'{"command":"Resolve","Type":0,"Content":null}'
|
|
50
|
-
conn.sendall(
|
|
51
|
-
b"{"
|
|
52
|
-
b'"connection":{"id":12,"apiVersion":10,"isConnected":true},"sourceConnection":12,'
|
|
53
|
-
b'"result":null,"type":"M","channel":"HTTP","lineNumber":null,"indent":0,"keyword":0,'
|
|
54
|
-
b'"keywordArgument":null,"majorNumber":5678,"minorNumber":null,"flags":2048,"comment":null,'
|
|
55
|
-
b'"filePosition":null,"length":6,"parameters":[],"command":"Code"'
|
|
56
|
-
b"}"
|
|
57
|
-
)
|
|
58
|
-
assert conn.recv(1024) == b'{"command":"Resolve","Type":0,"Content":null}'
|
|
59
|
-
conn.close()
|
|
60
|
-
dcs_passed.set() # indicate that all asserts passed and the mock_dcs is shutting down
|
|
61
|
-
|
|
62
|
-
thread = threading.Thread(target=mock_dcs, daemon=True)
|
|
63
|
-
thread.start()
|
|
64
|
-
time.sleep(1)
|
|
65
|
-
|
|
66
|
-
custom_m_codes.start_intercept()
|
|
67
|
-
|
|
68
|
-
thread.join()
|
|
69
|
-
|
|
70
|
-
assert dcs_passed.is_set()
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import unittest
|
|
3
|
-
|
|
4
|
-
from src.dsf.object_model import *
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class Model(unittest.TestCase):
|
|
8
|
-
|
|
9
|
-
def setUp(self):
|
|
10
|
-
self.maxDiff = None
|
|
11
|
-
|
|
12
|
-
def tearDown(self):
|
|
13
|
-
pass
|
|
14
|
-
|
|
15
|
-
def test_boards(self):
|
|
16
|
-
model = ObjectModel()
|
|
17
|
-
|
|
18
|
-
json_patch = '{"boards": [{"accelerometer": null, "bootloaderFileName": null, "canAddress": 0, "closedLoop": null, "directDisplay": null, "firmwareDate": "2022-11-30", "firmwareFileName": "Duet3Firmware_Mini5plus.uf2", "firmwareName": "RepRapFirmware for Duet 3 Mini 5+", "firmwareVersion": "3.4.5", "iapFileNameSBC": "Duet3_SBCiap32_Mini5plus.bin", "iapFileNameSD": "Duet3_SDiap32_Mini5plus.bin", "maxHeaters": 32, "maxMotors": 7, "mcuTemp": {"current": 33.1, "max": 33.6, "min": 19.4}, "name": "Duet 3 Mini 5+", "shortName": "Mini5plus", "state": "unknown", "supports12864": true, "supportsDirectDisplay": true, "uniqueId": "F8AU7-6P6KL-K65J0-409N2-KKW1Z-Z5W3W", "v12": null, "vIn": {"current": 19.4, "max": 19.4, "min": 19.3}}]}'
|
|
19
|
-
model.update_from_json(json_patch)
|
|
20
|
-
|
|
21
|
-
# Voltage change
|
|
22
|
-
json_patch = '{"boards":[{"vIn":{"current":42.5}}]}'
|
|
23
|
-
model.update_from_json(json_patch)
|
|
24
|
-
# Check if the value has been modified
|
|
25
|
-
self.assertEqual(model.boards[0].v_in.current, 42.5)
|
|
26
|
-
# Check if other values has not been altered
|
|
27
|
-
self.assertEqual(model.boards[0].v_in.min, 19.3)
|
|
28
|
-
self.assertEqual(model.boards[0].v_in.max, 19.4)
|
|
29
|
-
|
|
30
|
-
def test_http_endpoints(self):
|
|
31
|
-
from src.dsf.object_model.http_endpoints.http_endpoint_type import HttpEndpointType
|
|
32
|
-
model = ObjectModel()
|
|
33
|
-
|
|
34
|
-
json_patch = '{"httpEndpoints":[{"endpointType":"GET","namespace":"ExecOnMcode","path":"getCmdList","isUploadRequest":false,"unixSocket":"/run/dsf/ExecOnMcode/getCmdList-GET.sock"}]}'
|
|
35
|
-
model.update_from_json(json_patch)
|
|
36
|
-
self.assertEqual(len(model.http_endpoints), 1)
|
|
37
|
-
self.assertEqual(model.http_endpoints[0].endpoint_type, HttpEndpointType.GET)
|
|
38
|
-
|
|
39
|
-
json_patch = '{"httpEndpoints":[{},{"endpointType":"POST","namespace":"ExecOnMcode","path":"saveCmdList","isUploadRequest":false,"unixSocket":"/run/dsf/ExecOnMcode/saveCmdList-POST.sock"}]}'
|
|
40
|
-
model.update_from_json(json_patch)
|
|
41
|
-
self.assertEqual(len(model.http_endpoints), 2)
|
|
42
|
-
self.assertEqual(model.http_endpoints[1].endpoint_type, HttpEndpointType.POST)
|
|
43
|
-
|
|
44
|
-
def test_job(self):
|
|
45
|
-
model = ObjectModel()
|
|
46
|
-
|
|
47
|
-
json_patch = '{"job":{"file":{"filament":[496.4],"fileName":"0:/gcodes/Veil_Token.gcode","generatedBy":"ideaMaker 4.2.1.5321, 2022-10-01 17:45:38 UTC\u002B0200","height":1.04,"lastModified":"2022-10-01T16:45:39+01:00","layerHeight":0.12,"numLayers":9,"printTime":798,"size":594195,"thumbnails":[{"data":"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAUnklEQVR4nO3cfYwcZ30H8O/zzMy\u002B3d77nl\u002BuztmOA7bjGIOdBBJioDSEJkBLStOWCERTaKS2alWkqqioqpD6BxSVSlUFaktVggRUjdomBVIaikrA4Y9AYkhsY5vEdnz2\u002Bezz3u3e3b7OzPP8\u002BsfM7O5dfMmdb\u002B9s1O9HWu3u3e7s8/xmnmeefZ7fLEBERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERET0/5261gXoljuA7N5cbuADw8PDU8bc6Isa3eJ5W3MaY/NWxiyQ6Xy9o1D0gCPnguBwv8jzvzY5\u002BTMAZq3L\u002BdG\u002BvqFfHRjYXDVmm0Dv2p72bimFZswCfZ2vc4GL/a5TnPTDM0UTHBtynBe/cv78\u002BOPALABZyzI\u002BAKTev2XL1poxb96bzR4oGbPLCAqdr3GgZvIaxZrF\u002BIwJpozIsY1aTz5Vr8/86/R08SWguZZlXC8/bw1E/3ImM3ZTOl24v39ot6OlcNmYnSOOuzWj9Zhv7UBW62FHqfRKNhpYWw1FXihZ84ILPPfVmZmnD1UqZ14GGqsp7Ad7e3ftdDOFd/f37r0Qhrs3uu4tWmGbo9RmT6nMa2\u002Bho4wijcDKBJRMzBjzk4xS4yfqwZGvz5dOfKdeH19NObcBmXv7\u002B/f81tDQnlIY3j7ierc5Su1MKdW/ku0YEb8pMuMpVZwJzZmGmHP9jvPSdBiePV71L/1naer0c8AlAHY15V1P13MDcf9\u002B4\u002BgDe3PpA3PW7negtg05zphWylmPDw9FmpNheOT5pvmdv7h0/shy3vO5jRt/6U2Z7IMN4NYRx9ntKOWtdTkBwIgEZWtOOMDh5xuNRz5\u002B8eJTy3nfp0dGbtqTyf3TJs99i7vCTuVqWREzY8y4hfxUizo6EQTHHpqc\u002BBcA4Xp8/kq517oAS9kDFLbkMl/2Fby840IjGv9YCBwAapVtOxRBAKAR39cB1CBoCDAnghIkXYXcOuXhLQCW1UC2ZHMPV5X6jawCqgBcicqqASgV3etVlltE0ABQhyAQYD6qg1cS7J2B7J1PpXIAnlrOtvqy2V9sOM7bp0TgQpCOy\u002BcAXS\u002B3FUETQAA4Ruvt88D2WbHvuZzyghHgfy4DF1f1AWvkum0gBghqgPgAVDzkFgAi0c1CoBGdq6ObwALQEj03AHwAAQQmfh5K1BCa8d8CAUIIfCzdffnG9Cy3zGVryspxkZQ5OaQ6yy1xXRTaDd7Gz61Erw0A\u002BB3lDgD4EjWKMC53gKihLB6rNMKwvNzyVq3NDTiCGhS0ADXVjvXiciOJL64Q87jsFlHM/bicSYxriMrrx/FuoP1lTwA0oipel67bBnICmC4a89NhR7/RU\u002B3zhQPAU4AjUeG1UlFPF/d8RgFGJD4jALMiKCNuICra2dHWXv17btPaSSvybDkMv7ncMp8Kgie3KvX\u002BYa03uAAcpRZ8SudjF0AWQEopaChoCBwV1TIQgYFCFdFZbTbufTu3caX\u002BvGnMuZLvf3e55X252XxCtL4rB/XOfkcPZSQq81LnCgFajdbGdeiBQkZF\u002B8WN94UPgZXoW3pNAVURVACUICjLwjiE1k7NA9PLLfN6u\u002B6\u002BgxwAvAO5XOGegYH\u002BqtXbJ8Tcf3M285sbtO7zgNZBtFwighqAM2LxsrG1sshpUWjOh\u002BHlukgttPYylJpztJ4GcPbM/Pz4nO9PHWs2X7rKKqjtmczYrb29u/dlMjdWwvCmPq1vvzGVunVIqXQvFFIA1FXUowzBRSu4LNJ80fefvWzN0XwqdWSiWj014ftnj1YqJ3CVM1w3AKP7h4dvvjGdLvRovdUDsr6VMc/RhR7AS2t3REFcLbJjm\u002BPkB5RCdoV1AKLGXxZBSezseL35RI\u002BSxzamUse/MzNz\u002BUeVSum56\u002Bxsci0biP5gPr97fyY/ckdv9pZJP9zd7zqb\u002Bx29o2mlkFaq39N62cOb5QhFalVrjzTF/qDkm6c/O3n\u002B6R8Dl7u1/T1A6s6BgZvv7\u002B3fXxO7f4Pr7nCV2hHPWuW79TkA0BSpiMhkzdpTc8YeySh14ofV\u002Bol/n5k6fgQodetzHsrnR27v7d0/6qbuGXKdNztK7ct0uS6\u002BSCMUuewoTJVDe6Eu5uQG1z17rF4/81i5fOxMozF9Mvq6te7WvIE8DHj3jI7uKAP7tzjeLqtx0IXaup4zUktJZn\u002BKYfiZD54//7WVvv/RTZtGqlq/64ZU6h4ruKPguq9fi3KuVDEMT3gK3zvj\u002B9/7WbX635\u002BZnV1xg3l0dOxdQ57\u002BqyHXfdNalHElRMRMxzNfrqijE37wbI\u002BWo1\u002B\u002BcGH8G9FIes2sdQNRj90w9s\u002BjrvtAt88G3VASi6IITlv52Z\u002BdfXnnSt//lRtu\u002BPwOL/X76asYaqyHkrX2ULPx\u002BU9duPBHK33vf2y/8eSgUq/PAfCuw/oF1laPBsG3P3r\u002B3Aewhguna/4lfUphq6fQkxULr2MKUcU3Hb9OYeXj8oQVac2sJF8gQ8QzVALMQ1AXoBLfz8Tj\u002BdYMkFxdfC8DPSkRpOIp0lRcNzeup1rqdpX1FJFW/Vozc4jG9fMQ1AQoQ6L6Rd\u002B99LzIihb7EnPxdLKLaLo6paLHHgBn8VRw/J5u7c/F9UxmxxoiKMV1nRDpOWvtwFV9wAqsdQMRALUmgM7p2k4qntWIpjmjg9aJ3yhoTylK6z4Kni/tqcQQ0RRugKhRROsb0XRuGP9/LZZujbVVdGy/vey\u002BqJ6CBfNmItFkb3IwJfVLpj7b94IgXqdpN4aongGima1mXM8A3c2T6ayBRTQjFe3Dxf9d\u002BKYF84PS7oSS6WHE5Wzvz/Z0cT1\u002BfYB2Pf14Gr7WXkdpl0ut7fAKWIcziAAXjAhcqFZXI0vcTMe7kgCGglZDMPF/Og96A8BIcgBJ6\u002BzRebAsdX4wIjURGZ8Ngr\u002B5mrqVQ3my37W/3qvVBhfRYlpnp7m4fp0HSNLYk78paZfZR3JQLjwzBvFaQ4D2gfRqDd\u002BKzDZEnrqauh2u1z51UyrzibxWO3NaZVyJG/SiaWDpuL9SfTsbQVK/UBY3wPY\u002B9RGt\u002BST1TOp9pX3oiExi6d3bFWs\u002BuPxQobD59ZnM72aBd/c6zu6s1oMpAJl4ujM6dSt4aJ\u002Buk1tnkGvxesa0CBrxAZIsogFR0P24B/I7/t9asLK20rD2rIgUNXBo1pgTPY5z\u002BKnJyfFL0cL3Vflwf//2kVzu7hHPO\u002BiJ7MxovTOndX8a7d4nOVskS4QeoszJlFJIoz1USSR1DhD1qqV4LaQs7UXCEO0GlBxcgbWzDWvHHeCFWWO\u002BB2O\u002B//Vi8eTV1u2tQO8bN20aE\u002BC2Ta672wH2aqV29yldSDs676E9rExGAUl9BQpGBKJUqzNQAHoB5KGQUapV784GZeI61xEN8yoQXBDBXDxi8K2drxlzGMCTl\u002Br1r/1vuXz2auu3HGvaQA4A3tuGhzfcmU5vnbdq37Z06kBTyX0j2tmsV/F9Y0IEzwT\u002BibKVFw2AmjWXrUgQaF33gGLW8y7XwnDuzPz8eN3a2ulqdXwOmOlu7ZakCsCmsZ6ekd3Z7NimVHZsg6vu3KjUfdscd7AHK1/LSRgRXBLBuNj5s2H4jUlrf1D0/fGLtdrkbK127hQw1d2qLK0PGBpNpws78vmxbel0YcB1\u002B\u002BrGjAiQs9YOp5TyUsoZCWGRh9ryhpS3b1RpvZq6F62dTAv\u002BayoMn3PEPH\u002B60Rh/dGbm0lqunXS1gbwZ6Hvn0NCet\u002Bfzt9dE7dvkOfuMYDSr1Ei3p3RDkYuTgf/Xf3Du3BfORxkk14178/mRB3sHDuRd9Z4R1zvoKbWj2\u002BsgRqTZsPbEnLGHG7CP/\u002BW5c9//CbDsNJP18NG\u002BvqEHh4b\u002BNK/1RzylN3Vz21bENEWKSmFiJgyPOMDhI43Gc1\u002Bemnr\u002BGFDp1uesuIE8APQf3LCh8LpMZvOFwNxycyZ1c9nYPVmtd/U5zmi3CrZcgUhlKgwe88PwH57x/Rc\u002BWyyu64LSA\u002Bgbeu8v9Baswb4tae\u002BOQHDXJs\u002B9bT3LAAC\u002BtbU5Y486GofP\u002B/5TvSIvfHFycuJbwNx6luPhwcH\u002Bd\u002BRyB4Zc9z2DjvtwtzuG12JFTMmYs0m28LgfHO918OKpqpn8t/LFqedWuG7yqg3kvp6eTQezvbsOxivdoylvL4DNAApZrdd8im0lrIgJIadKoXlyyg8f\u002B8jFiaewBl/gfhvI3DC44cBbezNv9ZRzMK2wx9G6kFaqt9uftRqBtTUDTNStnAzEHDru\u002Bz/8\u002BMWLT2ON0sq/uGHLG0Yy\u002BmMbXfdeD2qrXqdU/\u002BUwIsa3tqyUnhJIsRSaIwOuPn6k0XjxC5OTP3y1zINWA3konx95b3//Dqv1XQPafbuI7Cx47uvWpwrd93LT/9svnh//xLe6cGXbh4Ge\u002BzZvuWc45dzf67j3p9e5V\u002ByWpkilFAZP1EJ8db42d\u002BihcnnVQ7J7gfTHbhj7zPZU6o\u002B7UcZroWzMORE8M2PDZ7S1T39zdvbUlyqVywCgPjcy8qa9ufwnc1rdntF6VF/HGb4rMWNt7dH5uYP/WCweXs12HkT/4MPbhh7vc5y3dats14M5a559ZGrqfY9Uq6u6DuOThcL\u002Bu3v7Dg1onetW2a4lC4QNay8YkR\u002BfrQefdm/L5w/ltXPdpYGsVF0ENQguWMEZsThvrb4osurGXs36\u002BWlgVzpeTV7thVrXmolTz58xduxH1qZWu72667qnxerh\u002BKL6rIqn7H9OY6UBN6f1GICxjVm5zT0vUtssticLhdR1mHNzJbMirfWBmTj9IE6taC\u002B8AalCOn1VaRaLzYlARJABkIUgHa/huD8n8ZqL4zMpFhPx44rtTm7B9lSqzwFSNURjWUcEHqKUlBQEXrzu4\u002BHnK15nrMXzYQi3Ya1f0hplCLREOUUu4guToOLLLV\u002BZO3W16xiJzvyp5JYs6vkiqMbpE1WJFglnEDWKOazDT49cqbyI0lf8jqvudHxJbZSf1M7BWpxr1o08rFY5pL0IKuiIGQRVARoQVASYE4uyANMdK9hrISlHolUmAZoq\u002BksrV0ukdWxpxBe8IYrb4uOs8wZ073hLshiCuJxVEdQRdRpFEUyLtFaNayJww45pL4v2gkK0uinxFXgLSVxZwcK8KWBhwDp3TAhBKFF\u002BUeelpBbR6rBBx6Ww8TaSlISw4z3LnZZqWnvyTLl8dJkvX1Idr0znaOWOoR1sif8TX526YGUZ6MhR6sg3S7aBjm0lj9sxlDjPbGH2QCjty4o7L3E1EqVu\u002BGgfDFeigBBa\u002BysIxRUdKhaP3VUYOTekZasDAK9yIAuSPLL28\u002Bg\u002Bjl5HLldnAuSrxa0zRakzncfGcVucVeHHcWtdvowkVenKl1477\u002Brr\u002B5VerW9cnGOzWGdOUCu1IU6YawCt\u002B7q0n1fjvzUQZdI247/XEe3YprRbchgXOAlIZ6Ozi54vWUaRWihyrBaGj5wulf7wB/X6hdd4y2s6FYZz\u002B3pytZyjb3cVeqIfMlje6LozVWZh3NrXlCex6oxbDVGMGgCqiIaOPhbGLdlOiKXz2paKmRWplcLwT75fKj298ogsdDwIKi/Ozn5pIJud11oPWaUKWsFpHeDLjBXwyv19pbglyYtJrJqS/M4AWpdZNxBdqpwM\u002BxqIGkYD7QZqlviszng1rP2u\u002BvPR0Z0DjvN3Gxz37nzHeaydebpwQ7Joo0nCXfL6zkS0zvV/v9XHtndq8trkBwCS1pskIobSfu\u002BVKiAiUjXmuKfU8Wnff8JT6vCpqamXXlhFbtVSPjQyctP2dPrBLPT9w67e3a9U2ot3vY6vdRcAUO2YXSl5r93LyYKzhpH24yQ\u002B0eOOJD8sjFv7\u002BvCFP0wh8fB0cRZzzZijxtqv1YPg248Xi891KzYdUr\u002B3efNeR\u002BQNo573bgXsH3Scm3Iq\u002BhEwpyOZU2FRzLAwbsArz6jJ8QZ0nDWk3evbjr8nI5XW8SYLE1zDeEvJGSTJb0u2VTfmmZlK5cFWg3jf8PBtr0ulDg647jt6tN6RgRrJajWgAc/rGGZ17ujWc5WcBheePtunK1mQeRpIu0EIol/ESM4incMvI9IIrZ0VpSqi1GQ1DMcNMO4AP51oNE6fKZWOn1\u002B/HKuWXmD4/Rs33jnqeXvSSr1lUDtbNWTAgxpOK/Q4SmkH0S\u002BsJGnenb15q9GoOCayuFG0h2wL47ZwqGkk6Q0lGffbhtiyAWpa62IlDE8KcHKm2Tx0qlY78VK9fn6tY7PYENC3t69v596enp2eUnuyWu/q17rgKFXwgMG0UjkPqtdRHUmbi\u002BKW/OrLgs4mPiCtLGwUUawUgrgBSEeMWo2j43hrAIFv7awAMzVrf\u002BIAh8/U6986VCq9ACy9kp69e3Bw5I09PQPlMNziAje6WhcKrru5bm1BATkLFFwRV5Te4Kjkug6B0npQK5WNfpoH4lsz2dm7ATIXiFQCEau0vqSUqqS1nq8bU5kNw/HAmFoITA6m00VrzPzp2dnZS/V65eXrLM9oEWdXb\u002B/A7nR6eGsqlZ81ZhTWjmQ9b6zfcQoudM634YhA9SlBj1LoVUr1JuNpA1Epx9mcNBYLII6btNL5xV4KAWOVqgowl9b6cihSK/n\u002BeN3asmg9vcF1X56oVksXwrB2tFot4trMZyzLRqBnWzY7ONrTk9ueTg8Vw7Cggc09WhdcIDfoeRsq1m50RWkL2egoaCXIi1J9UVJf1IV4UdxU0tEG1l60EBsPo5rW2ul4pbgIpWppxynONJvjVWOmoFR5IJ0\u002Beb5SmZ0ol2eu1XXvRERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERNe3/wOxabcDNmswcQAAAABJRU5ErkJggg==","format":"png","height":200,"offset":483,"size":7144,"width":200}]},"build":{"currentObject":-1,"m486Names":false,"m486Numbers":false,"objects":[]},"duration":0,"pauseDuration":0,"rawExtrusion":0,"warmUpDuration":0,"layers":[],"lastDuration":null}}'
|
|
48
|
-
model.update_from_json(json_patch)
|
|
49
|
-
|
|
50
|
-
def test_json_serialization(self):
|
|
51
|
-
with open('object_model/model_duet5mini.json') as fp:
|
|
52
|
-
json_data = json.load(fp)
|
|
53
|
-
model = ObjectModel.from_json(json_data)
|
|
54
|
-
json_text = json.dumps(json_data, sort_keys=True)
|
|
55
|
-
self.assertEqual(json_text, str(model))
|
|
56
|
-
|
|
57
|
-
def test_messages(self):
|
|
58
|
-
from src.dsf.object_model.messages import MessageType
|
|
59
|
-
|
|
60
|
-
model = ObjectModel()
|
|
61
|
-
json_patch = '{"messages":[{"content":"File 0:/gcodes/Veil_Token.gcode will print in 0h 14m plus heating time","time":"2022-12-31T16:42:22.8058935+00:00","type":0}]}'
|
|
62
|
-
model.update_from_json(json_patch)
|
|
63
|
-
self.assertEqual(len(model.messages), 1)
|
|
64
|
-
self.assertEqual(str(model.messages[0].time), "2022-12-31 16:42:22.805893+00:00")
|
|
65
|
-
self.assertEqual(model.messages[0].type, MessageType.Success)
|
|
66
|
-
|
|
67
|
-
json_patch = '{"messages":[]}'
|
|
68
|
-
model.update_from_json(json_patch)
|
|
69
|
-
self.assertEqual(len(model.messages), 0)
|
|
70
|
-
|
|
71
|
-
def test_move_kinematics(self):
|
|
72
|
-
from src.dsf.object_model.move.kinematics import CoreKinematics, DeltaKinematics, KinematicsName
|
|
73
|
-
|
|
74
|
-
model = ObjectModel()
|
|
75
|
-
json_patch = '{"move": {"kinematics": {"name": "delta","deltaRadius": 123}}}'
|
|
76
|
-
model.update_from_json(json_patch)
|
|
77
|
-
|
|
78
|
-
self.assertIsInstance(model.move.kinematics, DeltaKinematics)
|
|
79
|
-
self.assertEqual(model.move.kinematics.name, KinematicsName.delta)
|
|
80
|
-
self.assertEqual(model.move.kinematics.delta_radius, 123)
|
|
81
|
-
|
|
82
|
-
# Switch to CoreXY (eg: M669 K1)
|
|
83
|
-
json_patch = '{"move":{"kinematics":{"forwardMatrix":[[0.5,0.5,0],[0.5,-0.5,0],[0,0,1]],"inverseMatrix":[[1,1,0],[1,-1,0],[0,0,1]],"tiltCorrection":{"correctionFactor":1,"lastCorrections":[],"maxCorrection":1,"screwPitch":0.5,"screwX":[],"screwY":[]},"name":"coreXY","segmentation":null}}}'
|
|
84
|
-
model.update_from_json(json_patch)
|
|
85
|
-
self.assertIsInstance(model.move.kinematics, CoreKinematics)
|
|
86
|
-
self.assertEqual(model.move.kinematics.name, KinematicsName.coreXY)
|
|
87
|
-
|
|
88
|
-
# Switch to linear delta (eg: M669 K3)
|
|
89
|
-
json_patch = '{"move":{"kinematics":{"deltaRadius":105.6,"homedHeight":240,"printRadius":80,"towers":[{"angleCorrection":0,"diagonal":215,"endstopAdjustment":0,"xPos":-91.452,"yPos":-52.8},{"angleCorrection":0,"diagonal":215,"endstopAdjustment":0,"xPos":91.452,"yPos":-52.8},{"angleCorrection":0,"diagonal":215,"endstopAdjustment":0,"xPos":0,"yPos":105.6}],"xTilt":0,"yTilt":0,"name":"delta","segmentation":null}}}'
|
|
90
|
-
model.update_from_json(json_patch)
|
|
91
|
-
self.assertIsInstance(model.move.kinematics, DeltaKinematics)
|
|
92
|
-
self.assertEqual(model.move.kinematics.name, KinematicsName.delta)
|
|
93
|
-
self.assertEqual(model.move.kinematics.delta_radius, 105.6)
|
|
94
|
-
|
|
95
|
-
def test_plugins(self):
|
|
96
|
-
model = ObjectModel()
|
|
97
|
-
self.assertEqual(len(model.plugins), 0)
|
|
98
|
-
|
|
99
|
-
# Plugin installation
|
|
100
|
-
json_patch = '{"plugins":{"ExecOnMcode":{"dsfFiles":["execOnMcode.py","http_endpoints.py","MCodeAction.py","__init__.py"],"dwcFiles":["js/ExecOnMcode.09113059.js","js/ExecOnMcode.09113059.js.gz","js/ExecOnMcode.09113059.js.map","js/ExecOnMcode.09113059.js.map.gz"],"sdFiles":["sys/ExecOnMcode/top-example.py"],"pid":-1,"id":"ExecOnMcode","name":"ExecOnMcode","author":"Lo\u00EFc GRENON","version":"0.2","license":"GPL-3.0-or-later","homepage":"https://github.com/LoicGRENON/DSF_ExecOnMcode_Plugin","tags":[],"dwcVersion":"3.4.5","dwcDependencies":[],"sbcRequired":true,"sbcDsfVersion":"3.4.5","sbcExecutable":"execOnMcode.py","sbcExecutableArguments":null,"sbcExtraExecutables":[],"sbcOutputRedirected":true,"sbcPermissions":["commandExecution","codeInterceptionRead","registerHttpEndpoints","fileSystemAccess","launchProcesses"],"sbcPackageDependencies":[],"sbcPythonDependencies":["dsf-python\u003E=3.4.5"],"sbcPluginDependencies":[],"rrfVersion":null,"data":{}}}}'
|
|
101
|
-
model.update_from_json(json_patch)
|
|
102
|
-
self.assertEqual(len(model.plugins), 1)
|
|
103
|
-
self.assertIsInstance(model.plugins.get('ExecOnMcode'), Plugin)
|
|
104
|
-
self.assertEqual(len(model.plugins['ExecOnMcode'].dsf_files), 4)
|
|
105
|
-
self.assertEqual(len(model.plugins['ExecOnMcode'].sbc_permissions), 5)
|
|
106
|
-
self.assertEqual(model.plugins['ExecOnMcode'].pid, -1)
|
|
107
|
-
|
|
108
|
-
# Plugin start
|
|
109
|
-
json_patch = '{"plugins":{"ExecOnMcode":{"pid":1125}}}'
|
|
110
|
-
model.update_from_json(json_patch)
|
|
111
|
-
self.assertEqual(model.plugins['ExecOnMcode'].pid, 1125)
|
|
112
|
-
|
|
113
|
-
# Plugin removal
|
|
114
|
-
json_patch = '{"plugins":{"ExecOnMcode":null}}'
|
|
115
|
-
model.update_from_json(json_patch)
|
|
116
|
-
self.assertEqual(len(model.plugins), 0)
|
|
117
|
-
|
|
118
|
-
def test_sensors_filament_monitor(self):
|
|
119
|
-
from src.dsf.object_model.sensors.filament_monitors import FilamentMonitorType
|
|
120
|
-
|
|
121
|
-
model = ObjectModel()
|
|
122
|
-
self.assertEqual(len(model.sensors.filament_monitors), 0)
|
|
123
|
-
|
|
124
|
-
# Change filament monitor to Simple (eg: M591 D0 P1 C"io2.in" S1)
|
|
125
|
-
json_patch = '{"sensors":{"filamentMonitors":[{"enabled":true,"status":"ok","type":"simple"}]}}'
|
|
126
|
-
model.update_from_json(json_patch)
|
|
127
|
-
self.assertEqual(len(model.sensors.filament_monitors), 1)
|
|
128
|
-
self.assertEqual(model.sensors.filament_monitors[0].type, FilamentMonitorType.Simple)
|
|
129
|
-
|
|
130
|
-
# Change filament monitor to Pulsed (rg: M591 D0 P7 C"io2.in" S1)
|
|
131
|
-
json_patch = '{"sensors":{"filamentMonitors":[{"calibrated":null,"configured":{"mmPerPulse":1,"percentMax":160,"percentMin":60,"sampleDistance":5},"enabled":true,"status":"ok","type":"pulsed"}]}}'
|
|
132
|
-
model.update_from_json(json_patch)
|
|
133
|
-
self.assertEqual(len(model.sensors.filament_monitors), 1)
|
|
134
|
-
self.assertEqual(model.sensors.filament_monitors[0].type, FilamentMonitorType.Pulsed)
|
|
135
|
-
|
|
136
|
-
def test_user_sessions(self):
|
|
137
|
-
from src.dsf.object_model import AccessLevel, SessionType
|
|
138
|
-
|
|
139
|
-
model = ObjectModel()
|
|
140
|
-
self.assertEqual(len(model.user_sessions), 0)
|
|
141
|
-
|
|
142
|
-
json_patch = '{"userSessions":[{"accessLevel":"readWrite","id":2,"origin":"::ffff:192.168.1.200","originId":-1,"sessionType":"http"}]}'
|
|
143
|
-
model.update_from_json(json_patch)
|
|
144
|
-
self.assertEqual(len(model.user_sessions), 1)
|
|
145
|
-
self.assertEqual(model.user_sessions[0].access_level, AccessLevel.readWrite)
|
|
146
|
-
self.assertEqual(model.user_sessions[0].session_type, SessionType.http)
|
|
147
|
-
|
|
148
|
-
if __name__ == '__main__':
|
|
149
|
-
unittest.main()
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import threading
|
|
2
|
-
import os
|
|
3
|
-
import pathlib
|
|
4
|
-
import socket
|
|
5
|
-
import time
|
|
6
|
-
import importlib.util
|
|
7
|
-
|
|
8
|
-
here = pathlib.Path(__file__).parent.parent.resolve()
|
|
9
|
-
example_path = here / "examples/send_simple_code.py"
|
|
10
|
-
|
|
11
|
-
spec = importlib.util.spec_from_file_location("send_simple_code", example_path)
|
|
12
|
-
send_simple_code = importlib.util.module_from_spec(spec)
|
|
13
|
-
spec.loader.exec_module(send_simple_code)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def test_send_simple_code(monkeypatch, tmp_path):
|
|
17
|
-
mock_dcs_socket_file = os.path.join(tmp_path, "dsf.socket")
|
|
18
|
-
monkeypatch.setattr(
|
|
19
|
-
"dsf.connections.CommandConnection.connect.__defaults__",
|
|
20
|
-
(mock_dcs_socket_file,),
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
dcs_passed = threading.Event()
|
|
24
|
-
|
|
25
|
-
def mock_dcs():
|
|
26
|
-
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
27
|
-
server.bind(mock_dcs_socket_file)
|
|
28
|
-
server.listen(1)
|
|
29
|
-
conn, _ = server.accept()
|
|
30
|
-
conn.sendall('{"version":11, "id":"foobar"}'.encode())
|
|
31
|
-
assert conn.recv(1024) == b'{"mode":"Command","version":11}'
|
|
32
|
-
conn.sendall('{"success":true}'.encode())
|
|
33
|
-
assert conn.recv(1024) == b'{"command":"SimpleCode","Code":"M115","Channel":"SBC"}'
|
|
34
|
-
conn.sendall('{"result":"fake code executed", "success":true}'.encode())
|
|
35
|
-
conn.close()
|
|
36
|
-
dcs_passed.set() # indicate that all asserts passed and the mock_dcs is shutting down
|
|
37
|
-
|
|
38
|
-
thread = threading.Thread(target=mock_dcs, daemon=True)
|
|
39
|
-
thread.start()
|
|
40
|
-
time.sleep(1)
|
|
41
|
-
|
|
42
|
-
send_simple_code.send_simple_code()
|
|
43
|
-
|
|
44
|
-
thread.join()
|
|
45
|
-
|
|
46
|
-
assert dcs_passed.is_set()
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import threading
|
|
2
|
-
import os
|
|
3
|
-
import pathlib
|
|
4
|
-
import socket
|
|
5
|
-
import time
|
|
6
|
-
import importlib.util
|
|
7
|
-
|
|
8
|
-
here = pathlib.Path(__file__).parent.parent.resolve()
|
|
9
|
-
example_path = here / "examples/subscribe_object_model.py"
|
|
10
|
-
spec = importlib.util.spec_from_file_location("subscribe_object_model", example_path)
|
|
11
|
-
subscribe_object_model = importlib.util.module_from_spec(spec)
|
|
12
|
-
spec.loader.exec_module(subscribe_object_model)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def test_subscribe_object_model(monkeypatch, tmp_path):
|
|
16
|
-
mock_dcs_socket_file = os.path.join(tmp_path, "dsf.socket")
|
|
17
|
-
monkeypatch.setattr(
|
|
18
|
-
"dsf.connections.SubscribeConnection.connect.__defaults__",
|
|
19
|
-
(mock_dcs_socket_file,),
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
dcs_passed = threading.Event()
|
|
23
|
-
|
|
24
|
-
def mock_dcs():
|
|
25
|
-
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
26
|
-
server.bind(mock_dcs_socket_file)
|
|
27
|
-
server.listen(1)
|
|
28
|
-
conn, _ = server.accept()
|
|
29
|
-
conn.sendall('{"version":11, "id":"foobar"}'.encode())
|
|
30
|
-
assert (
|
|
31
|
-
conn.recv(1024)
|
|
32
|
-
== b'{"mode":"Subscribe","version":11,"SubscriptionMode":"Patch","Filter":"","Filters":null}'
|
|
33
|
-
)
|
|
34
|
-
conn.sendall('{"success":true}'.encode())
|
|
35
|
-
conn.sendall('{"boards":"fake-data", "job":"fake-data", "state":"fake-data"}'.encode())
|
|
36
|
-
assert conn.recv(1024) == b'{"command":"Acknowledge"}'
|
|
37
|
-
conn.sendall('{"boards":"some-other-fake-data"}'.encode())
|
|
38
|
-
assert conn.recv(1024) == b'{"command":"Acknowledge"}'
|
|
39
|
-
conn.sendall('{"job":"some-other-fake-data"}'.encode())
|
|
40
|
-
assert conn.recv(1024) == b'{"command":"Acknowledge"}'
|
|
41
|
-
conn.sendall('{"state":"some-other-fake-data"}'.encode())
|
|
42
|
-
assert conn.recv(1024) == b'{"command":"Acknowledge"}'
|
|
43
|
-
conn.close()
|
|
44
|
-
dcs_passed.set() # indicate that all asserts passed and the mock_dcs is shutting down
|
|
45
|
-
|
|
46
|
-
thread = threading.Thread(target=mock_dcs, daemon=True)
|
|
47
|
-
thread.start()
|
|
48
|
-
time.sleep(1)
|
|
49
|
-
|
|
50
|
-
subscribe_object_model.subscribe()
|
|
51
|
-
|
|
52
|
-
thread.join()
|
|
53
|
-
|
|
54
|
-
assert dcs_passed.is_set()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/base_command_connection.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dsf-python-3.4.6.post2 → dsf-python-3.4.6.post3}/src/dsf/connections/init_messages/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|