swbt-python 0.5.4__tar.gz → 0.6.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.
- {swbt_python-0.5.4 → swbt_python-0.6.0}/PKG-INFO +4 -4
- {swbt_python-0.5.4 → swbt_python-0.6.0}/README.md +1 -1
- {swbt_python-0.5.4 → swbt_python-0.6.0}/pyproject.toml +5 -5
- swbt_python-0.6.0/spec/complete/unit_087/PYTHON_313_RUNTIME_FLOOR.md +187 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/hardware-test-log.md +6 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_ci_workflow.py +1 -1
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_package_metadata.py +13 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/AGENTS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/LICENSE +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/examples/hardware_bringup.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/examples/pairing_probe.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/examples/tap_a.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_001/M0_PROTOCOL_CORE.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_002/M1_SWITCH_GAMEPAD_FAKE_TRANSPORT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_003/M2_BUMBLE_HID_TRANSPORT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_004/M3_PAIRING_L2CAP.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_005/M4_SUBCOMMAND_RESPONDER_HARDWARE.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_006/M5_INPUT_OPERATION_API.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_007/M6_RECONNECT_KEYSTORE_DIAGNOSTICS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_008/M7_PACKAGING_EXAMPLES_CLI.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_009/PORTING_SOURCE_AUDIT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_010/DIAGNOSTICS_TRACE_SCHEMA.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_011/HARDWARE_TEST_LOG_MATRIX.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_012/INITIAL_RELEASE_GATE.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_013/POST_M5_INPUT_SEMANTIC_CHARACTERIZATION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_014/DEVICE_CLOSE_GRACEFUL_DISCONNECT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_015/CONTEXT_MANAGER_RESOURCE_SCOPE.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_016/JSON_KEY_STORE_CURRENT_PREVIOUS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_017/SWITCH_GAMEPAD_API_HARDENING.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_018/KEY_STORE_TRANSPORT_BOUNDARY.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_019/TRANSPORT_RECONNECT_CONTRACT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_020/STRUCTURAL_REFACTOR_BOUNDARIES.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_021/SWITCH_GAMEPAD_INPUT_API_CONTRACT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_022/PUBLIC_API_USAGE_HARDWARE_DOCS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_023/MKDOCS_DOCUMENTATION_SITE.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_024/STICK_INPUT_SHORTHAND_API.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_025/IMU_INPUT_SHORTHAND_API.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_026/LINUX_MACOS_ADAPTER_EXPERIMENTAL.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_027/ADAPTER_DISCOVERY_API.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_028/CONTROLLER_PROFILE_CUSTOMIZATION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_029/CONTROLLER_PROFILE_INJECTION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_030/JOYCON_PROFILE_IDENTITY_SPI.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_031/JOYCON_INPUT_REPORT_MAPPING.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_032/PROFILE_AWARE_SUBCOMMAND_STATE.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_033/PROFILE_AWARE_BUMBLE_SDP.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_034/JOYCON_CONVENIENCE_API_DOCS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_035/JOYCON_DEVICE_INFO_ADDRESS_WIRING.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_036/JOYCON_SDP_IDENTITY_POLICY.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_037/JOYCON_DEFAULT_CONTROLLER_COLORS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_038/REARCHITECTURE_DECISION_BOUNDARY_TESTS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_039/CONTROLLER_RUNTIME_EXTRACTION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_040/PUBLIC_CONTROLLER_API_MODEL.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_041/CONTROLLER_CONFIG_PROFILE_OWNERSHIP.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_042/INTERNAL_TRANSPORT_FACTORY.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_043/PROTOCOL_PROFILE_MODULE_SPLIT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_044/REARCHITECTURE_DOCS_RELEASE_MATRIX.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_045/INTERNAL_API_BOUNDARY_CLEANUP.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_046/HARDWARE_PROFILE_TEST_SCENARIOS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_047/VIRTUAL_GYRO_CALIBRATION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_048/VIRTUAL_ACCELEROMETER_CALIBRATION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_049/IMU_SESSION_AND_ENCODING_REDESIGN.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_050/DIRECT_REPORTING_TYPES.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_051/CSR_BD_ADDR_REWRITE_EXPERIMENT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_052/EXP_LOCAL_ADDRESS_PROFILE.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_053/EXP_LOCAL_ADDRESS_PROFILE_JOYCON.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_054/EXP_LOCAL_ADDRESS_PROFILE_DIRECT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_055/REMOVE_NATIVE_KEY_STORE_API.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_056/PAIRING_PROFILE_NAMING.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_057/PAIRING_PROFILE_CONTROLLER_KIND.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_058/MULTI_ADDRESS_RECONNECT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_059/EXPERIMENTAL_DIRECT_SEND_TIMING_PROBE.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_060/HCI_ACL_COMPLETION_CORRELATION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_061/EXPERIMENTAL_CLASSIC_LINK_POLICY_AB.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_062/PERIODIC_ACL_DRAIN_CHARACTERIZATION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_063/PERIODIC_NO_DRAIN_CHARACTERIZATION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_064/BUMBLE_ENQUEUE_COMPLETION_CONTRACT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_065/PERIODIC_DEADLINE_SCHEDULER.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_066/PAIRING_PROFILE_DEFAULT_ADDRESS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_067/DEFAULT_BATTERY_STATUS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_068/DIRECT_PRE_CLOSE_INPUT_REFLECTION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_069/CONTROLLER_HANDSHAKE_READINESS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_070/DIAGNOSTICS_AND_UNUSED_PATHS_CLEANUP.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_071/CONTROLLER_CONSTRUCTION_PATH.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_072/CONNECTION_RUNTIME_INTEGRATION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_073/TEST_CONTRACT_BOUNDARY_CLEANUP.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_074/PUBLIC_GAMEPAD_IMPLEMENTATION_OWNERSHIP.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_075/CONCRETE_CONTROLLER_MODULE.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_076/HARDWARE_HAPPY_CASE_VALIDATION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_077/RUNTIME_INPUT_UPDATE_DISPATCH.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_078/TEST_RUNTIME_FIXTURES.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_079/PAIRING_PROFILE_KEY_STORE.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_080/TRANSPORT_PROTOCOL_CONTRACT.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_081/PROTOCOL_HANDSHAKE.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_082/REPLY_HOLDOFF_VALIDATION.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_083/PROFILE_SCHEMA_V2_CURRENT_KEY_ONLY.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_086/NORMAL_INPUT_READINESS.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/dev-journal.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/initial/README.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/initial/api.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/initial/architecture.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/initial/lifecycle.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/initial/naming.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/initial/protocol.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/initial/risks.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/initial/roadmap.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/initial/testing.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/initial/transport-bumble.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/rearchitecture/01-design-change-overview.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/rearchitecture/02-as-is-to-be.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/rearchitecture/03-public-api-config-profile.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/rearchitecture/04-runtime-profile-transport-details.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/rearchitecture/05-milestones-implementation.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/rearchitecture/README.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/rearchitecture/mkdocs-nav-snippet.yml +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/spec/wip/unit_084/BUMBLE_0_0_233.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/__init__.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/adapter_discovery.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/diagnostics.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/errors.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/gamepad/__init__.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/gamepad/_config.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/gamepad/connection.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/gamepad/constants.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/gamepad/controllers.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/gamepad/interface.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/gamepad/output.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/gamepad/protocol_handshake.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/gamepad/runtime.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/gamepad/transport_factory.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/imu.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/input.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/probe.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/__init__.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/buttons.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/descriptors.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/imu_report.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/input_report.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/output_report.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/profiles/__init__.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/profiles/base.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/profiles/joycon.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/profiles/pro_controller.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/rumble.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/session.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/spi.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/protocol/subcommand.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/py.typed +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/report_loop.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/state_store.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/__init__.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/_adapter_identity.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/_bumble_acl.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/_bumble_hidp.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/_bumble_key_store.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/_bumble_lifecycle.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/_bumble_sdp.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/_bumble_usb_devices.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/_csr_bd_addr.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/_csr_bd_addr_harness.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/_pairing_profile.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/base.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/bumble.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/src/swbt/transport/fake.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/__init__.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/conftest.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/gamepad_factory.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/hardware/README.md +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/hardware/test_battery_status.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/hardware/test_bumble_transport.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/hardware/test_close_disconnect.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/hardware/test_context_manager_resource_scope.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/hardware/test_controller_colors.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/hardware/test_multi_address_reconnect.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/hardware/test_pairing_l2cap.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/hardware/test_pairing_profile.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/hardware/test_reply_holdoff.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/integration/__init__.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/integration/test_examples.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/integration/test_pairing_profile.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/integration/test_switch_gamepad_fake_transport.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/__init__.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/fixtures/source_audit/switch_protocol_values.toml +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_adapter_discovery.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_adapter_identity.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_bumble_acl.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_bumble_hidp.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_bumble_lifecycle.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_bumble_sdp.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_bumble_transport.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_csr_bd_addr_experiment.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_csr_bd_addr_harness.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_diagnostics.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_gamepad_config.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_gamepad_connection_workflow.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_gamepad_output_dispatcher.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_gamepad_transport_factory.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_imu_report.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_input_report.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_input_state.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_output_report.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_package_import.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_pairing_profile.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_pairing_profile_runtime.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_probe_cli.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_protocol_boundary.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_protocol_handshake.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_protocol_profile.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_protocol_session.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_public_api_boundary.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_publish_workflow.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_report_loop.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_rumble_state.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_source_audit_fixtures.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_subcommand_responder.py +0 -0
- {swbt_python-0.5.4 → swbt_python-0.6.0}/tests/unit/test_virtual_spi_flash.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: swbt-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0
|
|
4
4
|
Summary: Python library for presenting an NX-compatible virtual Bluetooth HID input device.
|
|
5
5
|
Keywords: bluetooth,bluetooth-hid,controller,gamepad,hid,nx
|
|
6
6
|
Author: niart120
|
|
@@ -14,14 +14,14 @@ Classifier: Operating System :: MacOS
|
|
|
14
14
|
Classifier: Operating System :: Microsoft :: Windows
|
|
15
15
|
Classifier: Operating System :: POSIX :: Linux
|
|
16
16
|
Classifier: Programming Language :: Python :: 3
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
19
|
Classifier: Topic :: Software Development :: Libraries
|
|
20
20
|
Classifier: Typing :: Typed
|
|
21
21
|
Requires-Dist: bumble==0.0.233
|
|
22
22
|
Maintainer: niart120
|
|
23
23
|
Maintainer-email: niart120 <38847256+niart120@users.noreply.github.com>
|
|
24
|
-
Requires-Python: >=3.
|
|
24
|
+
Requires-Python: >=3.13
|
|
25
25
|
Description-Content-Type: text/markdown
|
|
26
26
|
|
|
27
27
|
# swbt-python
|
|
@@ -32,7 +32,7 @@ NX 向けの仮想 Bluetooth HID 入力デバイスを Python から扱うため
|
|
|
32
32
|
|
|
33
33
|
## 必要なもの
|
|
34
34
|
|
|
35
|
-
- Python 3.
|
|
35
|
+
- Python 3.13 以降
|
|
36
36
|
- uv
|
|
37
37
|
- Bumble が利用可能な専用 USB Bluetooth ドングル
|
|
38
38
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "swbt-python"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.6.0"
|
|
4
4
|
description = "Python library for presenting an NX-compatible virtual Bluetooth HID input device."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
authors = [
|
|
@@ -9,7 +9,7 @@ authors = [
|
|
|
9
9
|
maintainers = [
|
|
10
10
|
{ name = "niart120", email = "38847256+niart120@users.noreply.github.com" }
|
|
11
11
|
]
|
|
12
|
-
requires-python = ">=3.
|
|
12
|
+
requires-python = ">=3.13"
|
|
13
13
|
license = "MIT"
|
|
14
14
|
license-files = ["LICENSE"]
|
|
15
15
|
keywords = [
|
|
@@ -28,8 +28,8 @@ classifiers = [
|
|
|
28
28
|
"Operating System :: Microsoft :: Windows",
|
|
29
29
|
"Operating System :: POSIX :: Linux",
|
|
30
30
|
"Programming Language :: Python :: 3",
|
|
31
|
-
"Programming Language :: Python :: 3.12",
|
|
32
31
|
"Programming Language :: Python :: 3.13",
|
|
32
|
+
"Programming Language :: Python :: 3.14",
|
|
33
33
|
"Topic :: Software Development :: Libraries",
|
|
34
34
|
"Typing :: Typed",
|
|
35
35
|
]
|
|
@@ -75,7 +75,7 @@ source-exclude = [
|
|
|
75
75
|
line-length = 100
|
|
76
76
|
required-version = ">=0.15.16"
|
|
77
77
|
src = ["src", "tests"]
|
|
78
|
-
target-version = "
|
|
78
|
+
target-version = "py313"
|
|
79
79
|
|
|
80
80
|
[tool.ruff.format]
|
|
81
81
|
docstring-code-format = true
|
|
@@ -130,7 +130,7 @@ strict = true
|
|
|
130
130
|
known-first-party = ["swbt"]
|
|
131
131
|
|
|
132
132
|
[tool.ty.environment]
|
|
133
|
-
python-version = "3.
|
|
133
|
+
python-version = "3.13"
|
|
134
134
|
root = ["./src"]
|
|
135
135
|
|
|
136
136
|
[tool.ty.src]
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Python 3.13 最低実行バージョン仕様書
|
|
2
|
+
|
|
3
|
+
## 1. 概要
|
|
4
|
+
|
|
5
|
+
### 1.1 目的
|
|
6
|
+
|
|
7
|
+
Windows上のPython 3.12では、`time.monotonic_ns()`と`asyncio` event loopが
|
|
8
|
+
`GetTickCount64()`の15.625 ms分解能に制約され、8 ms周期のquaternion IMU入力に
|
|
9
|
+
カクつきが発生した。report生成やevent loopへ個別の時計補正を入れず、最低実行
|
|
10
|
+
バージョンをPython 3.13へ引き上げる。CIでは最低バージョンの3.13と次の安定版
|
|
11
|
+
3.14を検証する。
|
|
12
|
+
|
|
13
|
+
### 1.2 起点 / source
|
|
14
|
+
|
|
15
|
+
| source | 内容 | path |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| GitHub Issue | 8 ms送信時の周期的なカクつきとHCI credit仮説 | `https://github.com/niart120/swbt-python/issues/152` |
|
|
18
|
+
| hardware observation | Python 3.12.10では8 ms区間がカクつき、Python 3.13.5では同条件でカクつきなし | `spec/hardware-test-log.md` |
|
|
19
|
+
| local characterization | Python 3.12.10の`monotonic_ns()`は15.625 ms分解能、Python 3.13.5は100 ns分解能 | 2026-07-27のruntime比較 |
|
|
20
|
+
| user decision | clock実装を変更せず、最低Pythonを3.13へ引き上げ、CIへ3.14を追加する | 2026-07-27 |
|
|
21
|
+
|
|
22
|
+
### 1.3 use case
|
|
23
|
+
|
|
24
|
+
| actor / boundary | 入力または状態 | 期待する観測結果 | 制約 |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| package利用者 | Python 3.13以上でinstallする | package metadataが対応runtimeを明示する | Python 3.12は対応対象外 |
|
|
27
|
+
| contributor | CIを実行する | Python 3.13 / 3.14のunit、integration、buildを検証する | hardware gateは含めない |
|
|
28
|
+
| Direct / Periodic利用者 | 8 ms周期の入力を扱う | CPython 3.13以降の高分解能なmonotonic clockを利用する | OS負荷による起床遅延までは保証しない |
|
|
29
|
+
|
|
30
|
+
## 2. 対象範囲
|
|
31
|
+
|
|
32
|
+
- `requires-python`を`>=3.13`へ変更する。
|
|
33
|
+
- Python classifierを3.13 / 3.14へ揃える。
|
|
34
|
+
- RuffとtyのPython対象バージョンを3.13へ変更する。
|
|
35
|
+
- CI matrixをPython 3.13 / 3.14へ変更する。
|
|
36
|
+
- Bumble canaryを最低対応バージョンのPython 3.13で実行する。
|
|
37
|
+
- READMEと実機準備文書の必要Pythonバージョンを3.13へ変更する。
|
|
38
|
+
- lockfileのPython要件を更新する。
|
|
39
|
+
- package versionを0.6.0へ更新し、互換性変更と実機確認範囲をrelease notesへ記載する。
|
|
40
|
+
- Issue #152の実験用HCI / USB probeと実機観測を記録する。
|
|
41
|
+
|
|
42
|
+
## 3. 対象外
|
|
43
|
+
|
|
44
|
+
- `ReportSender`、`ReportLoop`、Bumble、`asyncio` event loopのclock変更。
|
|
45
|
+
- Python 3.12互換性の維持。
|
|
46
|
+
- 8 ms周期やOS scheduler精度の保証。
|
|
47
|
+
- HID report layout、IMU packing、既定report周期の変更。
|
|
48
|
+
- Bluetooth air capture、別adapter、別OS、別Switch firmwareへの一般化。
|
|
49
|
+
- TestPyPI / PyPI publish、tag、GitHub Release作成。
|
|
50
|
+
|
|
51
|
+
## 4. 関連 docs
|
|
52
|
+
|
|
53
|
+
- `README.md`
|
|
54
|
+
- `spec/initial/testing.md`
|
|
55
|
+
- `spec/initial/risks.md`
|
|
56
|
+
- `spec/complete/unit_049/IMU_SESSION_AND_ENCODING_REDESIGN.md`
|
|
57
|
+
- `spec/complete/unit_065/PERIODIC_DEADLINE_SCHEDULER.md`
|
|
58
|
+
|
|
59
|
+
## 5. 根拠監査
|
|
60
|
+
|
|
61
|
+
| 項目 | 要否 | 状態 | 根拠 / 理由 |
|
|
62
|
+
|---|---|---|---|
|
|
63
|
+
| Switch HID / report bytes | not required | done | report生成実装とbyte layoutは変更しない |
|
|
64
|
+
| Bumble / transport | required | done | Bumble 0.0.230 / 0.0.233差では症状が変わらず、credit待ち最大0を実測した |
|
|
65
|
+
| Python clock | required | done | 対象Windows環境で3.12.10と3.13.5のclock implementationと分解能を取得した |
|
|
66
|
+
| OS / driver / adapter | required for observation | done | Windows 11 / CSR8510 A10 / WinUSB / `usb:0`で比較した。別環境へ一般化しない |
|
|
67
|
+
|
|
68
|
+
### 根拠監査の結果
|
|
69
|
+
|
|
70
|
+
| 項目 | 値 / 判断 | 根拠分類 | source | status |
|
|
71
|
+
|---|---|---|---|---|
|
|
72
|
+
| Python 3.12.10 Windows monotonic | `GetTickCount64()`、分解能15.625 ms | runtime fact | `time.get_clock_info("monotonic")` | done |
|
|
73
|
+
| Python 3.13.5 Windows monotonic | `QueryPerformanceCounter()`、分解能100 ns | runtime fact | `time.get_clock_info("monotonic")` | done |
|
|
74
|
+
| Python / Bumble比較 | 3.12.10ではBumble 0.0.230 / 0.0.233の両方でカクつき、3.13.5 / 0.0.230ではカクつきなし | hardware observation | 実機matrix | done |
|
|
75
|
+
| HCI credit | 対象runのBumble queue待機packet最大0 | hardware observation | HCI credit probe | done |
|
|
76
|
+
| clock修正案 | `ReportSender`と`ReportLoop`の`perf_counter_ns()`化でPeriodicは滑らかになったが、Directはcaller schedulerの補正も必要だった | experimental observation | 修正後route比較 | done |
|
|
77
|
+
| final disposition | clock修正を製品へ採用せず、Python 3.13を最低対応runtimeとする | decision | user decision | done |
|
|
78
|
+
|
|
79
|
+
## 6. 振る舞い仕様
|
|
80
|
+
|
|
81
|
+
| 振る舞い | 入力・状態 | 期待結果 | 備考 |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| package runtime floor | package metadataを読む | `requires-python`が`>=3.13` | Python 3.12へのinstallを拒否する |
|
|
84
|
+
| supported classifiers | PyPI metadataを読む | Python 3.13 / 3.14を列挙し、3.12を列挙しない | 実機互換性の保証ではない |
|
|
85
|
+
| CI matrix | GitHub Actions CIを実行する | Ubuntu / macOSの各OSで3.13 / 3.14を検証する | Bumble / hardware testは実行しない |
|
|
86
|
+
| static target | Ruff / tyを実行する | 最低対応バージョン3.13を基準に解析する | 新しい構文の採用を要求しない |
|
|
87
|
+
| clock implementation | controllerを利用する | 既存の`monotonic_ns()`とclock注入境界を維持する | clockのglobal差し替えを行わない |
|
|
88
|
+
|
|
89
|
+
## 7. TDD Test List
|
|
90
|
+
|
|
91
|
+
| status | item | type | layer | hardware | notes |
|
|
92
|
+
|---|---|---|---|---|---|
|
|
93
|
+
| refactor-skipped | package metadataとstatic targetがPython 3.13以上を表す | regression | unit | no | REDは`requires-python >=3.12`で失敗。metadata変更後GREEN |
|
|
94
|
+
| refactor-skipped | CIがPython 3.13 / 3.14を実行する | regression | unit | no | REDはmatrix 3.12 / 3.13で失敗。workflow変更後GREEN |
|
|
95
|
+
| green | Python 3.13で標準gateが成功する | compatibility | gate | no | Python 3.13.5でstatic、451 unit、165 integration、buildがpass |
|
|
96
|
+
| green | Python 3.14でunit / integration / buildが成功する | compatibility | gate | no | Python 3.14.6を明示し、static、451 unit、165 integration、buildがpass |
|
|
97
|
+
|
|
98
|
+
## 8. 文書検証計画
|
|
99
|
+
|
|
100
|
+
READMEの対象読者はpackage利用者であり、install前に必要なPythonバージョンを判断できる
|
|
101
|
+
ことを確認する。正本は`pyproject.toml`の`requires-python`とする。README以外の公開
|
|
102
|
+
文書にはPython 3.12要件がないことを検索し、`docs-quality-review`で正本との一致を
|
|
103
|
+
確認する。
|
|
104
|
+
|
|
105
|
+
## 9. 設計メモ
|
|
106
|
+
|
|
107
|
+
- Python 3.13の採用理由は、今回のWindows実機で確認したclock分解能と画面観測である。
|
|
108
|
+
- Python 3.13でも`asyncio.sleep(0.008)`の正確な起床や125 Hzを保証しない。
|
|
109
|
+
- 3.14のCI追加は互換性検査であり、3.14固有機能の採用を意味しない。
|
|
110
|
+
- clock注入引数は決定的test用の内部境界として維持する。
|
|
111
|
+
|
|
112
|
+
## 10. 対象ファイル
|
|
113
|
+
|
|
114
|
+
| path | change | 内容 |
|
|
115
|
+
|---|---|---|
|
|
116
|
+
| `pyproject.toml` | modify | version 0.6.0、runtime floor、classifier、Ruff / ty target |
|
|
117
|
+
| `uv.lock` | modify | version 0.6.0、runtime floor |
|
|
118
|
+
| `.github/workflows/ci.yml` | modify | Python 3.13 / 3.14 matrix |
|
|
119
|
+
| `.github/workflows/bumble-canary.yml` | modify | Python 3.13 |
|
|
120
|
+
| `tests/unit/test_ci_workflow.py` | modify | CI matrix契約 |
|
|
121
|
+
| `tests/unit/test_package_metadata.py` | modify | package / static target契約 |
|
|
122
|
+
| `README.md` | modify | 必要Pythonバージョン |
|
|
123
|
+
| `docs/hardware.md` | modify | 実機準備の必要Pythonバージョン |
|
|
124
|
+
| `docs/release-notes.md` | modify | v0.6.0の互換性変更と実機確認範囲 |
|
|
125
|
+
| `tools/hci_credit_gyro_probe.py` | new | Issue #152実験用probe |
|
|
126
|
+
| `spec/hardware-test-log.md` | modify | 実験結果と不採用判断 |
|
|
127
|
+
| `spec/complete/unit_087/PYTHON_313_RUNTIME_FLOOR.md` | new | 完了した作業仕様 |
|
|
128
|
+
|
|
129
|
+
## 11. 検証
|
|
130
|
+
|
|
131
|
+
| command | result | notes |
|
|
132
|
+
|---|---|---|
|
|
133
|
+
| `uv run pytest tests/unit/test_ci_workflow.py tests/unit/test_package_metadata.py -q` | red, expected | CI matrixと`requires-python`が旧3.12境界のため2 failed、4 passed |
|
|
134
|
+
| 同focused testのGREEN再実行 | passed | 6 passed |
|
|
135
|
+
| `uv lock` | passed | 52 packages resolved |
|
|
136
|
+
| `uv sync --dev --python 3.13` | passed | Python 3.13.5、40 packages checked |
|
|
137
|
+
| Python 3.13.5 `ruff format --check` / `ruff check` / `ty check` | passed | 107 files formatted、lint / type errorなし |
|
|
138
|
+
| Python 3.13.5 `pytest tests/unit` | passed | 451 passed |
|
|
139
|
+
| Python 3.13.5 `pytest tests/integration` | passed | 165 passed |
|
|
140
|
+
| Python 3.13.5 `uv build` | passed | sdist / wheel生成 |
|
|
141
|
+
| `uv sync --dev --python 3.14` | passed | CPython 3.14.6を取得し、40 packages installed |
|
|
142
|
+
| `uv run --python 3.14 ruff format --check .` / `ruff check .` / `ty check --no-progress` | passed | runtimeを明示し、format / lint / type errorなし |
|
|
143
|
+
| `uv run --python 3.14 pytest tests/unit` | passed | Python 3.14.6、451 passed |
|
|
144
|
+
| `uv run --python 3.14 pytest tests/integration` | passed | Python 3.14.6、165 passed |
|
|
145
|
+
| `uv build --python 3.14` | passed | sdist / wheel生成。0.5.4 wheel metadataは`Requires-Python: >=3.13` |
|
|
146
|
+
| runtime指定なしの並列`uv run`による3.14検証 | invalid, rerun | `.python-version`の3.13を再選択したため判定に使用せず、全commandへ`--python 3.14`を明示して再実行 |
|
|
147
|
+
| `uv lock --check` | passed | 52 packages resolved |
|
|
148
|
+
| `git diff --check` | passed | whitespace errorなし |
|
|
149
|
+
| `uv run --python 3.13 --group docs mkdocs build --strict` | passed | 公開docsをstrict modeで生成 |
|
|
150
|
+
| v0.6.0 release gate: `uv sync --dev --group docs --python 3.13` | passed | local packageを0.6.0へ更新 |
|
|
151
|
+
| v0.6.0 release gate: Ruff / ty / unit / integration / MkDocs | passed | 451 unit、165 integration、static、docs strict build |
|
|
152
|
+
| `uv build` | passed | `swbt_python-0.6.0` wheel / sdistを生成 |
|
|
153
|
+
| `uvx --from twine twine check --strict dist\swbt_python-0.6.0-py3-none-any.whl dist\swbt_python-0.6.0.tar.gz` | passed | wheel / sdistともにPASSED |
|
|
154
|
+
|
|
155
|
+
### Docs Quality Review
|
|
156
|
+
|
|
157
|
+
- audience / task: package利用者がinstallまたは実機準備前に最低Pythonバージョンを判断する。
|
|
158
|
+
- documents: `README.md`、`docs/hardware.md`、`docs/release-notes.md`
|
|
159
|
+
- sources checked: `pyproject.toml`のversion / `requires-python`、classifiers、CI matrix、`v0.5.4..HEAD`と未コミット差分、`spec/hardware-test-log.md`
|
|
160
|
+
- must-fix: なし
|
|
161
|
+
- disposition: 利用要件をPython 3.13へ揃え、v0.6.0 release notesの先頭に破壊的変更、移行操作、実装非変更、CI範囲、実機確認と未確認範囲を記載した。
|
|
162
|
+
- verification: `uv run --python 3.13 --group docs mkdocs build --strict`がpass。
|
|
163
|
+
- remaining risk: Python 3.14の実機互換性は未検証であり、READMEでは保証していない。
|
|
164
|
+
|
|
165
|
+
## 12. 実機実行条件
|
|
166
|
+
|
|
167
|
+
| 項目 | 内容 |
|
|
168
|
+
|---|---|
|
|
169
|
+
| 今回の設定変更後実機検証 | not required |
|
|
170
|
+
| 理由 | 製品report / transport実装を変更せず、採用判断の根拠となる実機比較は完了済み |
|
|
171
|
+
| 過去の承認範囲 | dedicated `usb:0`、既存profile active reconnect、Direct / Periodic正Z yaw、neutral close、adapter release |
|
|
172
|
+
| artifact | `tmp/hardware/issue_152/credit-gyro-20260727/` |
|
|
173
|
+
|
|
174
|
+
## 13. 先送り事項
|
|
175
|
+
|
|
176
|
+
- Python 3.14でのSwitch実機検証は未実行。今回のCI追加は実機なしの互換性gateに限る。
|
|
177
|
+
- versionを0.6.0へ更新し、release notesを追加した。tag、PyPI / TestPyPI publish、GitHub Releaseはrelease実行時に扱う。
|
|
178
|
+
- 別OSにおける8 ms周期の実機表示は未検証。
|
|
179
|
+
|
|
180
|
+
## 14. チェックリスト
|
|
181
|
+
|
|
182
|
+
- [x] 対象範囲と対象外を確認した
|
|
183
|
+
- [x] TDD Test Listを更新した
|
|
184
|
+
- [x] 必要な根拠監査を記録した
|
|
185
|
+
- [x] 実機実行条件を記録した
|
|
186
|
+
- [x] 検証結果または未実行理由を記録した
|
|
187
|
+
- [x] docs-quality-reviewを完了した
|
|
@@ -6,6 +6,12 @@ Bumble adapter と対象機器に依存する観測を記録する正本であ
|
|
|
6
6
|
|
|
7
7
|
## Current Status
|
|
8
8
|
|
|
9
|
+
- 2026-07-27 unit_087 Python 3.12 experimental clock比較と採否: Windows `Windows-11-10.0.26200-SP0` / dedicated `usb:0` / CSR8510 A10 `0A12:0001` / WinUSB / Bumble 0.0.233 / Python 3.12.10 / swbt-python 0.5.4 (`e4b6b4e`と実験差分)で、`ReportSender`と`ReportLoop`の既定clockを試験的に`perf_counter_ns`へ変更し、既存profileによるactive reconnect後に正Z yaw `1.0 rad/s`を送信した。Switch model / firmwareとdriver assignmentはこのrunでは再確認していない。Directを8 ms → 16 ms → 8 msの各8秒で実行すると、連続IMU block一致は全区間0件になったが、8 ms区間のACL dispatchは908 / 897件、2 ms未満gapは435 / 424件で、利用者はカクつきを目視した。credit待ちは最大0であり、clock修正だけではDirect呼び出し側のPython 3.12 `asyncio` schedulingは改善しない。同じDirect probeでevent loop clockも診断用に`perf_counter`へ差し替えると、ACL reportは1000 / 501 / 1001件、8 ms gap平均8.0082 / 8.0009 ms、2 ms未満gap 0件、連続IMU block一致0件となり、利用者は回転が滑らかになったと目視した。Periodicはevent loopを差し替えず、実験的clock修正だけで8 ms × 8秒を実行し、ACL report 998件、gap平均8.0081 ms(min 6.0196、max 15.6433)、2 ms未満gap 0件、連続IMU block一致0件、credit待ち最大0となり、利用者は滑らかな回転を目視した。全runでprofile不変、event drop 0、cleanup完了を確認した。Bumble stderrの`no pending response future to set`は各runで1件出たが、processは終了コード0。承認範囲は`usb:0` open、既存profile active reconnect、HID control / interrupt、Direct / Periodic正Z yaw、neutral close、adapter releaseで、新規pairing、button / stick、BD_ADDR書換えは実行していない。最終判断では、このclock修正とevent loop差し替えを製品へ採用せず、最低Pythonバージョンを3.13へ引き上げる。artifactは`tmp/hardware/issue_152/credit-gyro-20260727/py312-perf-clock-direct/`、`py312-perf-clock-highres-loop-direct/`、`py312-perf-clock-periodic-8ms/`。
|
|
10
|
+
|
|
11
|
+
- 2026-07-27 Issue #152 Python / Bumble matrix and quaternion payload characterization: 同じ fresh-pairing profile、Switch 画面、正 Z yaw `1.0 rad/s`、8 ms → 16 ms → 8 ms の条件で比較した。Python 3.13.5 / Bumble 0.0.230 は利用者目視でカクつきなし。Python 3.12.10 / Bumble 0.0.233 と Python 3.12.10 / Bumble 0.0.230 は、どちらも8 ms区間でカクつき、16 ms区間だけ安定して見えた。したがって、この実験ではBumble 0.0.230 / 0.0.233の差は症状を支配していない。Python 3.12.10 / Bumble 0.0.233でasyncio loop clockだけを`perf_counter`へ差し替えると、ACL dispatchは8 ms区間で2 ms未満gap 0件、Bumble queue待機packet最大0となった。USB sink enqueue、OUT transfer slot取得、libusb transfer callbackも約8 ms間隔で、USB queue待機packet最大1だった。それでも利用者目視のカクつきは変わらず、16 ms区間だけ安定した。この構成ではHCI credit不足、Bumble `DataPacketQueue`待機、USB OUT transfer待機のいずれも、カクつきの必要条件ではない。実機を使わない追加characterizationでは、`FakeHidTransport`へ8 ms間隔で251件のquaternion IMU reportを生成した。Python 3.12.10は`time.monotonic_ns()`が`GetTickCount64()`、公称分解能15.625 msで、250区間中122区間が経過0 nsとなり、同じ122区間で連続する36-byte IMU blockが完全一致した。残る128区間は`monotonic_ns()`が15 msまたは16 ms進み、IMU blockも更新された。Python 3.13.5は`QueryPerformanceCounter()`、公称分解能100 nsで、経過0 nsと連続IMU block一致はともに0件だった。実装上、`ReportSender`は既定clockとして`time.monotonic_ns`を使い、quaternion modeは前reportとの差分時間で姿勢を積分するため、Python 3.12では8 ms入力が「姿勢更新なし」と「15–16 ms分の姿勢更新」を交互に含む。asyncio loop clockだけを差し替えても`ReportSender`の既定clockは変わらない。これらのimplementation fact、characterization、hardware observationは、Python 3.12でのquaternion payload時間量子化を今回のカクつきの主因とする説明に一致する。Switch model / firmwareはこのrunでは再取得しておらず、別OS、別Python patch version、別Switch firmwareへの一般化は未検証。artifactは`tmp/hardware/issue_152/credit-gyro-20260727/py313-bumble0230/`、`py312-bumble0233/`、`py312-bumble0230/`、`py312-bumble0233-highres-loop-rerun/`、`py312-highres-usb-probe/`。
|
|
12
|
+
|
|
13
|
+
- 2026-07-27 Issue #152 Direct gyro / HCI credit A-B-A: Windows `Windows-11-10.0.26200-SP0` / dedicated `usb:0` / CSR8510 A10 `0A12:0001` / WinUSB service / libwdi `6.1.7600.16385` / Bumble 0.0.233 / Python 3.13.5 / swbt-python 0.5.4 (`e4b6b4e`) で実行した。Switch model / firmware はこの run では再取得していない。利用者が Switch 側の接続情報を削除し、「持ちかた/順番を変える」画面を準備した後、`test_switch_adapter_default_profile_fresh_pairing_and_close` を実行して `1 passed in 4.83s`。`classic_pairing`、`key_store_update(status=succeeded)`、`protocol_ready(route=pairing)`、neutral input、`transport_close_complete` を確認し、同じ profile を Direct 計測へ使用した。計測は Project_Demi の診断キー `J` と同じ正 Z yaw `1.0 rad/s`、静止時加速度 Z `1 G` を、固定 deadline で 8 ms × 8秒、16 ms × 8秒、8 ms × 8秒の順に送信した。Direct send / ACL dispatch は各区間 1,000 / 1,000件、500 / 500件、1,001 / 1,001件。ACL dispatch gap は順に mean 7.999949 ms(min 6.1956、max 10.0396)、mean 16.001558 ms(min 13.9599、max 18.0976)、mean 8.001519 ms(min 6.4098、max 9.6325)で、8 ms両区間の2 ms未満と12–20 ms gapはいずれも0件、report timer不連続も0件だった。Bumble `DataPacketQueue` は `max_in_flight=10` に対して実測最大 in-flight 4、enqueue後の待機packet最大0。全体でACL enqueue 2,530件、dispatch 2,530件、completion 2,530件で、各 `HCI Number Of Completed Packets` のpacket countはすべて1だった。利用者は3区間を通して周期的なカクつきは見えなかったと観測した。この構成ではIssue #152のBumble queue待機と近接送出を再現していない。終了時はprofile不変、trace `error` 0件、connection state `closed`、`transport_close_complete`を確認した。HCI disconnect requestは0.25秒でtimeoutし、Bumble stderrに`no pending response future to set`が1件出たが、adapterはpostflightのno-open列挙で再検出できた。承認範囲はfresh pairing、HID advertising、初期化応答、Direct正yaw、neutral close、adapter release。artifactは`tmp/hardware/issue_152/credit-gyro-20260727/`のprofile、fresh-pairing trace、`hci-credit-gyro-trace.jsonl`、`hci-credit-gyro-events.json`。
|
|
14
|
+
|
|
9
15
|
- 2026-07-25 unit_084 Bumble 0.0.233 Switch 2 fresh pairing / Button A: Windows `Windows-11-10.0.26200-SP0` / dedicated `usb:0` / CSR8510 A10 / WinUSB / Bumble 0.0.233 / Python 3.13.5 / swbt-python 0.5.2 / Switch 2 firmware 22.5.0 で、`uv run pytest "tests/hardware/test_reply_holdoff.py::test_switch_reply_holdoff_variant_fresh_pairing_characterizes_readiness_and_a_input[0.3-True]" -m hardware --swbt-bumble-adapter usb:0 --swbt-hardware-artifact-dir tmp/hardware/unit_084/fresh-a-switch2-20260725` を実行し、`1 passed in 10.34s`。承認範囲は `usb:0` の Bumble adapter open、Pro Controller fresh pairing、HID advertising、Button A 送信、neutral close、adapter release である。BD_ADDR 書換えと active reconnect は実行していない。trace は fresh pairing、key store update、control / interrupt L2CAP、protocol ready、`reason=input` の `0x30` report、disconnect terminal `closed`、transport close complete を記録した。利用者は Switch 2 の画面上で Button A が反映されたこと、および firmware と driver identity が既存実験から不変であることを確認した。driver assignment の再照会はこの run ではしていない。artifact は `tmp/hardware/unit_084/fresh-a-switch2-20260725/reply-holdoff-fresh-periodic-0_300.json` と `tmp/hardware/unit_084/fresh-a-switch2-20260725/reply-holdoff-fresh-periodic-0_300.jsonl`。
|
|
10
16
|
|
|
11
17
|
- 2026-07-25 unit_084 Bumble 0.0.233 adapter open-only: Windows `Windows-11-10.0.26200-SP0` / `usb:0` / Bumble 0.0.233 / Python 3.13.5 / swbt-python 0.5.2 で、`uv run pytest tests/hardware/test_context_manager_resource_scope.py -m bumble --swbt-bumble-adapter usb:0 --swbt-hardware-artifact-dir tmp/hardware/unit_084/bumble-open-only` を実行し `1 passed in 0.36s`。承認範囲は Bumble adapter open、transport 初期化、close / adapter release だけである。trace は `transport_open_complete`、`disconnect_request(status=unavailable, reason=channels_not_connected)`、`transport_close_complete` を記録し、`advertising_start` と `host_connection` は記録しなかった。Switch pairing、HID advertising、report loop、Switch-facing message は実行していない。driver identity はこの run で再確認していない。artifact は `tmp/hardware/unit_084/bumble-open-only/resource-open-only.jsonl`。
|
|
@@ -27,7 +27,7 @@ def test_ci_runs_no_hardware_gate_on_ubuntu_and_macos() -> None:
|
|
|
27
27
|
commands = _run_commands(python_job)
|
|
28
28
|
|
|
29
29
|
assert matrix["os"] == ["ubuntu-latest", "macos-latest"]
|
|
30
|
-
assert matrix["python-version"] == ["3.
|
|
30
|
+
assert matrix["python-version"] == ["3.13", "3.14"]
|
|
31
31
|
assert python_job["runs-on"] == "${{ matrix.os }}"
|
|
32
32
|
assert "uv sync --locked --dev" in commands
|
|
33
33
|
assert "uv run pytest tests/unit" in commands
|
|
@@ -43,3 +43,16 @@ def test_package_metadata_includes_linux_and_macos_os_classifiers() -> None:
|
|
|
43
43
|
assert "Operating System :: POSIX :: Linux" in classifiers
|
|
44
44
|
assert "Operating System :: MacOS" in classifiers
|
|
45
45
|
assert "Operating System :: MacOS :: MacOS X" not in classifiers
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_package_requires_python_313_and_declares_tested_versions() -> None:
|
|
49
|
+
pyproject = tomllib.loads(PYPROJECT.read_text(encoding="utf-8"))
|
|
50
|
+
|
|
51
|
+
project = pyproject["project"]
|
|
52
|
+
|
|
53
|
+
assert project["requires-python"] == ">=3.13"
|
|
54
|
+
assert "Programming Language :: Python :: 3.12" not in project["classifiers"]
|
|
55
|
+
assert "Programming Language :: Python :: 3.13" in project["classifiers"]
|
|
56
|
+
assert "Programming Language :: Python :: 3.14" in project["classifiers"]
|
|
57
|
+
assert pyproject["tool"]["ruff"]["target-version"] == "py313"
|
|
58
|
+
assert pyproject["tool"]["ty"]["environment"]["python-version"] == "3.13"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_002/M1_SWITCH_GAMEPAD_FAKE_TRANSPORT.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_005/M4_SUBCOMMAND_RESPONDER_HARDWARE.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_007/M6_RECONNECT_KEYSTORE_DIAGNOSTICS.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_014/DEVICE_CLOSE_GRACEFUL_DISCONNECT.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_015/CONTEXT_MANAGER_RESOURCE_SCOPE.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_016/JSON_KEY_STORE_CURRENT_PREVIOUS.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_017/SWITCH_GAMEPAD_API_HARDENING.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_018/KEY_STORE_TRANSPORT_BOUNDARY.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_019/TRANSPORT_RECONNECT_CONTRACT.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_020/STRUCTURAL_REFACTOR_BOUNDARIES.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_021/SWITCH_GAMEPAD_INPUT_API_CONTRACT.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_022/PUBLIC_API_USAGE_HARDWARE_DOCS.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_026/LINUX_MACOS_ADAPTER_EXPERIMENTAL.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_028/CONTROLLER_PROFILE_CUSTOMIZATION.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_029/CONTROLLER_PROFILE_INJECTION.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_030/JOYCON_PROFILE_IDENTITY_SPI.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_031/JOYCON_INPUT_REPORT_MAPPING.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_032/PROFILE_AWARE_SUBCOMMAND_STATE.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_034/JOYCON_CONVENIENCE_API_DOCS.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_035/JOYCON_DEVICE_INFO_ADDRESS_WIRING.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_036/JOYCON_SDP_IDENTITY_POLICY.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_037/JOYCON_DEFAULT_CONTROLLER_COLORS.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_039/CONTROLLER_RUNTIME_EXTRACTION.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_040/PUBLIC_CONTROLLER_API_MODEL.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_042/INTERNAL_TRANSPORT_FACTORY.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_043/PROTOCOL_PROFILE_MODULE_SPLIT.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_044/REARCHITECTURE_DOCS_RELEASE_MATRIX.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_045/INTERNAL_API_BOUNDARY_CLEANUP.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_046/HARDWARE_PROFILE_TEST_SCENARIOS.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_048/VIRTUAL_ACCELEROMETER_CALIBRATION.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_049/IMU_SESSION_AND_ENCODING_REDESIGN.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_051/CSR_BD_ADDR_REWRITE_EXPERIMENT.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_053/EXP_LOCAL_ADDRESS_PROFILE_JOYCON.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_054/EXP_LOCAL_ADDRESS_PROFILE_DIRECT.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_055/REMOVE_NATIVE_KEY_STORE_API.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_057/PAIRING_PROFILE_CONTROLLER_KIND.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_060/HCI_ACL_COMPLETION_CORRELATION.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_063/PERIODIC_NO_DRAIN_CHARACTERIZATION.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_064/BUMBLE_ENQUEUE_COMPLETION_CONTRACT.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_065/PERIODIC_DEADLINE_SCHEDULER.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_066/PAIRING_PROFILE_DEFAULT_ADDRESS.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_068/DIRECT_PRE_CLOSE_INPUT_REFLECTION.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_069/CONTROLLER_HANDSHAKE_READINESS.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_071/CONTROLLER_CONSTRUCTION_PATH.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_072/CONNECTION_RUNTIME_INTEGRATION.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_073/TEST_CONTRACT_BOUNDARY_CLEANUP.md
RENAMED
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_075/CONCRETE_CONTROLLER_MODULE.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_076/HARDWARE_HAPPY_CASE_VALIDATION.md
RENAMED
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_077/RUNTIME_INPUT_UPDATE_DISPATCH.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_080/TRANSPORT_PROTOCOL_CONTRACT.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/complete/unit_083/PROFILE_SCHEMA_V2_CURRENT_KEY_ONLY.md
RENAMED
|
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
|
{swbt_python-0.5.4 → swbt_python-0.6.0}/spec/rearchitecture/04-runtime-profile-transport-details.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|