[{"data":1,"prerenderedAt":5682},["ShallowReactive",2],{"navigation":3,"reference-meta:python-bus\u002F0.6.0":733,"reference-data:python-bus\u002F0.6.0":735,"unitelabs.jsondocs:0.4.2":1118},[4,80,134,347,411,513,550,629],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Get Started","\u002Fget-started","01.get-started",[9,13,17,43,47],{"title":10,"path":11,"stem":12},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome","01.get-started\u002F00.welcome",{"title":14,"path":15,"stem":16},"How it works","\u002Fget-started\u002Fhow-it-works","01.get-started\u002F01.how-it-works",{"title":18,"path":19,"stem":20,"children":21,"page":42},"Use Cases","\u002Fget-started\u002Fuse-cases","01.get-started\u002F02.use-cases",[22,26,30,34,38],{"title":23,"path":24,"stem":25},"Instrument Control","\u002Fget-started\u002Fuse-cases\u002Flow-level-instrument-control","01.get-started\u002F02.use-cases\u002F10.low-level-instrument-control",{"title":27,"path":28,"stem":29},"Multi-device Control","\u002Fget-started\u002Fuse-cases\u002Fmulti-device-control","01.get-started\u002F02.use-cases\u002F20.multi-device-control",{"title":31,"path":32,"stem":33},"Workflow Orchestration","\u002Fget-started\u002Fuse-cases\u002Fworkflow-orchestration","01.get-started\u002F02.use-cases\u002F30.workflow-orchestration",{"title":35,"path":36,"stem":37},"Custom Apps and LIMS Integration","\u002Fget-started\u002Fuse-cases\u002Fcustom-apps-lims","01.get-started\u002F02.use-cases\u002F40.custom-apps-lims",{"title":39,"path":40,"stem":41},"Scale and Fleet Management","\u002Fget-started\u002Fuse-cases\u002Fscale-and-fleet","01.get-started\u002F02.use-cases\u002F50.scale-and-fleet",false,{"title":44,"path":45,"stem":46},"Lab as Code","\u002Fget-started\u002Fwhy-code","01.get-started\u002F03.why-code",{"title":48,"path":49,"stem":50,"children":51,"page":42},"Setup","\u002Fget-started\u002Fsetup","01.get-started\u002F20.setup",[52,56,60,64,68,72,76],{"title":53,"path":54,"stem":55},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol","01.get-started\u002F20.setup\u002F10.groundcontrol",{"title":57,"path":58,"stem":59},"Network requirements","\u002Fget-started\u002Fsetup\u002Fnetwork-requirements","01.get-started\u002F20.setup\u002F20.network-requirements",{"title":61,"path":62,"stem":63},"Multi-device Networking","\u002Fget-started\u002Fsetup\u002Fmultiple-devices","01.get-started\u002F20.setup\u002F30.multiple-devices",{"title":65,"path":66,"stem":67},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform","01.get-started\u002F20.setup\u002F40.connect-to-platform",{"title":69,"path":70,"stem":71},"Headless install","\u002Fget-started\u002Fsetup\u002Fheadless-install","01.get-started\u002F20.setup\u002F50.headless-install",{"title":73,"path":74,"stem":75},"Raspberry Pi","\u002Fget-started\u002Fsetup\u002Fraspberry-pi","01.get-started\u002F20.setup\u002F55.raspberry-pi",{"title":77,"path":78,"stem":79},"Installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation","01.get-started\u002F20.setup\u002F60.sdk-installation",{"title":81,"path":82,"stem":83,"children":84,"page":42},"Integrate","\u002Fintegrate","02.integrate",[85,89,93,118],{"title":86,"path":87,"stem":88},"What is a connector?","\u002Fintegrate\u002Fwhat-is-a-connector","02.integrate\u002F00.what-is-a-connector",{"title":90,"path":91,"stem":92},"Calling a Connector","\u002Fintegrate\u002Fcontrol-with-code","02.integrate\u002F05.control-with-code",{"title":94,"path":95,"stem":96,"children":97,"page":42},"Concepts","\u002Fintegrate\u002Fconcepts","02.integrate\u002F10.concepts",[98,102,106,110,114],{"title":99,"path":100,"stem":101},"Connector","\u002Fintegrate\u002Fconcepts\u002Fconnector","02.integrate\u002F10.concepts\u002F10.connector",{"title":103,"path":104,"stem":105},"Module","\u002Fintegrate\u002Fconcepts\u002Fmodule","02.integrate\u002F10.concepts\u002F20.module",{"title":107,"path":108,"stem":109},"Action","\u002Fintegrate\u002Fconcepts\u002Faction","02.integrate\u002F10.concepts\u002F30.action",{"title":111,"path":112,"stem":113},"Subscription","\u002Fintegrate\u002Fconcepts\u002Fsubscription","02.integrate\u002F10.concepts\u002F40.subscription",{"title":115,"path":116,"stem":117},"Device","\u002Fintegrate\u002Fconcepts\u002Fdevice","02.integrate\u002F10.concepts\u002F50.device",{"title":119,"path":120,"stem":121,"children":122,"page":42},"Use a connector","\u002Fintegrate\u002Fuse-a-connector","02.integrate\u002F30.use-a-connector",[123,126,130],{"title":53,"path":124,"stem":125},"\u002Fintegrate\u002Fuse-a-connector\u002Fgroundcontrol","02.integrate\u002F30.use-a-connector\u002F10.groundcontrol",{"title":127,"path":128,"stem":129},"Platform","\u002Fintegrate\u002Fuse-a-connector\u002Fplatform","02.integrate\u002F30.use-a-connector\u002F20.platform",{"title":131,"path":132,"stem":133},"UniteLabs SDK & REST API","\u002Fintegrate\u002Fuse-a-connector\u002Fpython","02.integrate\u002F30.use-a-connector\u002F30.python",{"title":135,"path":136,"stem":137,"children":138,"page":42},"Operate","\u002Foperate","03.operate",[139,142,146,186,259],{"title":135,"path":140,"stem":141},"\u002Foperate\u002Foverview","03.operate\u002F00.overview",{"title":143,"path":144,"stem":145},"Your First Protocol","\u002Foperate\u002Fyour-first-protocol","03.operate\u002F05.your-first-protocol",{"title":94,"path":147,"stem":148,"children":149,"page":42},"\u002Foperate\u002Fconcepts","03.operate\u002F10.concepts",[150,154,158,162,166,170,174,178,182],{"title":151,"path":152,"stem":153},"Liquid Handling","\u002Foperate\u002Fconcepts\u002Fliquid-handling","03.operate\u002F10.concepts\u002F10.liquid-handling",{"title":155,"path":156,"stem":157},"Modules","\u002Foperate\u002Fconcepts\u002Fmodules","03.operate\u002F10.concepts\u002F20.modules",{"title":159,"path":160,"stem":161},"Deck","\u002Foperate\u002Fconcepts\u002Fdeck","03.operate\u002F10.concepts\u002F30.deck",{"title":163,"path":164,"stem":165},"Labware","\u002Foperate\u002Fconcepts\u002Flabware","03.operate\u002F10.concepts\u002F40.labware",{"title":167,"path":168,"stem":169},"Liquids","\u002Foperate\u002Fconcepts\u002Fliquids","03.operate\u002F10.concepts\u002F50.liquids",{"title":171,"path":172,"stem":173},"Liquid Classes","\u002Foperate\u002Fconcepts\u002Fliquid-classes","03.operate\u002F10.concepts\u002F60.liquid-classes",{"title":175,"path":176,"stem":177},"Tips and Tip Tracking","\u002Foperate\u002Fconcepts\u002Ftips","03.operate\u002F10.concepts\u002F70.tips",{"title":179,"path":180,"stem":181},"Simulation","\u002Foperate\u002Fconcepts\u002Fsimulation","03.operate\u002F10.concepts\u002F80.simulation",{"title":183,"path":184,"stem":185},"Error Handling","\u002Foperate\u002Fconcepts\u002Ferror-handling","03.operate\u002F10.concepts\u002F90.error-handling",{"title":187,"path":188,"stem":189,"children":190,"page":42},"Guides","\u002Foperate\u002Fguides","03.operate\u002F20.guides",[191,220,232,256],{"title":163,"path":192,"stem":193,"children":194},"\u002Foperate\u002Fguides\u002Flabware","03.operate\u002F20.guides\u002F10.labware\u002Findex",[195,196,200,204,208,212,216],{"title":163,"path":192,"stem":193},{"title":197,"path":198,"stem":199},"Standard Labware","\u002Foperate\u002Fguides\u002Flabware\u002Fstandard-labware","03.operate\u002F20.guides\u002F10.labware\u002F05.standard-labware",{"title":201,"path":202,"stem":203},"Plates","\u002Foperate\u002Fguides\u002Flabware\u002Fplates","03.operate\u002F20.guides\u002F10.labware\u002F10.plates",{"title":205,"path":206,"stem":207},"Tips and Tip Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftips-and-racks","03.operate\u002F20.guides\u002F10.labware\u002F20.tips-and-racks",{"title":209,"path":210,"stem":211},"Tubes and Tube Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftubes-and-tube-racks","03.operate\u002F20.guides\u002F10.labware\u002F30.tubes-and-tube-racks",{"title":213,"path":214,"stem":215},"Troughs","\u002Foperate\u002Fguides\u002Flabware\u002Ftroughs","03.operate\u002F20.guides\u002F10.labware\u002F35.troughs",{"title":217,"path":218,"stem":219},"Carriers and Adapters","\u002Foperate\u002Fguides\u002Flabware\u002Fcarriers-and-adapters","03.operate\u002F20.guides\u002F10.labware\u002F40.carriers-and-adapters",{"title":159,"path":221,"stem":222,"children":223,"page":42},"\u002Foperate\u002Fguides\u002Fdeck","03.operate\u002F20.guides\u002F20.deck",[224,228],{"title":225,"path":226,"stem":227},"Building a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fbuilding-a-deck","03.operate\u002F20.guides\u002F20.deck\u002F10.building-a-deck",{"title":229,"path":230,"stem":231},"Save\u002FLoad a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fsave-load-deck","03.operate\u002F20.guides\u002F20.deck\u002F20.save-load-deck",{"title":233,"path":234,"stem":235,"children":236,"page":42},"Pipetting","\u002Foperate\u002Fguides\u002Fpipetting","03.operate\u002F20.guides\u002F30.pipetting",[237,241,245,249,252],{"title":238,"path":239,"stem":240},"Basic Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fbasic-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F10.basic-pipetting",{"title":242,"path":243,"stem":244},"Advanced Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fadvanced-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F20.advanced-pipetting",{"title":246,"path":247,"stem":248},"Tip Handling","\u002Foperate\u002Fguides\u002Fpipetting\u002Ftip-handling","03.operate\u002F20.guides\u002F30.pipetting\u002F30.tip-handling",{"title":171,"path":250,"stem":251},"\u002Foperate\u002Fguides\u002Fpipetting\u002Fliquid-classes","03.operate\u002F20.guides\u002F30.pipetting\u002F40.liquid-classes",{"title":253,"path":254,"stem":255},"Labware Transport","\u002Foperate\u002Fguides\u002Fpipetting\u002Flabware-transport","03.operate\u002F20.guides\u002F30.pipetting\u002F50.labware-transport",{"title":179,"path":257,"stem":258},"\u002Foperate\u002Fguides\u002Fsimulation","03.operate\u002F20.guides\u002F40.simulation",{"title":260,"path":261,"stem":262,"children":263,"page":42},"Liquid Handler Guides","\u002Foperate\u002Fdevices","03.operate\u002F30.devices",[264,305,330],{"title":265,"path":266,"stem":267,"children":268,"page":42},"Hamilton STAR","\u002Foperate\u002Fdevices\u002Fhamilton-star","03.operate\u002F30.devices\u002F10.hamilton-star",[269,273,277,281,285,289,293,297,301],{"title":270,"path":271,"stem":272},"Positioning & Movement","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fpositioning","03.operate\u002F30.devices\u002F10.hamilton-star\u002F10.positioning",{"title":274,"path":275,"stem":276},"Gripper Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcore-gripper","03.operate\u002F30.devices\u002F10.hamilton-star\u002F20.core-gripper",{"title":278,"path":279,"stem":280},"iSWAP Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fiswap","03.operate\u002F30.devices\u002F10.hamilton-star\u002F30.iswap",{"title":282,"path":283,"stem":284},"Using TADM","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Ftadm","03.operate\u002F30.devices\u002F10.hamilton-star\u002F40.tadm",{"title":286,"path":287,"stem":288},"Autoload Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fautoload","03.operate\u002F30.devices\u002F10.hamilton-star\u002F50.autoload",{"title":290,"path":291,"stem":292},"Waste Block","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fwaste-block","03.operate\u002F30.devices\u002F10.hamilton-star\u002F60.waste-block",{"title":294,"path":295,"stem":296},"Complex Mixing","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcomplex-mixing","03.operate\u002F30.devices\u002F10.hamilton-star\u002F66.complex-mixing",{"title":298,"path":299,"stem":300},"Teaching Gripper Paddle Positions","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fgripper-positions","03.operate\u002F30.devices\u002F10.hamilton-star\u002F70.gripper-positions",{"title":302,"path":303,"stem":304},"Training a Custom Deck Position With the iSWAP","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcustom-deck-position","03.operate\u002F30.devices\u002F10.hamilton-star\u002F75.custom-deck-position",{"title":306,"path":307,"stem":308,"children":309,"page":42},"Hamilton Vantage","\u002Foperate\u002Fdevices\u002Fhamilton-vantage","03.operate\u002F30.devices\u002F20.hamilton-vantage",[310,314,318,322,326],{"title":311,"path":312,"stem":313},"Waste Configuration","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fwaste-configuration","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F05.waste-configuration",{"title":315,"path":316,"stem":317},"Covers and Lights","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fcovers-and-lights","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F10.covers-and-lights",{"title":319,"path":320,"stem":321},"IDL Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fidl","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F20.idl",{"title":323,"path":324,"stem":325},"IPG Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fipg","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F30.ipg",{"title":327,"path":328,"stem":329},"XL Pipettes","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fxl-channels","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F40.xl-channels",{"title":331,"path":332,"stem":333,"children":334,"page":42},"Agilent Bravo","\u002Foperate\u002Fdevices\u002Fagilent-bravo","03.operate\u002F30.devices\u002F30.agilent-bravo",[335,338,341,344],{"title":246,"path":336,"stem":337},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Ftip-handling","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F10.tip-handling",{"title":238,"path":339,"stem":340},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fbasic-pipetting","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F20.basic-pipetting",{"title":171,"path":342,"stem":343},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fliquid-classes","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F25.liquid-classes",{"title":274,"path":345,"stem":346},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fusing-the-gripper","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F30.using-the-gripper",{"title":348,"path":349,"stem":350,"children":351,"page":42},"Device Guides","\u002Fdevice-guides","06.device-guides",[352,355,368,385,398],{"title":348,"path":353,"stem":354},"\u002Fdevice-guides\u002Foverview","06.device-guides\u002F00.overview",{"title":356,"path":357,"stem":358,"children":359,"page":42},"Incubation","\u002Fdevice-guides\u002Fincubation","06.device-guides\u002F20.incubation",[360,364],{"title":361,"path":362,"stem":363},"Inheco ODTC","\u002Fdevice-guides\u002Fincubation\u002Finheco-odtc","06.device-guides\u002F20.incubation\u002F10.inheco-odtc",{"title":365,"path":366,"stem":367},"Inheco SCILA","\u002Fdevice-guides\u002Fincubation\u002Finheco-scila","06.device-guides\u002F20.incubation\u002F20.inheco-scila",{"title":369,"path":370,"stem":371,"children":372,"page":42},"Heater-Shakers","\u002Fdevice-guides\u002Fheater-shakers","06.device-guides\u002F30.heater-shakers",[373,377,381],{"title":374,"path":375,"stem":376},"Inheco Thermoshake","\u002Fdevice-guides\u002Fheater-shakers\u002Finheco-thermoshake","06.device-guides\u002F30.heater-shakers\u002F10.inheco-thermoshake",{"title":378,"path":379,"stem":380},"QInstruments Bioshake","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-bioshake","06.device-guides\u002F30.heater-shakers\u002F20.qinstruments-bioshake",{"title":382,"path":383,"stem":384},"QInstruments ColdPlate","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-coldplate","06.device-guides\u002F30.heater-shakers\u002F30.qinstruments-coldplate",{"title":386,"path":387,"stem":388,"children":389,"page":42},"Readers","\u002Fdevice-guides\u002Freaders","06.device-guides\u002F40.readers",[390,394],{"title":391,"path":392,"stem":393},"Biotek Gen5","\u002Fdevice-guides\u002Freaders\u002Fbiotek-gen5","06.device-guides\u002F40.readers\u002F10.biotek-gen5",{"title":395,"path":396,"stem":397},"Biotek Synergy H1","\u002Fdevice-guides\u002Freaders\u002Fbiotek-synergy-h1","06.device-guides\u002F40.readers\u002F20.biotek-synergy-H1",{"title":399,"path":400,"stem":401,"children":402,"page":42},"Tilt & Turn","\u002Fdevice-guides\u002Ftilt-and-turn","06.device-guides\u002F50.tilt-and-turn",[403,407],{"title":404,"path":405,"stem":406},"TurnStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-turnstation","06.device-guides\u002F50.tilt-and-turn\u002F10.qinstruments-turnstation",{"title":408,"path":409,"stem":410},"TiltStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-tiltstation","06.device-guides\u002F50.tilt-and-turn\u002F20.qinstruments-tiltstation",{"title":412,"path":413,"stem":414,"children":415,"page":42},"Automate","\u002Fautomate","07.automate",[416,420,424,428,477],{"title":417,"path":418,"stem":419},"What is a workflow?","\u002Fautomate\u002Fwhat-is-a-workflow","07.automate\u002F00.what-is-a-workflow",{"title":421,"path":422,"stem":423},"Workflow template","\u002Fautomate\u002Fworkflow-template","07.automate\u002F05.workflow-template",{"title":425,"path":426,"stem":427},"Your First Workflow","\u002Fautomate\u002Fyour-first-workflow","07.automate\u002F08.your-first-workflow",{"title":94,"pages":429,"path":439,"stem":440,"children":441,"page":42},[430,431,432,433,434,435,436,437,438],"workflow","phase","step","runs","input","artifacts","logs","human-in-the-loop","error-handling","\u002Fautomate\u002Fconcepts","07.automate\u002F10.concepts",[442,446,450,454,458,462,466,470,474],{"title":443,"path":444,"stem":445},"Workflow","\u002Fautomate\u002Fconcepts\u002Fworkflow","07.automate\u002F10.concepts\u002F10.workflow",{"title":447,"path":448,"stem":449},"Phase","\u002Fautomate\u002Fconcepts\u002Fphase","07.automate\u002F10.concepts\u002F20.phase",{"title":451,"path":452,"stem":453},"Step","\u002Fautomate\u002Fconcepts\u002Fstep","07.automate\u002F10.concepts\u002F30.step",{"title":455,"path":456,"stem":457},"Runs","\u002Fautomate\u002Fconcepts\u002Fruns","07.automate\u002F10.concepts\u002F40.runs",{"title":459,"path":460,"stem":461},"Input","\u002Fautomate\u002Fconcepts\u002Finput","07.automate\u002F10.concepts\u002F50.input",{"title":463,"path":464,"stem":465},"Artifacts","\u002Fautomate\u002Fconcepts\u002Fartifacts","07.automate\u002F10.concepts\u002F60.artifacts",{"title":467,"path":468,"stem":469},"Logs","\u002Fautomate\u002Fconcepts\u002Flogs","07.automate\u002F10.concepts\u002F70.logs",{"title":471,"path":472,"stem":473},"Human in the Loop","\u002Fautomate\u002Fconcepts\u002Fhuman-in-the-loop","07.automate\u002F10.concepts\u002F80.human-in-the-loop",{"title":183,"path":475,"stem":476},"\u002Fautomate\u002Fconcepts\u002Ferror-handling","07.automate\u002F10.concepts\u002F90.error-handling",{"title":187,"path":478,"stem":479,"children":480,"page":42},"\u002Fautomate\u002Fguides","07.automate\u002F25.guides",[481,485,489,493,497,501,505,509],{"title":482,"path":483,"stem":484},"Deploy a workflow","\u002Fautomate\u002Fguides\u002Fdeploy-a-workflow","07.automate\u002F25.guides\u002F30.deploy-a-workflow",{"title":486,"path":487,"stem":488},"Run a workflow","\u002Fautomate\u002Fguides\u002Frun-a-workflow","07.automate\u002F25.guides\u002F35.run-a-workflow",{"title":490,"path":491,"stem":492},"CI\u002FCD for workflows","\u002Fautomate\u002Fguides\u002Fcicd-for-workflows","07.automate\u002F25.guides\u002F40.cicd-for-workflows",{"title":494,"path":495,"stem":496},"HITL basics","\u002Fautomate\u002Fguides\u002Fbasic-hitl","07.automate\u002F25.guides\u002F50.basic-hitl",{"title":498,"path":499,"stem":500},"Typed operator inputs","\u002Fautomate\u002Fguides\u002Ftyped-operator-inputs","07.automate\u002F25.guides\u002F55.typed-operator-inputs",{"title":502,"path":503,"stem":504},"Error recovery","\u002Fautomate\u002Fguides\u002Fbasic-error-handling","07.automate\u002F25.guides\u002F60.basic-error-handling",{"title":506,"path":507,"stem":508},"Advanced error handling","\u002Fautomate\u002Fguides\u002Fadvanced-error-handling","07.automate\u002F25.guides\u002F70.advanced-error-handling",{"title":510,"path":511,"stem":512},"Workflows REST API","\u002Fautomate\u002Fguides\u002Fworkflows-api","07.automate\u002F25.guides\u002F80.workflows-api",{"title":514,"path":515,"stem":516,"children":517,"page":42},"Observe","\u002Fobserve","08.observe",[518,522,538],{"title":519,"path":520,"stem":521},"Overview","\u002Fobserve\u002Foverview","08.observe\u002F10.overview",{"title":94,"path":523,"stem":524,"children":525,"page":42},"\u002Fobserve\u002Fconcepts","08.observe\u002F20.concepts",[526,530,534],{"title":527,"path":528,"stem":529},"Object Storage","\u002Fobserve\u002Fconcepts\u002Fstorage","08.observe\u002F20.concepts\u002F10.storage",{"title":531,"path":532,"stem":533},"Secrets","\u002Fobserve\u002Fconcepts\u002Fsecrets","08.observe\u002F20.concepts\u002F20.secrets",{"title":535,"path":536,"stem":537},"Data sources","\u002Fobserve\u002Fconcepts\u002Fdata-sources","08.observe\u002F20.concepts\u002F30.data-sources",{"title":187,"path":539,"stem":540,"children":541,"page":42},"\u002Fobserve\u002Fguides","08.observe\u002F30.guides",[542,546],{"title":543,"path":544,"stem":545},"File System Connector","\u002Fobserve\u002Fguides\u002Ffilesystem-connector","08.observe\u002F30.guides\u002F10.filesystem-connector",{"title":547,"path":548,"stem":549},"Building an ETL","\u002Fobserve\u002Fguides\u002Fbuilding-an-etl","08.observe\u002F30.guides\u002F20.building-an-etl",{"title":551,"path":552,"stem":553,"children":554,"page":42},"Technical Reference","\u002Ftechnical-reference","10.technical-reference",[555,559,563,575,586,597,607,618],{"title":556,"path":557,"stem":558},"Introduction","\u002Ftechnical-reference\u002Fplatform-blueprint","10.technical-reference\u002F00.platform-blueprint",{"title":560,"path":561,"stem":562},"REST API","\u002Ftechnical-reference\u002Frest-api","10.technical-reference\u002F01.rest-api",{"title":53,"path":564,"stem":565,"children":566,"page":42},"\u002Ftechnical-reference\u002Fgroundcontrol","10.technical-reference\u002F10.groundcontrol",[567,571],{"title":568,"path":569,"stem":570},"Install & Setup","\u002Ftechnical-reference\u002Fgroundcontrol\u002Finstall","10.technical-reference\u002F10.groundcontrol\u002F10.install",{"title":572,"path":573,"stem":574},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog","10.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":576,"path":577,"stem":578,"children":579,"page":42},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk","10.technical-reference\u002F20.python-sdk",[580,583],{"title":568,"path":581,"stem":582},"\u002Ftechnical-reference\u002Fpython-sdk\u002Finstall","10.technical-reference\u002F20.python-sdk\u002F10.install",{"title":572,"path":584,"stem":585},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog","10.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":587,"path":588,"stem":589,"children":590,"page":42},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk","10.technical-reference\u002F30.python-liquid-handling-sdk",[591,594],{"title":568,"path":592,"stem":593},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Finstall","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F10.install",{"title":572,"path":595,"stem":596},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":163,"path":598,"stem":599,"children":600,"page":42},"\u002Ftechnical-reference\u002Flabware","10.technical-reference\u002F40.labware",[601,604],{"title":568,"path":602,"stem":603},"\u002Ftechnical-reference\u002Flabware\u002Finstall","10.technical-reference\u002F40.labware\u002F10.install",{"title":572,"path":605,"stem":606},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog","10.technical-reference\u002F40.labware\u002F20.changelog",{"title":608,"path":609,"stem":610,"children":611,"page":42},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus","10.technical-reference\u002F50.python-omnibus",[612,615],{"title":568,"path":613,"stem":614},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Finstall","10.technical-reference\u002F50.python-omnibus\u002F10.install",{"title":572,"path":616,"stem":617},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog","10.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":619,"path":620,"stem":621,"children":622,"page":42},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk","10.technical-reference\u002F60.python-cdk",[623,626],{"title":568,"path":624,"stem":625},"\u002Ftechnical-reference\u002Fpython-cdk\u002Finstall","10.technical-reference\u002F60.python-cdk\u002F10.install",{"title":572,"path":627,"stem":628},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog","10.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":630,"path":631,"stem":632,"children":633},"Connector Development (CDK)","\u002Fconnector-development","20.connector-development",[634,636,655,688,696,727],{"title":630,"path":631,"stem":635},"20.connector-development\u002Findex",{"title":637,"path":638,"stem":639,"children":640,"page":42},"Getting Started","\u002Fconnector-development\u002Fgetting-started","20.connector-development\u002F10.getting-started",[641,644,648,651],{"title":519,"path":642,"stem":643},"\u002Fconnector-development\u002Fgetting-started\u002Foverview","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":645,"path":646,"stem":647},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":77,"path":649,"stem":650},"\u002Fconnector-development\u002Fgetting-started\u002Finstallation","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":652,"path":653,"stem":654},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":656,"path":657,"stem":658,"children":659,"page":42},"Tutorial","\u002Fconnector-development\u002Ftutorial","20.connector-development\u002F20.tutorial",[660,664,668,672,676,680,684],{"title":661,"path":662,"stem":663},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":665,"path":666,"stem":667},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":669,"path":670,"stem":671},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":673,"path":674,"stem":675},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":677,"path":678,"stem":679},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":681,"path":682,"stem":683},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":685,"path":686,"stem":687},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":94,"path":689,"stem":690,"children":691,"page":42},"\u002Fconnector-development\u002Fconcepts","20.connector-development\u002F30.concepts",[692],{"title":693,"path":694,"stem":695},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila","20.connector-development\u002F30.concepts\u002Fsila",{"title":187,"path":697,"stem":698,"children":699,"page":42},"\u002Fconnector-development\u002Fguides","20.connector-development\u002F40.guides",[700,704,708,712,716,719,723],{"title":701,"path":702,"stem":703},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration","20.connector-development\u002F40.guides\u002F20.configuration",{"title":705,"path":706,"stem":707},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment","20.connector-development\u002F40.guides\u002F30.deployment",{"title":709,"path":710,"stem":711},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity","20.connector-development\u002F40.guides\u002F40.security",{"title":713,"path":714,"stem":715},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":183,"path":717,"stem":718},"\u002Fconnector-development\u002Fguides\u002Ferror-handling","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":720,"path":721,"stem":722},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":724,"path":725,"stem":726},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting","20.connector-development\u002F40.guides\u002F80.testing",{"title":728,"path":729,"stem":730,"children":731},"References","\u002Fconnector-development\u002Freference","20.connector-development\u002F50.reference\u002Findex",[732],{"title":728,"path":729,"stem":730},{"description":734},"All notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https:\u002F\u002Fkeepachangelog.com\u002Fen\u002F1.1.0\u002F), and this project adheres to [Semantic Versioning](https:\u002F\u002Fsemver.org\u002Fspec\u002Fv2.0.0.html).\n\n## [V0.6.0] - 2026-01-28\n### Added\n- finalizing hid on windows [3e951f366](https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fcdk\u002Fpython-bus\u002Fcommit\u002F3e951f36696d99364b392625a0d1aace99a8697f)\n- generate reference docs [6f1cae60a](https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fcdk\u002Fpython-bus\u002Fcommit\u002F6f1cae60a5a09d56d29f7139b89c593d26b67bc0) (DEV-527)\n- `DeviceManager.filter_kwargs(data)`: *Parameter was added as required*\n\n### Removed\n- `DeviceManager.filter_kwargs(kwargs)`: *Parameter was removed*\n\n[v0.5.0...v0.6.0](https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fcdk\u002Fpython-bus\u002Fcompare\u002Fv0.5.0...v0.6.0)",{"modules":736,"title":5631,"description":5632,"package":739,"version":5633,"dependencies":5634},{"unitelabs.bus":737,"unitelabs.bus.__all__":770,"unitelabs.bus.exceptions":781,"unitelabs.bus.exceptions.InputValidationError":786,"unitelabs.bus.exceptions.CommandValidationError":798,"unitelabs.bus.exceptions.CommandExecutionError":807,"unitelabs.bus.exceptions.CommandMethodValidationError":817,"unitelabs.bus.exceptions.NoSuchDeviceFound":826,"unitelabs.bus.exceptions.NoConnectionError":835,"unitelabs.bus.testing":844,"unitelabs.bus.testing.__all__":861,"unitelabs.bus.testing.stub":868,"unitelabs.bus.testing.stub.Stub":872,"unitelabs.bus.testing.stub.stub_maker":876,"unitelabs.bus.testing.serial_device_mock":903,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock":906,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__init__":926,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.cancel":941,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.reader":945,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__enter__":948,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__exit__":954,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.port":966,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.open":972,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.close":979,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.receive":986,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.received":993,"unitelabs.bus.testing.mock_transport":1002,"unitelabs.bus.testing.mock_transport.MockTransport":1005,"unitelabs.bus.testing.mock_transport.MockTransport.__init__":1031,"unitelabs.bus.testing.mock_transport.MockTransport.stubs":1060,"unitelabs.bus.testing.mock_transport.MockTransport.device":1063,"unitelabs.bus.testing.mock_transport.MockTransport.autorespond":1066,"unitelabs.bus.testing.mock_transport.MockTransport.queue":1069,"unitelabs.bus.testing.mock_transport.MockTransport.mock":1072,"unitelabs.bus.testing.mock_transport.MockTransport.kwargs":1075,"unitelabs.bus.testing.mock_transport.MockTransport.write":1079,"unitelabs.bus.testing.mock_transport.MockTransport._add_to_queue":1089,"unitelabs.bus.testing.mock_transport.MockTransport._write":1109,"unitelabs.bus.testing.mock_transport.MockTransport._read":1121,"unitelabs.bus.testing.udp_device_mock":1130,"unitelabs.bus.testing.udp_device_mock.UDP_SERVER_ADDR":1135,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock":1138,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__init__":1161,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.socket":1173,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.cancel":1176,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.loop":1179,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__enter__":1182,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__exit__":1186,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.host":1194,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.port":1199,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.address":1204,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.open":1215,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.close":1222,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.receive":1229,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.received":1239,"unitelabs.bus.testing.mock_factory":1250,"unitelabs.bus.testing.mock_factory.create_mock_connection":1253,"unitelabs.bus.testing.device_mock":1286,"unitelabs.bus.testing.device_mock.DeviceMock":1289,"unitelabs.bus.testing.device_mock.DeviceMock.__init__":1303,"unitelabs.bus.testing.device_mock.DeviceMock.stubs":1314,"unitelabs.bus.testing.device_mock.DeviceMock.logger":1321,"unitelabs.bus.testing.device_mock.DeviceMock.get_response":1326,"unitelabs.bus.testing.fixtures":1341,"unitelabs.bus.testing.fixtures.mock_factory":1351,"unitelabs.bus.testing.fixtures.serial_device":1358,"unitelabs.bus.testing.fixtures.udp_device":1369,"unitelabs.bus.testing.fixtures.mk_partial_protocol":1379,"unitelabs.bus.testing.fixtures.mk_stubbed_protocol":1402,"unitelabs.bus.testing.fixtures.protocol":1442,"unitelabs.bus.protocols":1454,"unitelabs.bus.protocols.__all__":1461,"unitelabs.bus.protocols.protocol":1465,"unitelabs.bus.protocols.protocol.DEFAULT_RECONNECT_DELAY":1472,"unitelabs.bus.protocols.protocol.DEFAULT_MAX_RECONNECT_ATTEMPTS":1475,"unitelabs.bus.protocols.protocol.DEFAULT_MAX_PARALLEL_COMMANDS":1478,"unitelabs.bus.protocols.protocol.Protocol":1481,"unitelabs.bus.protocols.protocol.Protocol.__init__":1524,"unitelabs.bus.protocols.protocol.Protocol.transport":1560,"unitelabs.bus.protocols.protocol.Protocol._transport_allows_writing":1566,"unitelabs.bus.protocols.protocol.Protocol._transport_factory":1568,"unitelabs.bus.protocols.protocol.Protocol._transport_kwargs":1571,"unitelabs.bus.protocols.protocol.Protocol._commands":1573,"unitelabs.bus.protocols.protocol.Protocol.lock":1580,"unitelabs.bus.protocols.protocol.Protocol.is_open":1583,"unitelabs.bus.protocols.protocol.Protocol.autodetect":1587,"unitelabs.bus.protocols.protocol.Protocol._autodetector":1589,"unitelabs.bus.protocols.protocol.Protocol._validation_kwargs":1592,"unitelabs.bus.protocols.protocol.Protocol.is_validated":1594,"unitelabs.bus.protocols.protocol.Protocol.reconnect":1596,"unitelabs.bus.protocols.protocol.Protocol.reconnect_delay":1599,"unitelabs.bus.protocols.protocol.Protocol.remaining_reconnect_attempts":1602,"unitelabs.bus.protocols.protocol.Protocol.max_reconnect_attempts":1605,"unitelabs.bus.protocols.protocol.Protocol.logger":1607,"unitelabs.bus.protocols.protocol.Protocol.autodetector":1612,"unitelabs.bus.protocols.protocol.Protocol.connect":1618,"unitelabs.bus.protocols.protocol.Protocol._connect_transport":1646,"unitelabs.bus.protocols.protocol.Protocol.identity":1654,"unitelabs.bus.protocols.protocol.Protocol.validate":1676,"unitelabs.bus.protocols.protocol.Protocol.open":1696,"unitelabs.bus.protocols.protocol.Protocol.close":1710,"unitelabs.bus.protocols.protocol.Protocol.connection_made":1717,"unitelabs.bus.protocols.protocol.Protocol.connection_lost":1727,"unitelabs.bus.protocols.protocol.Protocol.pause_writing":1739,"unitelabs.bus.protocols.protocol.Protocol.resume_writing":1746,"unitelabs.bus.protocols.protocol.Protocol.data_received":1753,"unitelabs.bus.protocols.protocol.Protocol.datagram_received":1763,"unitelabs.bus.protocols.protocol.Protocol.error_received":1782,"unitelabs.bus.protocols.protocol.Protocol.execute":1797,"unitelabs.bus.utils":1834,"unitelabs.bus.utils.__all__":1844,"unitelabs.bus.utils.device_manager":1847,"unitelabs.bus.utils.device_manager.DeviceInfo":1851,"unitelabs.bus.utils.device_manager.DeviceInfo.device":1874,"unitelabs.bus.utils.device_manager.DeviceInfo.name":1878,"unitelabs.bus.utils.device_manager.DeviceInfo.description":1881,"unitelabs.bus.utils.device_manager.DeviceInfo.hwid":1886,"unitelabs.bus.utils.device_manager.DeviceInfo.vid":1891,"unitelabs.bus.utils.device_manager.DeviceInfo.pid":1897,"unitelabs.bus.utils.device_manager.DeviceInfo.serial_number":1903,"unitelabs.bus.utils.device_manager.DeviceInfo.location":1908,"unitelabs.bus.utils.device_manager.DeviceInfo.manufacturer":1913,"unitelabs.bus.utils.device_manager.DeviceInfo.product":1918,"unitelabs.bus.utils.device_manager.DeviceInfo.interface":1924,"unitelabs.bus.utils.device_manager.DeviceInfo.__post_init__":1929,"unitelabs.bus.utils.device_manager.DeviceInfo.__repr__":1934,"unitelabs.bus.utils.device_manager.DeviceInfo.__init__":1938,"unitelabs.bus.utils.device_manager.DeviceManager":1993,"unitelabs.bus.utils.device_manager.DeviceManager.filter_kwargs":2002,"unitelabs.bus.utils.device_manager.DeviceManager.get_all":2028,"unitelabs.bus.utils.device_manager.DeviceManager.check_device_match":2039,"unitelabs.bus.utils.device_manager.DeviceManager.filter":2055,"unitelabs.bus.utils.device_manager.SerialDeviceManager":2068,"unitelabs.bus.utils.device_manager.SerialDeviceManager.SERIAL_SEARCH_KEYS":2083,"unitelabs.bus.utils.device_manager.SerialDeviceManager.filter_kwargs":2089,"unitelabs.bus.utils.device_manager.SerialDeviceManager.get_all":2110,"unitelabs.bus.utils.device_manager.SerialDeviceManager.check_device_match":2121,"unitelabs.bus.utils.device_manager.SerialDeviceManager.filter":2133,"unitelabs.bus.utils.autodetect":2144,"unitelabs.bus.utils.autodetect.TransportType":2148,"unitelabs.bus.utils.autodetect.TransportType.serial":2161,"unitelabs.bus.utils.autodetect.TransportType.usb":2164,"unitelabs.bus.utils.autodetect.TransportType.unknown":2166,"unitelabs.bus.utils.autodetect.AutoDetector":2168,"unitelabs.bus.utils.autodetect.AutoDetector._transport_type":2192,"unitelabs.bus.utils.autodetect.AutoDetector.__init__":2195,"unitelabs.bus.utils.autodetect.AutoDetector.protocol":2205,"unitelabs.bus.utils.autodetect.AutoDetector._transport_kwargs":2207,"unitelabs.bus.utils.autodetect.AutoDetector._device_manager":2209,"unitelabs.bus.utils.autodetect.AutoDetector._validation_kwargs":2211,"unitelabs.bus.utils.autodetect.AutoDetector._is_resolving":2213,"unitelabs.bus.utils.autodetect.AutoDetector.connection_tasks":2215,"unitelabs.bus.utils.autodetect.AutoDetector.get_transport_type":2218,"unitelabs.bus.utils.autodetect.AutoDetector.logger":2223,"unitelabs.bus.utils.autodetect.AutoDetector.device_manager":2227,"unitelabs.bus.utils.autodetect.AutoDetector.get_device_manager":2234,"unitelabs.bus.utils.autodetect.AutoDetector.is_resolving":2243,"unitelabs.bus.utils.autodetect.AutoDetector.resolve":2247,"unitelabs.bus.utils.autodetect.AutoDetector._connect":2259,"unitelabs.bus.utils.autodetect.AutoDetector._update_protocol_transport":2273,"unitelabs.bus.utils.device_manager_cli":2282,"unitelabs.bus.utils.device_manager_cli.logger":2287,"unitelabs.bus.utils.device_manager_cli.devices":2290,"unitelabs.bus.transports":2293,"unitelabs.bus.transports.__all__":2309,"unitelabs.bus.transports.serial_transport":2312,"unitelabs.bus.transports.serial_transport.ByteSize":2317,"unitelabs.bus.transports.serial_transport.ByteSize.FIVEBITS":2330,"unitelabs.bus.transports.serial_transport.ByteSize.SIXBITS":2333,"unitelabs.bus.transports.serial_transport.ByteSize.SEVENBITS":2336,"unitelabs.bus.transports.serial_transport.ByteSize.EIGHTBITS":2339,"unitelabs.bus.transports.serial_transport.Parity":2342,"unitelabs.bus.transports.serial_transport.Parity.NONE":2357,"unitelabs.bus.transports.serial_transport.Parity.ODD":2360,"unitelabs.bus.transports.serial_transport.Parity.EVEN":2363,"unitelabs.bus.transports.serial_transport.Parity.MARK":2366,"unitelabs.bus.transports.serial_transport.Parity.SPACE":2369,"unitelabs.bus.transports.serial_transport.StopBits":2372,"unitelabs.bus.transports.serial_transport.StopBits.ONE":2385,"unitelabs.bus.transports.serial_transport.StopBits.ONE_POINT_FIVE":2387,"unitelabs.bus.transports.serial_transport.StopBits.TWO":2390,"unitelabs.bus.transports.serial_transport.POLL_WAIT_TIME":2393,"unitelabs.bus.transports.serial_transport.SerialTransport":2396,"unitelabs.bus.transports.serial_transport.SerialTransport.__init__":2420,"unitelabs.bus.transports.serial_transport.SerialTransport._serial":2447,"unitelabs.bus.transports.serial_transport.SerialTransport._max_read_size":2450,"unitelabs.bus.transports.serial_transport.SerialTransport._read_buffer":2453,"unitelabs.bus.transports.serial_transport.SerialTransport._open":2455,"unitelabs.bus.transports.serial_transport.SerialTransport._close":2461,"unitelabs.bus.transports.serial_transport.SerialTransport._ensure_reader":2466,"unitelabs.bus.transports.serial_transport.SerialTransport._poll_read":2472,"unitelabs.bus.transports.serial_transport.SerialTransport._remove_reader":2478,"unitelabs.bus.transports.serial_transport.SerialTransport._read":2484,"unitelabs.bus.transports.serial_transport.SerialTransport._ensure_writer":2493,"unitelabs.bus.transports.serial_transport.SerialTransport._poll_write":2500,"unitelabs.bus.transports.serial_transport.SerialTransport._remove_writer":2506,"unitelabs.bus.transports.serial_transport.SerialTransport._write":2512,"unitelabs.bus.transports.read_transport":2521,"unitelabs.bus.transports.read_transport.ReadTransport":2524,"unitelabs.bus.transports.read_transport.ReadTransport.__init__":2550,"unitelabs.bus.transports.read_transport.ReadTransport._has_reader":2554,"unitelabs.bus.transports.read_transport.ReadTransport.open":2556,"unitelabs.bus.transports.read_transport.ReadTransport.close":2561,"unitelabs.bus.transports.read_transport.ReadTransport.is_reading":2566,"unitelabs.bus.transports.read_transport.ReadTransport.pause_reading":2574,"unitelabs.bus.transports.read_transport.ReadTransport.resume_reading":2579,"unitelabs.bus.transports.read_transport.ReadTransport._abort":2584,"unitelabs.bus.transports.read_transport.ReadTransport._ensure_reader":2597,"unitelabs.bus.transports.read_transport.ReadTransport._remove_reader":2602,"unitelabs.bus.transports.read_transport.ReadTransport._safe_read":2607,"unitelabs.bus.transports.read_transport.ReadTransport._read":2614,"unitelabs.bus.transports.read_transport.ReadTransport.read_all":2626,"unitelabs.bus.transports.read_transport.ReadTransport.clear_read_buffer":2634,"unitelabs.bus.transports.transport":2639,"unitelabs.bus.transports.transport.Transport":2642,"unitelabs.bus.transports.transport.Transport._open":2662,"unitelabs.bus.transports.transport.Transport._close":2666,"unitelabs.bus.transports.transport.Transport._ensure_reader":2670,"unitelabs.bus.transports.transport.Transport._remove_reader":2674,"unitelabs.bus.transports.transport.Transport._read":2678,"unitelabs.bus.transports.transport.Transport._ensure_writer":2686,"unitelabs.bus.transports.transport.Transport._remove_writer":2690,"unitelabs.bus.transports.transport.Transport._write":2694,"unitelabs.bus.transports.usb_transport":2702,"unitelabs.bus.transports.usb_transport.POLL_WAIT_TIME":2712,"unitelabs.bus.transports.usb_transport.DEFAULT_USB_INTERFACE":2715,"unitelabs.bus.transports.usb_transport.WindowsDriverInstallationError":2718,"unitelabs.bus.transports.usb_transport.is_disconnection_error":2725,"unitelabs.bus.transports.usb_transport.get_libusb_backend":2737,"unitelabs.bus.transports.usb_transport.USBTransport":2752,"unitelabs.bus.transports.usb_transport.USBTransport.read_size":2783,"unitelabs.bus.transports.usb_transport.USBTransport.__init__":2787,"unitelabs.bus.transports.usb_transport.USBTransport.vendor":2807,"unitelabs.bus.transports.usb_transport.USBTransport.product":2809,"unitelabs.bus.transports.usb_transport.USBTransport.interface_number":2811,"unitelabs.bus.transports.usb_transport.USBTransport._backend":2814,"unitelabs.bus.transports.usb_transport.USBTransport._device":2816,"unitelabs.bus.transports.usb_transport.USBTransport.read_endpoint":2823,"unitelabs.bus.transports.usb_transport.USBTransport.write_endpoint":2829,"unitelabs.bus.transports.usb_transport.USBTransport._was_opened":2835,"unitelabs.bus.transports.usb_transport.USBTransport._reader_event":2838,"unitelabs.bus.transports.usb_transport.USBTransport.logger":2840,"unitelabs.bus.transports.usb_transport.USBTransport._open":2843,"unitelabs.bus.transports.usb_transport.USBTransport._close":2849,"unitelabs.bus.transports.usb_transport.USBTransport._ensure_reader":2855,"unitelabs.bus.transports.usb_transport.USBTransport._remove_reader":2861,"unitelabs.bus.transports.usb_transport.USBTransport.__read":2867,"unitelabs.bus.transports.usb_transport.USBTransport._read":2873,"unitelabs.bus.transports.usb_transport.USBTransport._ensure_writer":2884,"unitelabs.bus.transports.usb_transport.USBTransport._remove_writer":2890,"unitelabs.bus.transports.usb_transport.USBTransport._write":2895,"unitelabs.bus.transports.hid_transport":2906,"unitelabs.bus.transports.hid_transport.DEFAULT_USB_INTERFACE":2912,"unitelabs.bus.transports.hid_transport.POLL_WAIT_TIME":2914,"unitelabs.bus.transports.hid_transport.HIDTransport":2916,"unitelabs.bus.transports.hid_transport.HIDTransport.read_size":2949,"unitelabs.bus.transports.hid_transport.HIDTransport.__init__":2953,"unitelabs.bus.transports.hid_transport.HIDTransport.vendor":2966,"unitelabs.bus.transports.hid_transport.HIDTransport.product":2969,"unitelabs.bus.transports.hid_transport.HIDTransport.interface_number":2971,"unitelabs.bus.transports.hid_transport.HIDTransport.serial_number":2973,"unitelabs.bus.transports.hid_transport.HIDTransport.usage_page":2976,"unitelabs.bus.transports.hid_transport.HIDTransport.usage":2979,"unitelabs.bus.transports.hid_transport.HIDTransport.write_report_id":2982,"unitelabs.bus.transports.hid_transport.HIDTransport.read_report_id":2986,"unitelabs.bus.transports.hid_transport.HIDTransport._device":2990,"unitelabs.bus.transports.hid_transport.HIDTransport._was_opened":2996,"unitelabs.bus.transports.hid_transport.HIDTransport._reader_event":2998,"unitelabs.bus.transports.hid_transport.HIDTransport.logger":3000,"unitelabs.bus.transports.hid_transport.HIDTransport._open":3003,"unitelabs.bus.transports.hid_transport.HIDTransport._close":3008,"unitelabs.bus.transports.hid_transport.HIDTransport._ensure_reader":3013,"unitelabs.bus.transports.hid_transport.HIDTransport._remove_reader":3018,"unitelabs.bus.transports.hid_transport.HIDTransport.__read":3022,"unitelabs.bus.transports.hid_transport.HIDTransport._read":3026,"unitelabs.bus.transports.hid_transport.HIDTransport._ensure_writer":3034,"unitelabs.bus.transports.hid_transport.HIDTransport._remove_writer":3040,"unitelabs.bus.transports.hid_transport.HIDTransport._write":3044,"unitelabs.bus.transports.write_transport":3053,"unitelabs.bus.transports.write_transport.WritingOperationError":3058,"unitelabs.bus.transports.write_transport.WriteTransport":3066,"unitelabs.bus.transports.write_transport.WriteTransport.__init__":3102,"unitelabs.bus.transports.write_transport.WriteTransport._has_writer":3106,"unitelabs.bus.transports.write_transport.WriteTransport._is_writing_paused":3108,"unitelabs.bus.transports.write_transport.WriteTransport._write_buffer":3110,"unitelabs.bus.transports.write_transport.WriteTransport.open":3121,"unitelabs.bus.transports.write_transport.WriteTransport.close":3126,"unitelabs.bus.transports.write_transport.WriteTransport.writes_pending":3131,"unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_size":3135,"unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_limits":3143,"unitelabs.bus.transports.write_transport.WriteTransport.set_write_buffer_limits":3156,"unitelabs.bus.transports.write_transport.WriteTransport.write":3173,"unitelabs.bus.transports.write_transport.WriteTransport.can_write_eof":3185,"unitelabs.bus.transports.write_transport.WriteTransport.write_eof":3195,"unitelabs.bus.transports.write_transport.WriteTransport.writelines":3201,"unitelabs.bus.transports.write_transport.WriteTransport.flush":3219,"unitelabs.bus.transports.write_transport.WriteTransport._ensure_writer":3224,"unitelabs.bus.transports.write_transport.WriteTransport._remove_writer":3231,"unitelabs.bus.transports.write_transport.WriteTransport._abort":3238,"unitelabs.bus.transports.write_transport.WriteTransport._safe_write":3250,"unitelabs.bus.transports.write_transport.WriteTransport._write":3257,"unitelabs.bus.transports.write_transport.WriteTransport._maybe_pause_writing":3269,"unitelabs.bus.transports.write_transport.WriteTransport._maybe_resume_protocol":3275,"unitelabs.bus.transports.write_transport.WriteTransport._set_write_buffer_limits":3281,"unitelabs.bus.transports.base_transport":3301,"unitelabs.bus.transports.base_transport.P":3306,"unitelabs.bus.transports.base_transport.BaseTransport":3309,"unitelabs.bus.transports.base_transport.BaseTransport.__init__":3338,"unitelabs.bus.transports.base_transport.BaseTransport._loop":3342,"unitelabs.bus.transports.base_transport.BaseTransport._protocol":3345,"unitelabs.bus.transports.base_transport.BaseTransport._is_closing":3350,"unitelabs.bus.transports.base_transport.BaseTransport.get_protocol":3352,"unitelabs.bus.transports.base_transport.BaseTransport.set_protocol":3362,"unitelabs.bus.transports.base_transport.BaseTransport.is_closing":3375,"unitelabs.bus.transports.base_transport.BaseTransport.open":3383,"unitelabs.bus.transports.base_transport.BaseTransport._open":3388,"unitelabs.bus.transports.base_transport.BaseTransport.close":3393,"unitelabs.bus.transports.base_transport.BaseTransport._close":3399,"unitelabs.bus.transports.base_transport.BaseTransport.abort":3404,"unitelabs.bus.transports.base_transport.BaseTransport._abort":3410,"unitelabs.bus.transports.base_transport.BaseTransport._exception":3420,"unitelabs.bus.commands":3433,"unitelabs.bus.commands.multiline":3447,"unitelabs.bus.commands.multiline.multiline":3451,"unitelabs.bus.commands.__all__":3461,"unitelabs.bus.commands.request":3464,"unitelabs.bus.commands.request.Request":3467,"unitelabs.bus.commands.request.Request.payload":3478,"unitelabs.bus.commands.request.Request.timeout":3481,"unitelabs.bus.commands.request.Request.__post_init__":3486,"unitelabs.bus.commands.request.Request.__init__":3490,"unitelabs.bus.commands.command":3503,"unitelabs.bus.commands.command.InType":3514,"unitelabs.bus.commands.command.OutType":3517,"unitelabs.bus.commands.command.ResType":3520,"unitelabs.bus.commands.command.P":3523,"unitelabs.bus.commands.command.T":3526,"unitelabs.bus.commands.command.Parser":3529,"unitelabs.bus.commands.command.Serializer":3532,"unitelabs.bus.commands.command.Serializer.__call__":3544,"unitelabs.bus.commands.command.SelfSerializer":3557,"unitelabs.bus.commands.command.SelfSerializer.__call__":3568,"unitelabs.bus.commands.command.Deserializer":3581,"unitelabs.bus.commands.command.Deserializer.__call__":3592,"unitelabs.bus.commands.command.SelfDeserializer":3602,"unitelabs.bus.commands.command.SelfDeserializer.__call__":3613,"unitelabs.bus.commands.command.Command":3625,"unitelabs.bus.commands.command.Command.receiver":3667,"unitelabs.bus.commands.command.Command._parsers":3672,"unitelabs.bus.commands.command.Command.__new__":3679,"unitelabs.bus.commands.command.Command.__init__":3704,"unitelabs.bus.commands.command.Command._response":3719,"unitelabs.bus.commands.command.Command._request":3724,"unitelabs.bus.commands.command.Command.message":3729,"unitelabs.bus.commands.command.Command.timeout":3731,"unitelabs.bus.commands.command.Command._response_buffer":3733,"unitelabs.bus.commands.command.Command.is_void":3736,"unitelabs.bus.commands.command.Command.__repr__":3738,"unitelabs.bus.commands.command.Command.request":3744,"unitelabs.bus.commands.command.Command.response":3748,"unitelabs.bus.commands.command.Command.result":3753,"unitelabs.bus.commands.command.Command.serialize":3763,"unitelabs.bus.commands.command.Command._serialize":3778,"unitelabs.bus.commands.command.Command.deserialize":3790,"unitelabs.bus.commands.command.Command._deserialize":3803,"unitelabs.bus.commands.command.Command.validate_request":3814,"unitelabs.bus.commands.command.Command._set_response":3827,"unitelabs.bus.commands.command.Command.validate_response":3834,"unitelabs.bus.commands.command.Command._validate_response":3844,"unitelabs.bus.commands.command.Command.match_response":3857,"unitelabs.bus.commands.command.Command.parsers":3874,"unitelabs.bus.commands.command.Command.add_parser":3882,"unitelabs.bus.commands.command.Command.parse":3912,"unitelabs.bus.commands.builder":3923,"unitelabs.bus.commands.builder.P":3932,"unitelabs.bus.commands.builder.T":3934,"unitelabs.bus.commands.builder.R":3937,"unitelabs.bus.commands.builder.S_InType":3940,"unitelabs.bus.commands.builder.D_OutType":3943,"unitelabs.bus.commands.builder.CommandBuilder":3946,"unitelabs.bus.commands.builder.CommandBuilder.__init__":3992,"unitelabs.bus.commands.builder.CommandBuilder._command":4012,"unitelabs.bus.commands.builder.CommandBuilder._cmd_cls_name":4014,"unitelabs.bus.commands.builder.CommandBuilder._serializer":4016,"unitelabs.bus.commands.builder.CommandBuilder._deserializer":4018,"unitelabs.bus.commands.builder.CommandBuilder._response_validator":4020,"unitelabs.bus.commands.builder.CommandBuilder._response_validator_timeout":4022,"unitelabs.bus.commands.builder.CommandBuilder._timeout":4024,"unitelabs.bus.commands.builder.CommandBuilder._is_void":4026,"unitelabs.bus.commands.builder.CommandBuilder._parsers":4028,"unitelabs.bus.commands.builder.CommandBuilder.__copy__":4033,"unitelabs.bus.commands.builder.CommandBuilder.__deepcopy__":4045,"unitelabs.bus.commands.builder.CommandBuilder.create_command_method":4062,"unitelabs.bus.commands.builder.CommandBuilder.with_serializer":4113,"unitelabs.bus.commands.builder.CommandBuilder.with_deserializer":4139,"unitelabs.bus.commands.builder.CommandBuilder.with_parser":4175,"unitelabs.bus.commands.builder.CommandBuilder.with_timeout":4198,"unitelabs.bus.commands.builder.CommandBuilder.without_response":4220,"unitelabs.bus.commands.builder.CommandBuilder.with_multiline":4236,"unitelabs.bus.commands.builder.CommandBuilder.build":4288,"unitelabs.bus.commands.serial_command":4319,"unitelabs.bus.commands.serial_command.SerialCommand":4322,"unitelabs.bus.commands.serial_command.SerialCommand.__init__":4343,"unitelabs.bus.commands.serial_command.SerialCommand._read_terminator":4366,"unitelabs.bus.commands.serial_command.SerialCommand._write_terminator":4368,"unitelabs.bus.commands.serial_command.SerialCommand._encoding":4370,"unitelabs.bus.commands.serial_command.SerialCommand._serialize":4372,"unitelabs.bus.commands.serial_command.SerialCommand._deserialize":4382,"unitelabs.bus.commands.serial_command.SerialCommand._validate_response":4392,"unitelabs.bus.commands.http_command":4400,"unitelabs.bus.commands.http_command._Method":4405,"unitelabs.bus.commands.http_command._Method.OPTIONS":4423,"unitelabs.bus.commands.http_command._Method.GET":4426,"unitelabs.bus.commands.http_command._Method.HEAD":4429,"unitelabs.bus.commands.http_command._Method.POST":4432,"unitelabs.bus.commands.http_command._Method.PUT":4435,"unitelabs.bus.commands.http_command._Method.DELETE":4438,"unitelabs.bus.commands.http_command._Method.TRACE":4441,"unitelabs.bus.commands.http_command._Method.CONNECT":4444,"unitelabs.bus.commands.http_command._Method.PATCH":4447,"unitelabs.bus.commands.http_command.HTTPResponse":4450,"unitelabs.bus.commands.http_command.HTTPResponse.status_code":4461,"unitelabs.bus.commands.http_command.HTTPResponse.headers":4464,"unitelabs.bus.commands.http_command.HTTPResponse.payload":4473,"unitelabs.bus.commands.http_command.HTTPResponse.__init__":4478,"unitelabs.bus.commands.http_command.HTTPCommand":4497,"unitelabs.bus.commands.http_command.HTTPCommand.Method":4523,"unitelabs.bus.commands.http_command.HTTPCommand.__init__":4529,"unitelabs.bus.commands.http_command.HTTPCommand.host":4577,"unitelabs.bus.commands.http_command.HTTPCommand.path":4579,"unitelabs.bus.commands.http_command.HTTPCommand.method":4581,"unitelabs.bus.commands.http_command.HTTPCommand.headers":4583,"unitelabs.bus.commands.http_command.HTTPCommand.protocol_version":4586,"unitelabs.bus.commands.http_command.HTTPCommand.http_response":4588,"unitelabs.bus.commands.http_command.HTTPCommand._serialize":4593,"unitelabs.bus.commands.http_command.HTTPCommand._validate_response":4601,"unitelabs.bus.commands.http_command.HTTPCommand._deserialize":4609,"unitelabs.bus.commands.http_command.HTTPCommand._parse_http_response":4618,"unitelabs.bus.commands.byte_command":4633,"unitelabs.bus.commands.byte_command.ByteCommand":4636,"unitelabs.bus.commands.byte_command.ByteCommand.__init__":4652,"unitelabs.bus.commands.byte_command.ByteCommand._serialize":4667,"unitelabs.bus.commands.byte_command.ByteCommand._deserialize":4677,"unitelabs.bus.commands.response":4685,"unitelabs.bus.commands.response.Response":4688,"unitelabs.bus.commands.response.Response.request":4699,"unitelabs.bus.commands.response.Response.__post_init__":4702,"unitelabs.bus.commands.response.Response.__handle_done":4706,"unitelabs.bus.commands.response.Response.__init__":4718,"unitelabs.bus.factories":4724,"unitelabs.bus.factories.__all__":4736,"unitelabs.bus.factories.usb_factory":4739,"unitelabs.bus.factories.usb_factory.create_usb_connection":4742,"unitelabs.bus.factories.serial_factory":4767,"unitelabs.bus.factories.serial_factory.create_serial_connection":4770,"unitelabs.bus.factories.transport_factory":4805,"unitelabs.bus.factories.transport_factory.P":4809,"unitelabs.bus.factories.transport_factory.TransportFactory":4812,"unitelabs.bus.factories.transport_factory.TransportFactory.__call__":4821,"unitelabs.bus.factories.hid_factory":4839,"unitelabs.bus.factories.hid_factory.create_hid_connection":4842,"unitelabs.bus.factories.tcp_factory":4868,"unitelabs.bus.factories.tcp_factory.create_tcp_connection":4871,"unitelabs.bus.factories.udp_factory":4907,"unitelabs.bus.factories.udp_factory.create_udp_connection":4910,"unitelabs.bus.ByteCommand":4947,"unitelabs.bus.Command":4959,"unitelabs.bus.CommandBuilder":4973,"unitelabs.bus.CommandExecutionError":4991,"unitelabs.bus.CommandValidationError":4997,"unitelabs.bus.HIDTransport":5003,"unitelabs.bus.HTTPCommand":5011,"unitelabs.bus.InputValidationError":5024,"unitelabs.bus.NoSuchDeviceFound":5030,"unitelabs.bus.Protocol":5036,"unitelabs.bus.Request":5044,"unitelabs.bus.Response":5050,"unitelabs.bus.SerialCommand":5056,"unitelabs.bus.SerialDeviceManager":5069,"unitelabs.bus.SerialTransport":5077,"unitelabs.bus.TransportFactory":5085,"unitelabs.bus.USBTransport":5092,"unitelabs.bus.create_hid_connection":5100,"unitelabs.bus.create_serial_connection":5121,"unitelabs.bus.create_tcp_connection":5151,"unitelabs.bus.create_udp_connection":5177,"unitelabs.bus.create_usb_connection":5202,"unitelabs.bus.testing.DeviceMock":5223,"unitelabs.bus.testing.MockTransport":5231,"unitelabs.bus.testing.SerialDeviceMock":5239,"unitelabs.bus.testing.Stub":5247,"unitelabs.bus.testing.UDPDeviceMock":5249,"unitelabs.bus.testing.create_mock_connection":5257,"unitelabs.bus.testing.stub_maker":5280,"unitelabs.bus.protocols.Protocol":5294,"unitelabs.bus.utils.AutoDetector":5302,"unitelabs.bus.utils.DeviceInfo":5307,"unitelabs.bus.utils.SerialDeviceManager":5313,"unitelabs.bus.transports.BaseTransport":5321,"unitelabs.bus.transports.ByteSize":5333,"unitelabs.bus.transports.HIDTransport":5340,"unitelabs.bus.transports.Parity":5348,"unitelabs.bus.transports.ReadTransport":5357,"unitelabs.bus.transports.SerialTransport":5367,"unitelabs.bus.transports.StopBits":5375,"unitelabs.bus.transports.Transport":5384,"unitelabs.bus.transports.USBTransport":5395,"unitelabs.bus.transports.WriteTransport":5403,"unitelabs.bus.commands.ByteCommand":5413,"unitelabs.bus.commands.Command":5425,"unitelabs.bus.commands.CommandBuilder":5439,"unitelabs.bus.commands.HTTPCommand":5457,"unitelabs.bus.commands.InType":5470,"unitelabs.bus.commands.OutType":5472,"unitelabs.bus.commands.Request":5474,"unitelabs.bus.commands.ResType":5480,"unitelabs.bus.commands.Response":5482,"unitelabs.bus.commands.SerialCommand":5488,"unitelabs.bus.factories.TransportFactory":5501,"unitelabs.bus.factories.create_hid_connection":5508,"unitelabs.bus.factories.create_serial_connection":5529,"unitelabs.bus.factories.create_tcp_connection":5559,"unitelabs.bus.factories.create_udp_connection":5585,"unitelabs.bus.factories.create_usb_connection":5610},{"type":738,"name":739,"path":740,"parent":741,"packages":742,"attributes":750,"classes":752},"package","unitelabs.bus","unitelabs\u002Fbus\u002F__init__.py","unitelabs",[743,744,745,746,747,748,749],"unitelabs.bus.exceptions","unitelabs.bus.testing","unitelabs.bus.protocols","unitelabs.bus.utils","unitelabs.bus.transports","unitelabs.bus.commands","unitelabs.bus.factories",[751],"unitelabs.bus.__all__",[753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769],"unitelabs.bus.commands.byte_command.ByteCommand","unitelabs.bus.commands.command.Command","unitelabs.bus.commands.builder.CommandBuilder","unitelabs.bus.commands.http_command.HTTPCommand","unitelabs.bus.commands.request.Request","unitelabs.bus.commands.response.Response","unitelabs.bus.commands.serial_command.SerialCommand","unitelabs.bus.exceptions.CommandExecutionError","unitelabs.bus.exceptions.CommandValidationError","unitelabs.bus.exceptions.InputValidationError","unitelabs.bus.exceptions.NoSuchDeviceFound","unitelabs.bus.factories.transport_factory.TransportFactory","unitelabs.bus.protocols.protocol.Protocol","unitelabs.bus.transports.hid_transport.HIDTransport","unitelabs.bus.transports.serial_transport.SerialTransport","unitelabs.bus.transports.usb_transport.USBTransport","unitelabs.bus.utils.device_manager.SerialDeviceManager",{"type":771,"name":751,"path":740,"parent":739,"lines":772,"value":775},"attribute",[773,774],16,40,[753,754,755,760,761,766,756,762,763,765,757,758,759,769,767,764,768,776,777,778,779,780],"unitelabs.bus.factories.hid_factory.create_hid_connection","unitelabs.bus.factories.serial_factory.create_serial_connection","unitelabs.bus.factories.tcp_factory.create_tcp_connection","unitelabs.bus.factories.udp_factory.create_udp_connection","unitelabs.bus.factories.usb_factory.create_usb_connection",{"type":738,"name":743,"path":782,"parent":739,"classes":783},"unitelabs\u002Fbus\u002Fexceptions.py",[762,761,760,784,763,785],"unitelabs.bus.exceptions.CommandMethodValidationError","unitelabs.bus.exceptions.NoConnectionError",{"type":787,"name":762,"path":782,"parent":743,"description":788,"lines":789,"bases":792,"mro":797},"class","The inputs given are invalid for the interface that received them.",[790,791],1,2,[793],{"annotation":794},{"name":795,"cls":796},"ValueError","ExprName",[762],{"type":787,"name":761,"path":782,"parent":743,"description":799,"lines":800,"bases":803,"mro":806},"Command input is invalid.",[801,802],5,6,[804],{"annotation":805},{"name":762,"cls":796},[761,762],{"type":787,"name":760,"path":782,"parent":743,"description":808,"lines":809,"bases":812,"mro":816},"Command cannot be executed in current state.",[810,811],9,10,[813],{"annotation":814},{"name":815,"cls":796},"Exception",[760],{"type":787,"name":784,"path":782,"parent":743,"description":818,"lines":819,"bases":822,"mro":825},"Command Method is not valid.",[820,821],13,14,[823],{"annotation":824},{"name":815,"cls":796},[784],{"type":787,"name":763,"path":782,"parent":743,"description":827,"lines":828,"bases":831,"mro":834},"No matching device found.",[829,830],17,18,[832],{"annotation":833},{"name":815,"cls":796},[763],{"type":787,"name":785,"path":782,"parent":743,"description":836,"lines":837,"bases":840,"mro":843},"The requested operation is not possible as no connection is available.",[838,839],21,22,[841],{"annotation":842},{"name":815,"cls":796},[785],{"type":738,"name":744,"path":845,"parent":739,"packages":846,"attributes":854,"classes":856},"unitelabs\u002Fbus\u002Ftesting\u002F__init__.py",[847,848,849,850,851,852,853],"unitelabs.bus.testing.stub","unitelabs.bus.testing.serial_device_mock","unitelabs.bus.testing.mock_transport","unitelabs.bus.testing.udp_device_mock","unitelabs.bus.testing.mock_factory","unitelabs.bus.testing.device_mock","unitelabs.bus.testing.fixtures",[855],"unitelabs.bus.testing.__all__",[857,858,859,860],"unitelabs.bus.testing.device_mock.DeviceMock","unitelabs.bus.testing.mock_transport.MockTransport","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock",{"type":771,"name":855,"path":845,"parent":744,"lines":862,"value":864},[863,773],8,[857,858,859,865,860,866,867],"unitelabs.bus.testing.stub.Stub","unitelabs.bus.testing.mock_factory.create_mock_connection","unitelabs.bus.testing.stub.stub_maker",{"type":738,"name":847,"path":869,"parent":744,"attributes":870,"functions":871},"unitelabs\u002Fbus\u002Ftesting\u002Fstub.py",[865],[867],{"type":771,"name":865,"path":869,"parent":847,"lines":873,"value":875},[874,874],4,"typing.Callable[[bytes], bytes | collections.abc.Generator[bytes, None, None] | None]",{"type":877,"name":867,"path":869,"parent":847,"description":878,"lines":879,"parameters":882,"returns":900},"function","Create a stub for a given request and expected response.\n\nStubs can be used in combination with a `DeviceMock` to simulate request-specific device response behavior.",[880,881],7,32,[883,890],{"name":884,"kind":885,"annotation":886,"required":888,"description":889},"request","positional or keyword",{"name":887,"cls":796},"bytes",true,"The bytes that the device will receive.",{"name":891,"kind":885,"annotation":892,"required":888,"description":899},"expected_response",{"join":893},[894,895],{"name":887,"cls":796},{"left":896,"slice":898},{"name":897,"cls":796},"collections.abc.Sequence",{"name":887,"cls":796},"The response that the device will send upon receipt of `request`,\nif it is a `Sequence`, then the device will send all responses in the `Sequence` in order.",{"description":901,"annotation":902},"A callable which returns the `expected_response` when called with a bytes input matching `request`.",{"name":865,"cls":796},{"type":738,"name":848,"path":904,"parent":744,"classes":905},"unitelabs\u002Fbus\u002Ftesting\u002Fserial_device_mock.py",[859],{"type":787,"name":859,"path":904,"parent":848,"description":907,"lines":908,"bases":910,"attributes":913,"functions":917,"mro":925},"A device mock implementation that simulates a serial connection.\n\nThis implementation uses `pty` to simulate a serial connection, and thus\nis not supported on Windows.",[811,909],85,[911],{"annotation":912},{"name":857,"cls":796},[914,915,916],"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.cancel","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.reader","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.port",[918,919,920,921,922,923,924],"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__init__","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__enter__","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__exit__","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.open","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.close","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.receive","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.received",[859,857],{"type":877,"name":918,"path":904,"parent":859,"lines":927,"parameters":929},[830,928],26,[930,932],{"name":931,"kind":885,"required":888},"self",{"name":933,"kind":885,"annotation":934,"required":42,"default":940},"stubs",{"join":935},[936,940],{"left":937,"slice":939},{"name":938,"cls":796},"list",{"name":865,"cls":796},"None",{"type":771,"name":914,"path":904,"parent":859,"lines":942,"value":944},[943,943],25,"threading.Event()",{"type":771,"name":915,"path":904,"parent":859,"lines":946,"value":947},[928,928],"threading.Thread(target=(self.receive), daemon=True)",{"type":877,"name":919,"path":904,"parent":859,"lines":949,"parameters":952},[950,951],28,31,[953],{"name":931,"kind":885,"required":888},{"type":877,"name":920,"path":904,"parent":859,"lines":955,"parameters":958},[956,957],33,34,[959,960,962,964],{"name":931,"kind":885,"required":888},{"name":961,"kind":885,"required":888},"exc_type",{"name":963,"kind":885,"required":888},"exc_val",{"name":965,"kind":885,"required":888},"exc_tb",{"type":771,"name":916,"path":904,"parent":859,"description":967,"lines":968,"value":940,"annotation":970},"Port address of serial connection.",[969,774],37,{"name":971,"cls":796},"str",{"type":877,"name":921,"path":904,"parent":859,"description":973,"lines":974,"parameters":977},"Open the serial connection.",[975,976],42,45,[978],{"name":931,"kind":885,"required":888},{"type":877,"name":922,"path":904,"parent":859,"description":980,"lines":981,"parameters":984},"Close the serial connection.",[982,983],47,62,[985],{"name":931,"kind":885,"required":888},{"type":877,"name":923,"path":904,"parent":859,"description":987,"lines":988,"parameters":991},"Receive data from the mock serial device.",[989,990],64,81,[992],{"name":931,"kind":885,"required":888},{"type":877,"name":924,"path":904,"parent":859,"description":994,"lines":995,"parameters":997},"Log data received by the mock serial device.",[996,909],83,[998,999],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":1001,"required":888},"data",{"name":887,"cls":796},{"type":738,"name":849,"path":1003,"parent":744,"classes":1004},"unitelabs\u002Fbus\u002Ftesting\u002Fmock_transport.py",[858],{"type":787,"name":858,"path":1003,"parent":849,"description":1006,"lines":1007,"bases":1010,"attributes":1014,"functions":1021,"mro":1027},"Mock `Transport` functionality.\n\nMust provide either `stubs` or set `autorespond=True` to get responses.",[1008,1009],12,134,[1011],{"annotation":1012},{"name":1013,"cls":796},"unitelabs.bus.transports.transport.Transport",[1015,1016,1017,1018,1019,1020],"unitelabs.bus.testing.mock_transport.MockTransport.stubs","unitelabs.bus.testing.mock_transport.MockTransport.device","unitelabs.bus.testing.mock_transport.MockTransport.autorespond","unitelabs.bus.testing.mock_transport.MockTransport.queue","unitelabs.bus.testing.mock_transport.MockTransport.mock","unitelabs.bus.testing.mock_transport.MockTransport.kwargs",[1022,1023,1024,1025,1026],"unitelabs.bus.testing.mock_transport.MockTransport.__init__","unitelabs.bus.testing.mock_transport.MockTransport.write","unitelabs.bus.testing.mock_transport.MockTransport._add_to_queue","unitelabs.bus.testing.mock_transport.MockTransport._write","unitelabs.bus.testing.mock_transport.MockTransport._read",[858,1013,1028,1029,1030],"unitelabs.bus.transports.read_transport.ReadTransport","unitelabs.bus.transports.write_transport.WriteTransport","unitelabs.bus.transports.base_transport.BaseTransport",{"type":877,"name":1022,"path":1003,"parent":858,"lines":1032,"parameters":1034},[950,1033],61,[1035,1036,1043,1049,1055],{"name":931,"kind":885,"required":888},{"name":933,"kind":885,"annotation":1037,"required":42,"default":940,"description":1042},{"join":1038},[1039,940],{"left":1040,"slice":1041},{"name":938,"cls":796},{"name":865,"cls":796},"List of callable functions that return responses based matching to requests.",{"name":1044,"kind":885,"annotation":1045,"required":42,"default":940,"description":1048},"device",{"join":1046},[1047,940],{"name":857,"cls":796},"A `DeviceMock` through which device communication will be mocked.",{"name":1050,"kind":885,"annotation":1051,"required":42,"default":1053,"description":1054},"autorespond",{"name":1052,"cls":796},"bool","False","Whether to return request bytes without checking `stubs`, i.e. loopback responses.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":1059},"**kwargs","variadic keyword","{}","Any additional `Transport` init kwargs.",{"type":771,"name":1015,"path":1003,"parent":858,"lines":1061,"value":1062},[774,774],"stubs or []",{"type":771,"name":1016,"path":1003,"parent":858,"lines":1064,"value":1044},[1065,1065],41,{"type":771,"name":1017,"path":1003,"parent":858,"lines":1067,"value":1050},[1068,1068],44,{"type":771,"name":1018,"path":1003,"parent":858,"lines":1070,"value":1071},[976,976],"queue.Queue()",{"type":771,"name":1019,"path":1003,"parent":858,"lines":1073,"value":1074},[982,982],"unittest.mock.Mock()",{"type":771,"name":1020,"path":1003,"parent":858,"lines":1076,"value":1078},[1077,1077],50,"kwargs",{"type":877,"name":1023,"path":1003,"parent":858,"description":1080,"lines":1081,"parameters":1084},"Write some data bytes to the transport.\n\nThis does not block; it buffers the data and arranges for it to be sent out asynchronously.",[1082,1083],63,74,[1085,1086],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":1087,"required":888,"description":1088},{"name":887,"cls":796},"The bytes to write to the Transport.",{"type":877,"name":1024,"path":1003,"parent":858,"description":1090,"lines":1091,"parameters":1094,"returns":1106},"Add a values to response `Queue`.",[1092,1093],76,104,[1095,1096],{"name":931,"kind":885,"required":888},{"name":1097,"kind":885,"annotation":1098,"required":888,"description":1105},"response",{"join":1099},[1100,1101,940],{"name":887,"cls":796},{"left":1102,"slice":1104},{"name":1103,"cls":796},"collections.abc.Generator",{"name":887,"cls":796},"The `Stub` response to add to the queue, if it is a `Generator`\nthen all values will be added to the queue in order.",{"description":1107,"annotation":1108},"`True` if a response was added to the queue, `False` otherwise.",{"name":1052,"cls":796},{"type":877,"name":1025,"path":1003,"parent":858,"lines":1110,"parameters":1113,"returns":1117},[1111,1112],106,124,[1114,1115],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":1116,"required":888},{"name":887,"cls":796},{"description":1118,"annotation":1119},null,{"name":1120,"cls":796},"int",{"type":877,"name":1026,"path":1003,"parent":858,"lines":1122,"parameters":1124,"returns":1126},[1123,1009],126,[1125],{"name":931,"kind":885,"required":888},{"description":1118,"annotation":1127},{"join":1128},[1129,940],{"name":887,"cls":796},{"type":738,"name":850,"path":1131,"parent":744,"attributes":1132,"classes":1134},"unitelabs\u002Fbus\u002Ftesting\u002Fudp_device_mock.py",[1133],"unitelabs.bus.testing.udp_device_mock.UDP_SERVER_ADDR",[860],{"type":771,"name":1133,"path":1131,"parent":850,"lines":1136,"value":1137},[810,810],"('127.0.0.1', 0)",{"type":787,"name":860,"path":1131,"parent":850,"description":1139,"lines":1140,"bases":1142,"attributes":1145,"functions":1152,"mro":1160},"Mock UDP Device.",[1008,1141],84,[1143],{"annotation":1144},{"name":857,"cls":796},[1146,1147,1148,1149,1150,1151],"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.socket","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.cancel","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.loop","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.host","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.port","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.address",[1153,1154,1155,1156,1157,1158,1159],"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__init__","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__enter__","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__exit__","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.open","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.close","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.receive","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.received",[860,857],{"type":877,"name":1153,"path":1131,"parent":860,"lines":1162,"parameters":1165},[1163,1164],15,24,[1166,1167],{"name":931,"kind":885,"required":888},{"name":933,"kind":885,"annotation":1168,"required":42,"default":940},{"join":1169},[1170,940],{"left":1171,"slice":1172},{"name":938,"cls":796},{"name":865,"cls":796},{"type":771,"name":1146,"path":1131,"parent":860,"lines":1174,"value":1175},[829,829],"socket.socket(socket.AF_INET, socket.SOCK_DGRAM)",{"type":771,"name":1147,"path":1131,"parent":860,"lines":1177,"value":944},[1178,1178],19,{"type":771,"name":1148,"path":1131,"parent":860,"lines":1180,"value":1181},[839,839],"asyncio.get_running_loop()",{"type":877,"name":1154,"path":1131,"parent":860,"lines":1183,"parameters":1184},[928,950],[1185],{"name":931,"kind":885,"required":888},{"type":877,"name":1155,"path":1131,"parent":860,"lines":1187,"parameters":1189},[1188,951],30,[1190,1191,1192,1193],{"name":931,"kind":885,"required":888},{"name":961,"kind":885,"required":888},{"name":963,"kind":885,"required":888},{"name":965,"kind":885,"required":888},{"type":771,"name":1149,"path":1131,"parent":860,"description":1195,"lines":1196,"value":940,"annotation":1198},"The UDP socket host.",[957,1197],36,{"name":971,"cls":796},{"type":771,"name":1150,"path":1131,"parent":860,"description":1200,"lines":1201,"value":940,"annotation":1203},"The UDP socket port.",[1202,1065],39,{"name":1120,"cls":796},{"type":771,"name":1151,"path":1131,"parent":860,"description":1205,"lines":1206,"value":940,"annotation":1208},"Full address of UDP device socket.",[1068,1207],46,{"left":1209,"slice":1211},{"name":1210,"cls":796},"tuple",{"elements":1212},[1213,1214],{"name":971,"cls":796},{"name":1120,"cls":796},{"type":877,"name":1156,"path":1131,"parent":860,"description":1216,"lines":1217,"parameters":1220},"Open mock UDP device socket.",[1218,1219],48,53,[1221],{"name":931,"kind":885,"required":888},{"type":877,"name":1157,"path":1131,"parent":860,"description":1223,"lines":1224,"parameters":1227},"Close mock UDP device socket.",[1225,1226],55,59,[1228],{"name":931,"kind":885,"required":888},{"type":877,"name":1158,"path":1131,"parent":860,"description":1230,"lines":1231,"parameters":1233,"returns":1235},"Receive data from the UDP device.",[1033,1232],80,[1234],{"name":931,"kind":885,"required":888},{"description":1118,"annotation":1236},{"join":1237},[1238,940],{"name":887,"cls":796},{"type":877,"name":1159,"path":1131,"parent":860,"description":1240,"lines":1241,"parameters":1243},"Log data received by the mock UDP device.",[1242,1141],82,[1244,1245,1247],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":1246,"required":888},{"name":887,"cls":796},{"name":1248,"kind":885,"annotation":1249,"required":888},"client_addr",{"name":971,"cls":796},{"type":738,"name":851,"path":1251,"parent":744,"functions":1252},"unitelabs\u002Fbus\u002Ftesting\u002Fmock_factory.py",[866],{"type":877,"name":866,"path":1251,"parent":851,"description":1254,"lines":1255,"parameters":1256,"returns":1278},"Create a `MockTransport` connection.",[863,1188],[1257,1269,1277],{"name":1258,"kind":1259,"annotation":1260,"required":888,"description":1268},"protocol_factory","positional-only",{"left":1261,"slice":1263},{"name":1262,"cls":796},"typing.Callable",{"elements":1264},[1265,1266],"...",{"name":1267,"cls":796},"unitelabs.bus.factories.transport_factory.P","A callable which returns a `Protocol` instance.",{"name":933,"kind":1270,"annotation":1271,"required":42,"default":940,"description":1276},"keyword-only",{"join":1272},[1273,940],{"left":1274,"slice":1275},{"name":938,"cls":796},{"name":865,"cls":796},"A list of `Stub` callables used to mock device request-response.",{"name":1056,"kind":1057,"required":42,"default":1058},{"description":1279,"annotation":1280},"A `MockTransport` configured with `stubs` and its attached `Protocol` instance.",{"left":1281,"slice":1282},{"name":1210,"cls":796},{"elements":1283},[1284,1285],{"name":858,"cls":796},{"name":1267,"cls":796},{"type":738,"name":852,"path":1287,"parent":744,"classes":1288},"unitelabs\u002Fbus\u002Ftesting\u002Fdevice_mock.py",[857],{"type":787,"name":857,"path":1287,"parent":852,"description":1290,"lines":1291,"bases":1292,"attributes":1296,"functions":1299,"mro":1302},"Mock device (hardware or software components) for testing purposes.",[810,983],[1293],{"annotation":1294},{"name":1295,"cls":796},"contextlib.AbstractContextManager",[1297,1298],"unitelabs.bus.testing.device_mock.DeviceMock.stubs","unitelabs.bus.testing.device_mock.DeviceMock.logger",[1300,1301],"unitelabs.bus.testing.device_mock.DeviceMock.__init__","unitelabs.bus.testing.device_mock.DeviceMock.get_response",[857],{"type":877,"name":1300,"path":1287,"parent":857,"lines":1304,"parameters":1305},[838,839],[1306,1307],{"name":931,"kind":885,"required":888},{"name":933,"kind":885,"annotation":1308,"required":42,"default":940,"description":1313},{"join":1309},[1310,940],{"left":1311,"slice":1312},{"name":938,"cls":796},{"name":865,"cls":796},"An optional list of stub methods that receive the same request as\nthe device and optionally return the corresponding response. Stubs can\nbe modified later on by directly modifying the `mock.stubs` list. Stubs\nat the end of the list have a higher priority and overwrite responses\nfrom the stubs at the beginning of the list.",{"type":771,"name":1297,"path":1287,"parent":857,"description":1315,"lines":1316,"value":940,"annotation":1318},"Methods which when supplied a bytestring request may return a response.",[943,1317],27,{"left":1319,"slice":1320},{"name":938,"cls":796},{"name":865,"cls":796},{"type":771,"name":1298,"path":1287,"parent":857,"description":1322,"lines":1323,"value":940,"annotation":1324},"A standard python logger available to debug device mocks.",[957,969],{"name":1325,"cls":796},"logging.Logger",{"type":877,"name":1301,"path":1287,"parent":857,"description":1327,"lines":1328,"parameters":1329,"returns":1334},"Return the stubbed response for a given request.\n\nResponses from stubs at the end of the list have a higher priority and overwrite responses\nfrom the stubs at the beginning of the list.",[1202,983],[1330,1331],{"name":931,"kind":885,"required":888},{"name":884,"kind":885,"annotation":1332,"required":888,"description":1333},{"name":887,"cls":796},"The request sent to the hardware.",{"description":1335,"annotation":1336},"The response corresponding to the received request.",{"join":1337},[1338,940],{"left":1339,"slice":1340},{"name":1103,"cls":796},{"name":887,"cls":796},{"type":738,"name":853,"path":1342,"parent":744,"description":1343,"functions":1344},"unitelabs\u002Fbus\u002Ftesting\u002Ffixtures.py","Pytest plugin for testing using `unitelabs.bus`.\n\nCan be integrated into pytest framework by adding to `conftest.py`:\n>>> pytest_plugins = [\"unitelabs.bus.testing.fixtures\"]",[1345,1346,1347,1348,1349,1350],"unitelabs.bus.testing.fixtures.mock_factory","unitelabs.bus.testing.fixtures.serial_device","unitelabs.bus.testing.fixtures.udp_device","unitelabs.bus.testing.fixtures.mk_partial_protocol","unitelabs.bus.testing.fixtures.mk_stubbed_protocol","unitelabs.bus.testing.fixtures.protocol",{"type":877,"name":1345,"path":1342,"parent":853,"description":1352,"lines":1353,"decorators":1354,"returns":1356},"Return `create_mock_connection` function.",[1164,957],[1355],"pytest.fixture",{"description":1118,"annotation":1357},{"name":764,"cls":796},{"type":877,"name":1346,"path":1342,"parent":853,"description":1359,"lines":1360,"decorators":1361,"returns":1362},"Self-closing mock serial device for testing.",[969,1065],[1355],{"description":1118,"annotation":1363},{"left":1364,"slice":1366},{"name":1365,"cls":796},"typing.AsyncGenerator",{"elements":1367},[1368,940],{"name":859,"cls":796},{"type":877,"name":1347,"path":1342,"parent":853,"description":1370,"lines":1371,"decorators":1372,"returns":1373},"Self-closing mock UDP device for testing.",[1068,1218],[1355],{"description":1118,"annotation":1374},{"left":1375,"slice":1376},{"name":1365,"cls":796},{"elements":1377},[1378,940],{"name":860,"cls":796},{"type":877,"name":1348,"path":1342,"parent":853,"lines":1380,"decorators":1383,"returns":1384},[1381,1382],51,102,[1355],{"description":1118,"annotation":1385},{"left":1386,"slice":1387},{"name":1262,"cls":796},{"elements":1388},[1389,1396],{"elements":1390},[1391,1395],{"left":1392,"slice":1394},{"name":1393,"cls":796},"type",{"name":765,"cls":796},{"name":764,"cls":796},{"left":1397,"slice":1398},{"name":1262,"cls":796},{"elements":1399},[1400,1401],{},{"name":765,"cls":796},{"type":877,"name":1349,"path":1342,"parent":853,"lines":1403,"decorators":1406,"parameters":1407,"returns":1410},[1404,1405],105,165,[1355],[1408],{"name":1409,"kind":885,"required":888},"mk_partial_protocol",{"description":1118,"annotation":1411},{"left":1412,"slice":1413},{"name":1262,"cls":796},{"elements":1414},[1415,1441],{"elements":1416},[1417,1420,1434],{"left":1418,"slice":1419},{"name":1393,"cls":796},{"name":765,"cls":796},{"join":1421},[1422,940],{"left":1423,"slice":1425},{"name":1424,"cls":796},"dict",{"elements":1426},[1427,1428],{"name":887,"cls":796},{"join":1429},[1430,1431],{"name":887,"cls":796},{"left":1432,"slice":1433},{"name":897,"cls":796},{"name":887,"cls":796},{"left":1435,"slice":1436},{"name":1424,"cls":796},{"elements":1437},[1438,1439],{"name":971,"cls":796},{"name":1440,"cls":796},"typing.Any",{"name":765,"cls":796},{"type":877,"name":1350,"path":1342,"parent":853,"description":1443,"lines":1444,"decorators":1447,"parameters":1448,"returns":1452},"Create an opened instance of the `Protocol` class, initialized with customizable parameters.\n\nThe `Protocol` instance will automatically be cleaned up after use.\n\nExamples:\n1. Using the fixture with default parameters:\n>>> async def test_with_default_protocol(protocol: Protocol):\n>>>     assert protocol is not None\n\n2. Parameterizing the fixture to customize `Protocol` initialization:\n>>> @pytest.mark.parametrize(\"protocol\", [{\"max_reconnect_attempts\": 2}], indirect=[\"protocol\"])\n>>> async def test_with_custom_protocol(protocol: Protocol):\n>>>     assert protocol.max_reconnect_attempts == 2",[1445,1446],168,192,[1355],[1449],{"name":884,"kind":885,"annotation":1450,"required":888},{"name":1451,"cls":796},"pytest.FixtureRequest",{"description":1118,"annotation":1453},{"name":765,"cls":796},{"type":738,"name":745,"path":1455,"parent":739,"packages":1456,"attributes":1458,"classes":1460},"unitelabs\u002Fbus\u002Fprotocols\u002F__init__.py",[1457],"unitelabs.bus.protocols.protocol",[1459],"unitelabs.bus.protocols.__all__",[765],{"type":771,"name":1459,"path":1455,"parent":745,"lines":1462,"value":1464},[1463,1463],3,[765],{"type":738,"name":1457,"path":1466,"parent":745,"attributes":1467,"classes":1471},"unitelabs\u002Fbus\u002Fprotocols\u002Fprotocol.py",[1468,1469,1470],"unitelabs.bus.protocols.protocol.DEFAULT_RECONNECT_DELAY","unitelabs.bus.protocols.protocol.DEFAULT_MAX_RECONNECT_ATTEMPTS","unitelabs.bus.protocols.protocol.DEFAULT_MAX_PARALLEL_COMMANDS",[765],{"type":771,"name":1468,"path":1466,"parent":1457,"lines":1473,"value":1474},[821,821],"20.0",{"type":771,"name":1469,"path":1466,"parent":1457,"lines":1476,"value":1477},[1163,1163],"3",{"type":771,"name":1470,"path":1466,"parent":1457,"lines":1479,"value":1480},[773,773],"1",{"type":787,"name":765,"path":1466,"parent":1457,"description":1482,"lines":1483,"bases":1485,"attributes":1489,"functions":1507,"mro":1523},"Base communication Protocol.",[1178,1484],384,[1486],{"annotation":1487},{"name":1488,"cls":796},"asyncio.Protocol",[1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506],"unitelabs.bus.protocols.protocol.Protocol.transport","unitelabs.bus.protocols.protocol.Protocol._transport_allows_writing","unitelabs.bus.protocols.protocol.Protocol._transport_factory","unitelabs.bus.protocols.protocol.Protocol._transport_kwargs","unitelabs.bus.protocols.protocol.Protocol._commands","unitelabs.bus.protocols.protocol.Protocol.lock","unitelabs.bus.protocols.protocol.Protocol.is_open","unitelabs.bus.protocols.protocol.Protocol.autodetect","unitelabs.bus.protocols.protocol.Protocol._autodetector","unitelabs.bus.protocols.protocol.Protocol._validation_kwargs","unitelabs.bus.protocols.protocol.Protocol.is_validated","unitelabs.bus.protocols.protocol.Protocol.reconnect","unitelabs.bus.protocols.protocol.Protocol.reconnect_delay","unitelabs.bus.protocols.protocol.Protocol.remaining_reconnect_attempts","unitelabs.bus.protocols.protocol.Protocol.max_reconnect_attempts","unitelabs.bus.protocols.protocol.Protocol.logger","unitelabs.bus.protocols.protocol.Protocol.autodetector",[1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522],"unitelabs.bus.protocols.protocol.Protocol.__init__","unitelabs.bus.protocols.protocol.Protocol.connect","unitelabs.bus.protocols.protocol.Protocol._connect_transport","unitelabs.bus.protocols.protocol.Protocol.identity","unitelabs.bus.protocols.protocol.Protocol.validate","unitelabs.bus.protocols.protocol.Protocol.open","unitelabs.bus.protocols.protocol.Protocol.close","unitelabs.bus.protocols.protocol.Protocol.connection_made","unitelabs.bus.protocols.protocol.Protocol.connection_lost","unitelabs.bus.protocols.protocol.Protocol.pause_writing","unitelabs.bus.protocols.protocol.Protocol.resume_writing","unitelabs.bus.protocols.protocol.Protocol.data_received","unitelabs.bus.protocols.protocol.Protocol.datagram_received","unitelabs.bus.protocols.protocol.Protocol.error_received","unitelabs.bus.protocols.protocol.Protocol.execute",[765],{"type":877,"name":1508,"path":1466,"parent":765,"lines":1525,"parameters":1527},[1197,1526],70,[1528,1529,1533,1538,1544,1549,1553,1558],{"name":931,"kind":885,"required":888},{"name":1530,"kind":885,"annotation":1531,"required":888,"description":1532},"transport_factory",{"name":764,"cls":796},"A callable used to create a connection to a transport.",{"name":1534,"kind":885,"annotation":1535,"required":42,"default":1536,"description":1537},"reconnect",{"name":1052,"cls":796},"True","Whether or not to a attempt to reconnect to a device when the connection is lost.",{"name":1539,"kind":885,"annotation":1540,"required":42,"default":1542,"description":1543},"reconnect_delay",{"name":1541,"cls":796},"float",{"name":1468,"cls":796},"How long in seconds to wait between reconnection attempts.",{"name":1545,"kind":885,"annotation":1546,"required":42,"default":1547,"description":1548},"max_reconnect_attempts",{"name":1120,"cls":796},{"name":1469,"cls":796},"How many times to attempt to reconnect to a device before\nconnection is considered lost.",{"name":1550,"kind":885,"annotation":1551,"required":42,"default":1053,"description":1552},"autodetect",{"name":1052,"cls":796},"Whether or not to use autodetection for device connectivity.",{"name":1554,"kind":885,"annotation":1555,"required":42,"default":1556,"description":1557},"max_parallel_commands",{"name":1120,"cls":796},{"name":1470,"cls":796},"The maximum number of commands to process in parallel.\nThis should be 1 for serial transports, but can be configured to allow more\ndepending on the processing capacity of alternative transports.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":1559},"additional kwargs, including kwargs for use with `TransportFactory`.",{"type":771,"name":1490,"path":1466,"parent":765,"lines":1561,"value":940,"annotation":1562},[1207,1207],{"join":1563},[1564,940],{"name":1565,"cls":796},"asyncio.Transport",{"type":771,"name":1491,"path":1466,"parent":765,"lines":1567,"value":1536},[1218,1218],{"type":771,"name":1492,"path":1466,"parent":765,"lines":1569,"value":1530},[1570,1570],49,{"type":771,"name":1493,"path":1466,"parent":765,"lines":1572,"value":1078},[1077,1077],{"type":771,"name":1494,"path":1466,"parent":765,"lines":1574,"value":1576,"annotation":1577},[1575,1575],52,"[]",{"left":1578,"slice":1579},{"name":938,"cls":796},{"name":754,"cls":796},{"type":771,"name":1495,"path":1466,"parent":765,"lines":1581,"value":1582},[1219,1219],"asyncio.BoundedSemaphore(value=max_parallel_commands)",{"type":771,"name":1496,"path":1466,"parent":765,"lines":1584,"value":1586},[1585,1585],56,"asyncio.Event()",{"type":771,"name":1497,"path":1466,"parent":765,"lines":1588,"value":1550},[1226,1226],{"type":771,"name":1498,"path":1466,"parent":765,"lines":1590,"value":940},[1591,1591],60,{"type":771,"name":1499,"path":1466,"parent":765,"lines":1593,"value":940},[1082,1082],{"type":771,"name":1500,"path":1466,"parent":765,"lines":1595,"value":1586},[989,989],{"type":771,"name":1501,"path":1466,"parent":765,"lines":1597,"value":1534},[1598,1598],67,{"type":771,"name":1502,"path":1466,"parent":765,"lines":1600,"value":1539},[1601,1601],68,{"type":771,"name":1503,"path":1466,"parent":765,"lines":1603,"value":1545},[1604,1604],69,{"type":771,"name":1504,"path":1466,"parent":765,"lines":1606,"value":1545},[1526,1526],{"type":771,"name":1505,"path":1466,"parent":765,"description":1608,"lines":1609,"value":940,"annotation":1611},"A standard python logger.",[1610,1092],73,{"name":1325,"cls":796},{"type":771,"name":1506,"path":1466,"parent":765,"description":1613,"lines":1614,"value":940,"annotation":1616},"An `Autodetector` for connecting\u002Fre-connecting to certian devices.",[1615,1141],79,{"name":1617,"cls":796},"unitelabs.bus.utils.autodetect.AutoDetector",{"type":877,"name":1509,"path":1466,"parent":765,"description":1619,"lines":1620,"parameters":1623,"returns":1633},"Open a connection to a new `Transport`.\n\nCloses the old connection, if it exists, before opening the new connection.",[1621,1622],86,113,[1624,1625,1630],{"name":931,"kind":885,"required":888},{"name":1530,"kind":885,"annotation":1626,"required":42,"default":940,"description":1629},{"join":1627},[1628,940],{"name":764,"cls":796},"A callable used to create a connection to a transport,\ndefaults to `self._transport_factory` set from the constructor.",{"name":1631,"kind":1057,"required":42,"default":1058,"description":1632},"**transport_kwargs","Kwargs to pass into the `transport_factory`.",{"description":1634,"annotation":1635},"A tuple containing the `TransportFactory` and kwargs for the previously connected `Transport`.",{"left":1636,"slice":1637},{"name":1210,"cls":796},{"elements":1638},[1639,1640],{"name":764,"cls":796},{"left":1641,"slice":1642},{"name":1424,"cls":796},{"elements":1643},[1644,1645],{"name":971,"cls":796},{"name":1440,"cls":796},{"type":877,"name":1510,"path":1466,"parent":765,"description":1647,"lines":1648,"parameters":1651},"Create a new transport instance.",[1649,1650],115,121,[1652,1653],{"name":931,"kind":885,"required":888},{"name":1056,"kind":1057,"required":42,"default":1058},{"type":877,"name":1511,"path":1466,"parent":765,"description":1655,"lines":1656,"parameters":1659,"returns":1664,"throws":1667,"examples":1672},"Validate the identity of the connected device.\n\nThis method will call another user-defined method on `Protocol`\nand compare the device's response (i.e. the method's return value)\nto values provided in `config_kwargs`.",[1657,1658],123,155,[1660,1661],{"name":931,"kind":885,"required":888},{"name":1662,"kind":1057,"required":42,"default":1058,"description":1663},"**config_kwargs","kwargs sent from `validate`",{"description":1665,"annotation":1666},"True if the result of the inner call matches the expectation from `config_kwargs` else False.",{"name":1052,"cls":796},[1668],{"description":1669,"annotation":1670},"if `autodetect=True` and `identity` is not implemented.",{"name":1671,"cls":796},"NotImplementedError",[1673],{"description":1674,"code":1675},"",">>> class MyProtocol(Protocol):\n>>>   async def get_serial_number(self) -> str:\n>>>     ...\n>>>   async def identity(self, **config_kwargs) -> bool:\n>>>     serial_number = await self.get_serial_number()\n>>>     return serial_number == config_kwargs[\"serial_number\"]\n>>> p = MyProtocol(...)\n>>> cfg = {\"serial_number\": \"my_serial_number\"}\n>>> await p.open(**cfg)",{"type":877,"name":1512,"path":1466,"parent":765,"description":1677,"lines":1678,"parameters":1681,"returns":1690,"examples":1693},"Validate the opened connection.\n\nThis method will be called by user after `__init__` via `open`;\nit calls `identity` to determine if the connected device is the one\nthat was expected.\n\nIf autodetect=True this is called internally by `unitelabs.bus.utils.AutoDetector` to cycle through\npossile devices until the correct device or no device is found.\n\n`validation_kwargs` and `__init__` kwargs are stored on the `Protocol` such that they must only be provided\nonce. If there be values which overlap, `__init__` values are overwritten by values in `validation_kwargs`.\n\n`validation_kwargs` may contain stable information about the device. Check `unitelabs.bus.utils.device_manager`\nfor more information about valid device filter kwargs.",[1679,1680],157,201,[1682,1683,1687],{"name":931,"kind":885,"required":888},{"name":1684,"kind":885,"annotation":1685,"required":888,"description":1686},"timeout",{"name":1541,"cls":796},"How long in seconds to wait for a response from the device.",{"name":1688,"kind":1057,"required":42,"default":1058,"description":1689},"**validation_kwargs","Kwargs to use to run validation of the device, in the case of\nuse with `autodetect=True`, these kwargs will be stored on the first call for all future validations.",{"description":1691,"annotation":1692},"Propagated return value from `identity`; True if `identity` returns True else False",{"name":1052,"cls":796},[1694],{"description":1674,"code":1695},">>> p = Protocol(t:TransportFactory, **kwargs)  # kwargs passed to `Protocol` p and `Transport` t\n>>> p.open(**config_kwargs)  # user-parsed config variables set",{"type":877,"name":1513,"path":1466,"parent":765,"description":1697,"lines":1698,"parameters":1701},"Open underlying `Transport`, establish a connection to a device and validate the device's identity.",[1699,1700],203,221,[1702,1703,1708],{"name":931,"kind":885,"required":888},{"name":1704,"kind":885,"annotation":1705,"required":42,"default":1706,"description":1707},"validation_timeout",{"name":1541,"cls":796},"1.0","How long in seconds to wait for a response to `Protocol.validate`.",{"name":1688,"kind":1057,"required":42,"default":1058,"description":1709},"kwargs to be passed to `Protocol.validate` to test device identity against.",{"type":877,"name":1514,"path":1466,"parent":765,"description":1711,"lines":1712,"parameters":1715},"Close underlying `Transport`.\n\nExplicitly calling `close` will NOT attempt to reconnect to the `Transport`.",[1713,1714],223,232,[1716],{"name":931,"kind":885,"required":888},{"type":877,"name":1515,"path":1466,"parent":765,"description":1718,"lines":1719,"parameters":1722},"Respond to a connection made event invoked by the transport.",[1720,1721],234,239,[1723,1724],{"name":931,"kind":885,"required":888},{"name":1725,"kind":885,"annotation":1726,"required":888},"transport",{"name":1565,"cls":796},{"type":877,"name":1516,"path":1466,"parent":765,"description":1728,"lines":1729,"parameters":1732},"Respond to a lost connection event invoked by the transport.\n\nAttempts to reconnect after `reconnect_delay` seconds.\n\nHere `exc` can be None as a result of :\n    - manual abort through direct call of transport's `abort` method\n    - connection closing after `_safe_write` successfully wrote all data in write-buffer",[1730,1731],241,270,[1733,1734],{"name":931,"kind":885,"required":888},{"name":1735,"kind":885,"annotation":1736,"required":42,"default":940},"exc",{"join":1737},[1738,940],{"name":815,"cls":796},{"type":877,"name":1517,"path":1466,"parent":765,"description":1740,"lines":1741,"parameters":1744},"Set state to disallow writing.",[1742,1743],272,275,[1745],{"name":931,"kind":885,"required":888},{"type":877,"name":1518,"path":1466,"parent":765,"description":1747,"lines":1748,"parameters":1751},"Set state to allow writing.",[1749,1750],277,279,[1752],{"name":931,"kind":885,"required":888},{"type":877,"name":1519,"path":1466,"parent":765,"description":1754,"lines":1755,"parameters":1758},"Receive data from the `Transport`.\n\nLogs the data and sets the response if not already set.\nFurther invocations with the same `Response` will only be logged.",[1756,1757],281,295,[1759,1760],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":1761,"required":888,"description":1762},{"name":887,"cls":796},"The data received.",{"type":877,"name":1520,"path":1466,"parent":765,"description":1764,"lines":1765,"parameters":1768},"Receive a datagram from the `Transport`.",[1766,1767],297,306,[1769,1770,1773],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":1771,"required":888,"description":1772},{"name":887,"cls":796},"The datagram data received.",{"name":1774,"kind":885,"annotation":1775,"required":888,"description":1781},"addr",{"left":1776,"slice":1777},{"name":1210,"cls":796},{"elements":1778},[1779,1780],{"name":971,"cls":796},{"name":1120,"cls":796},"The address of the sender.",{"type":877,"name":1521,"path":1466,"parent":765,"description":1783,"lines":1784,"parameters":1787},"Receive an error from the `Transport`.\n\nLogs the error and sets the response if not already set.\nFurther invocations with the same `Response` will only be logged.",[1785,1786],308,321,[1788,1789],{"name":931,"kind":885,"required":888},{"name":1735,"kind":885,"annotation":1790,"required":888,"description":1796},{"join":1791},[1792,1793],{"name":815,"cls":796},{"left":1794,"slice":1795},{"name":1393,"cls":796},{"name":815,"cls":796},"The error received.",{"type":877,"name":1522,"path":1466,"parent":765,"description":1798,"lines":1799,"parameters":1801,"returns":1816,"throws":1819,"examples":1827},"Execute a `Command` by sending the `Request` within the `Command` to the `Transport`.",[1800,1484],323,[1802,1803],{"name":931,"kind":885,"required":888},{"name":1804,"kind":885,"annotation":1805,"required":888,"description":1815},"command",{"left":1806,"slice":1807},{"name":754,"cls":796},{"elements":1808},[1809,1811,1813],{"name":1810,"cls":796},"unitelabs.bus.commands.command.InType",{"name":1812,"cls":796},"unitelabs.bus.commands.command.OutType",{"name":1814,"cls":796},"unitelabs.bus.commands.command.ResType","The `Command` to be executed.",{"description":1817,"annotation":1818},"The deserialized response, created by `command.result()` or None if `Command.is_void` is True.",{"name":1814,"cls":796},[1820,1823],{"description":1821,"annotation":1822},"If the transport is not open, does not currently allow writing, or\nis busy processing and cannot accept more work at the moment.",{"name":760,"cls":796},{"description":1824,"annotation":1825},"If the response is not received within the specified timeout.",{"name":1826,"cls":796},"TimeoutError",[1828,1831],{"description":1829,"code":1830},"Use with a single command.",">>> response = await protocol.execute(ByteCommand(b\"test\"))",{"description":1832,"code":1833},"Use with `asyncio.gather` to send multiple commands at once, here using `return_exceptions=True`\ntreats exceptions the same as successful results and stores them in the `responses` list.",">>> responses = await asyncio.gather(\n>>>   *[protocol.execute(ByteCommand(req)) for req in [b\"test1\", b\"test2\"]],\n>>>   return_exceptions=True,\n>>> )",{"type":738,"name":746,"path":1835,"parent":739,"packages":1836,"attributes":1840,"classes":1842},"unitelabs\u002Fbus\u002Futils\u002F__init__.py",[1837,1838,1839],"unitelabs.bus.utils.device_manager","unitelabs.bus.utils.autodetect","unitelabs.bus.utils.device_manager_cli",[1841],"unitelabs.bus.utils.__all__",[1617,1843,769],"unitelabs.bus.utils.device_manager.DeviceInfo",{"type":771,"name":1841,"path":1835,"parent":746,"lines":1845,"value":1846},[874,874],[1617,1843,769],{"type":738,"name":1837,"path":1848,"parent":746,"classes":1849},"unitelabs\u002Fbus\u002Futils\u002Fdevice_manager.py",[1843,1850,769],"unitelabs.bus.utils.device_manager.DeviceManager",{"type":787,"name":1843,"path":1848,"parent":1837,"description":1852,"lines":1853,"decorators":1855,"attributes":1857,"functions":1869,"mro":1873},"Translation of `serial.tools.list_ports.ListPortInfo` for unified interface between USB and Serial `DeviceManagers`.\n\nAttrs here represent valid filter criteria during device search.",[863,1854],38,[1856],"dataclasses.dataclass",[1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868],"unitelabs.bus.utils.device_manager.DeviceInfo.device","unitelabs.bus.utils.device_manager.DeviceInfo.name","unitelabs.bus.utils.device_manager.DeviceInfo.description","unitelabs.bus.utils.device_manager.DeviceInfo.hwid","unitelabs.bus.utils.device_manager.DeviceInfo.vid","unitelabs.bus.utils.device_manager.DeviceInfo.pid","unitelabs.bus.utils.device_manager.DeviceInfo.serial_number","unitelabs.bus.utils.device_manager.DeviceInfo.location","unitelabs.bus.utils.device_manager.DeviceInfo.manufacturer","unitelabs.bus.utils.device_manager.DeviceInfo.product","unitelabs.bus.utils.device_manager.DeviceInfo.interface",[1870,1871,1872],"unitelabs.bus.utils.device_manager.DeviceInfo.__init__","unitelabs.bus.utils.device_manager.DeviceInfo.__post_init__","unitelabs.bus.utils.device_manager.DeviceInfo.__repr__",[1843],{"type":771,"name":1858,"path":1848,"parent":1843,"description":1875,"lines":1876,"value":940,"annotation":1877},"Port path",[773,773],{"name":971,"cls":796},{"type":771,"name":1859,"path":1848,"parent":1843,"lines":1879,"value":940,"annotation":1880},[830,830],{"name":971,"cls":796},{"type":771,"name":1860,"path":1848,"parent":1843,"lines":1882,"value":940,"annotation":1883},[1178,1178],{"join":1884},[1885,940],{"name":971,"cls":796},{"type":771,"name":1861,"path":1848,"parent":1843,"lines":1887,"value":940,"annotation":1888},[838,838],{"join":1889},[1890,940],{"name":971,"cls":796},{"type":771,"name":1862,"path":1848,"parent":1843,"description":1892,"lines":1893,"value":940,"annotation":1894},"Vendor identifier",[839,839],{"join":1895},[1896,940],{"name":971,"cls":796},{"type":771,"name":1863,"path":1848,"parent":1843,"description":1898,"lines":1899,"value":940,"annotation":1900},"Product identifier",[1164,1164],{"join":1901},[1902,940],{"name":971,"cls":796},{"type":771,"name":1864,"path":1848,"parent":1843,"lines":1904,"value":940,"annotation":1905},[928,928],{"join":1906},[1907,940],{"name":971,"cls":796},{"type":771,"name":1865,"path":1848,"parent":1843,"lines":1909,"value":940,"annotation":1910},[1317,1317],{"join":1911},[1912,940],{"name":971,"cls":796},{"type":771,"name":1866,"path":1848,"parent":1843,"lines":1914,"value":940,"annotation":1915},[950,950],{"join":1916},[1917,940],{"name":971,"cls":796},{"type":771,"name":1867,"path":1848,"parent":1843,"lines":1919,"value":940,"annotation":1921},[1920,1920],29,{"join":1922},[1923,940],{"name":971,"cls":796},{"type":771,"name":1868,"path":1848,"parent":1843,"lines":1925,"value":940,"annotation":1926},[1188,1188],{"join":1927},[1928,940],{"name":971,"cls":796},{"type":877,"name":1871,"path":1848,"parent":1843,"lines":1930,"parameters":1932},[881,1931],35,[1933],{"name":931,"kind":885,"required":888},{"type":877,"name":1872,"path":1848,"parent":1843,"lines":1935,"parameters":1936},[969,1854],[1937],{"name":931,"kind":885,"required":888},{"type":877,"name":1870,"path":1848,"parent":1843,"lines":1939,"parameters":1941},[1940,1940],0,[1942,1943,1945,1948,1953,1958,1963,1968,1973,1978,1983,1988],{"name":931,"kind":885,"required":888},{"name":1044,"kind":885,"annotation":1944,"required":888},{"name":971,"cls":796},{"name":1946,"kind":885,"annotation":1947,"required":888},"name",{"name":971,"cls":796},{"name":1949,"kind":885,"annotation":1950,"required":42,"default":940},"description",{"join":1951},[1952,940],{"name":971,"cls":796},{"name":1954,"kind":885,"annotation":1955,"required":42,"default":940},"hwid",{"join":1956},[1957,940],{"name":971,"cls":796},{"name":1959,"kind":885,"annotation":1960,"required":42,"default":940},"vid",{"join":1961},[1962,940],{"name":971,"cls":796},{"name":1964,"kind":885,"annotation":1965,"required":42,"default":940},"pid",{"join":1966},[1967,940],{"name":971,"cls":796},{"name":1969,"kind":885,"annotation":1970,"required":42,"default":940},"serial_number",{"join":1971},[1972,940],{"name":971,"cls":796},{"name":1974,"kind":885,"annotation":1975,"required":42,"default":940},"location",{"join":1976},[1977,940],{"name":971,"cls":796},{"name":1979,"kind":885,"annotation":1980,"required":42,"default":940},"manufacturer",{"join":1981},[1982,940],{"name":971,"cls":796},{"name":1984,"kind":885,"annotation":1985,"required":42,"default":940},"product",{"join":1986},[1987,940],{"name":971,"cls":796},{"name":1989,"kind":885,"annotation":1990,"required":42,"default":940},"interface",{"join":1991},[1992,940],{"name":971,"cls":796},{"type":787,"name":1850,"path":1848,"parent":1837,"description":1994,"lines":1995,"functions":1996,"mro":2001},"Detect, filter, and get info for connected devices.",[1065,1382],[1997,1998,1999,2000],"unitelabs.bus.utils.device_manager.DeviceManager.filter_kwargs","unitelabs.bus.utils.device_manager.DeviceManager.get_all","unitelabs.bus.utils.device_manager.DeviceManager.check_device_match","unitelabs.bus.utils.device_manager.DeviceManager.filter",[1850],{"type":877,"name":1997,"path":1848,"parent":1850,"description":2003,"lines":2004,"decorators":2006,"parameters":2009,"returns":2020},"Filter `kwargs` to subset that match the attributes of `DeviceInfo`.\n\nSupports the use of `port` as alternative name for `device`.",[1068,2005],58,[2007,2008],"classmethod","abc.abstractmethod",[2010,2012],{"name":2011,"kind":885,"required":888},"cls",{"name":1000,"kind":885,"annotation":2013,"required":888,"description":2019},{"left":2014,"slice":2015},{"name":1424,"cls":796},{"elements":2016},[2017,2018],{"name":971,"cls":796},{"name":971,"cls":796},"A dictionary of key-value pairs to filter.",{"description":2021,"annotation":2022},"The filtered dictionary.",{"left":2023,"slice":2024},{"name":1424,"cls":796},{"elements":2025},[2026,2027],{"name":971,"cls":796},{"name":971,"cls":796},{"type":877,"name":1998,"path":1848,"parent":1850,"description":2029,"lines":2030,"decorators":2031,"parameters":2032,"returns":2034},"Get all connected devices.",[1591,1604],[2007,2008],[2033],{"name":2011,"kind":885,"required":888},{"description":2035,"annotation":2036},"A list of all devices detected.",{"left":2037,"slice":2038},{"name":938,"cls":796},{"name":1843,"cls":796},{"type":877,"name":1999,"path":1848,"parent":1850,"description":2040,"lines":2041,"decorators":2043,"parameters":2044,"returns":2052},"Determine if the `DeviceInfo` instance's attributes match the filter `**kwargs`.",[2042,1141],71,[2007,2008],[2045,2046,2050],{"name":2011,"kind":885,"required":888},{"name":2047,"kind":885,"annotation":2048,"required":888,"description":2049},"device_info",{"name":1843,"cls":796},"The device to check for a match against.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":2051},"The key-value pairs, which will be filtered, and then used to evaluate the device for a match.",{"description":2053,"annotation":2054},"True if the `DeviceInfo` matches (or no kwargs provided, or all kwargs have been filtered), else False.",{"name":1052,"cls":796},{"type":877,"name":2000,"path":1848,"parent":1850,"description":2056,"lines":2057,"decorators":2058,"parameters":2059,"returns":2063},"Search through all detectable devices.\n\n`**kwargs` are first filtered by `filter_kwargs` based on attrs of `DeviceInfo`.\nThis allows the number of devices detected to be pared down based on known, stable\ninformation about the device being searched for.",[1621,1382],[2007,2008],[2060,2061],{"name":2011,"kind":885,"required":888},{"name":1056,"kind":1057,"required":42,"default":1058,"description":2062},"Search criteria for finding a device.",{"description":2064,"annotation":2065},"A list of devices which match all `**kwargs` provided.",{"left":2066,"slice":2067},{"name":938,"cls":796},{"name":1843,"cls":796},{"type":787,"name":769,"path":1848,"parent":1837,"description":2069,"lines":2070,"bases":2072,"attributes":2075,"functions":2077,"mro":2082},"Detect, filter, and get info for connected serial devices.",[1404,2071],154,[2073],{"annotation":2074},{"name":1850,"cls":796},[2076],"unitelabs.bus.utils.device_manager.SerialDeviceManager.SERIAL_SEARCH_KEYS",[2078,2079,2080,2081],"unitelabs.bus.utils.device_manager.SerialDeviceManager.filter_kwargs","unitelabs.bus.utils.device_manager.SerialDeviceManager.get_all","unitelabs.bus.utils.device_manager.SerialDeviceManager.check_device_match","unitelabs.bus.utils.device_manager.SerialDeviceManager.filter",[769,1850],{"type":771,"name":2076,"path":1848,"parent":769,"lines":2084,"value":2086,"annotation":2087},[2085,1650],108,"['device', 'name', 'description', 'hwid', 'vid', 'pid', 'serial_number', 'location', 'manufacturer', 'product', 'interface']",{"name":2088,"cls":796},"typing_extensions.ClassVar",{"type":877,"name":2078,"path":1848,"parent":769,"lines":2090,"decorators":2092,"parameters":2094,"returns":2103},[1657,2091],128,[2093,2007],"typing.override",[2095,2096],{"name":2011,"kind":885,"required":888},{"name":1078,"kind":885,"annotation":2097,"required":888},{"left":2098,"slice":2099},{"name":1424,"cls":796},{"elements":2100},[2101,2102],{"name":971,"cls":796},{"name":971,"cls":796},{"description":1118,"annotation":2104},{"left":2105,"slice":2106},{"name":1424,"cls":796},{"elements":2107},[2108,2109],{"name":971,"cls":796},{"name":971,"cls":796},{"type":877,"name":2079,"path":1848,"parent":769,"lines":2111,"decorators":2114,"parameters":2115,"returns":2117},[2112,2113],130,138,[2093,2007],[2116],{"name":2011,"kind":885,"required":888},{"description":1118,"annotation":2118},{"left":2119,"slice":2120},{"name":938,"cls":796},{"name":1843,"cls":796},{"type":877,"name":2080,"path":1848,"parent":769,"lines":2122,"decorators":2125,"parameters":2126,"returns":2131},[2123,2124],140,148,[2093,2007],[2127,2128,2130],{"name":2011,"kind":885,"required":888},{"name":2047,"kind":885,"annotation":2129,"required":888},{"name":1843,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058},{"description":1118,"annotation":2132},{"name":1052,"cls":796},{"type":877,"name":2081,"path":1848,"parent":769,"lines":2134,"decorators":2136,"parameters":2137,"returns":2140},[2135,2071],150,[2093,2007],[2138,2139],{"name":2011,"kind":885,"required":888},{"name":1056,"kind":1057,"required":42,"default":1058},{"description":1118,"annotation":2141},{"left":2142,"slice":2143},{"name":938,"cls":796},{"name":1843,"cls":796},{"type":738,"name":1838,"path":2145,"parent":746,"classes":2146},"unitelabs\u002Fbus\u002Futils\u002Fautodetect.py",[2147,1617],"unitelabs.bus.utils.autodetect.TransportType",{"type":787,"name":2147,"path":2145,"parent":1838,"description":2149,"lines":2150,"bases":2152,"attributes":2156,"mro":2160},"A Type of supported Transport.",[1163,2151],20,[2153],{"annotation":2154},{"name":2155,"cls":796},"enum.Enum",[2157,2158,2159],"unitelabs.bus.utils.autodetect.TransportType.serial","unitelabs.bus.utils.autodetect.TransportType.usb","unitelabs.bus.utils.autodetect.TransportType.unknown",[2147],{"type":771,"name":2157,"path":2145,"parent":2147,"lines":2162,"value":2163},[830,830],"enum.auto()",{"type":771,"name":2158,"path":2145,"parent":2147,"lines":2165,"value":2163},[1178,1178],{"type":771,"name":2159,"path":2145,"parent":2147,"lines":2167,"value":2163},[2151,2151],{"type":787,"name":1617,"path":2145,"parent":1838,"description":2169,"lines":2170,"attributes":2173,"functions":2184,"mro":2191},"Cycle through all possible devices until the correct device is found.",[2171,2172],23,164,[2174,2175,2176,2177,2178,2179,2180,2181,2182,2183],"unitelabs.bus.utils.autodetect.AutoDetector._transport_type","unitelabs.bus.utils.autodetect.AutoDetector.protocol","unitelabs.bus.utils.autodetect.AutoDetector._transport_kwargs","unitelabs.bus.utils.autodetect.AutoDetector._device_manager","unitelabs.bus.utils.autodetect.AutoDetector._validation_kwargs","unitelabs.bus.utils.autodetect.AutoDetector._is_resolving","unitelabs.bus.utils.autodetect.AutoDetector.connection_tasks","unitelabs.bus.utils.autodetect.AutoDetector.logger","unitelabs.bus.utils.autodetect.AutoDetector.device_manager","unitelabs.bus.utils.autodetect.AutoDetector.is_resolving",[2185,2186,2187,2188,2189,2190],"unitelabs.bus.utils.autodetect.AutoDetector.__init__","unitelabs.bus.utils.autodetect.AutoDetector.get_transport_type","unitelabs.bus.utils.autodetect.AutoDetector.get_device_manager","unitelabs.bus.utils.autodetect.AutoDetector.resolve","unitelabs.bus.utils.autodetect.AutoDetector._connect","unitelabs.bus.utils.autodetect.AutoDetector._update_protocol_transport",[1617],{"type":771,"name":2174,"path":2145,"parent":1617,"lines":2193,"value":940,"annotation":2194},[881,881],{"name":2147,"cls":796},{"type":877,"name":2185,"path":2145,"parent":1617,"lines":2196,"parameters":2197},[957,1068],[2198,2199,2203],{"name":931,"kind":885,"required":888},{"name":2200,"kind":885,"annotation":2201,"required":888,"description":2202},"protocol",{"name":765,"cls":796},"The `unitelabs.bus.Protocol` instance to use.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":2204},"Kwargs used to initialize the `Protocol` instance, which contains `Transport` init kwargs.",{"type":771,"name":2175,"path":2145,"parent":1617,"lines":2206,"value":2200},[1931,1931],{"type":771,"name":2176,"path":2145,"parent":1617,"lines":2208,"value":1078},[1197,1197],{"type":771,"name":2177,"path":2145,"parent":1617,"lines":2210,"value":940},[1854,1854],{"type":771,"name":2178,"path":2145,"parent":1617,"lines":2212,"value":1078},[1202,1202],{"type":771,"name":2179,"path":2145,"parent":1617,"lines":2214,"value":1053},[1065,1065],{"type":771,"name":2180,"path":2145,"parent":1617,"lines":2216,"value":2217},[975,975],"set()",{"type":877,"name":2186,"path":2145,"parent":1617,"description":2219,"lines":2220,"parameters":2221},"Infer the type of the transport based on the `protocol._transport_factory` used to initialize the `Protocol`.\n\nThis allows the initialization of new transport instances based on `DeviceInfo`.",[1207,1585],[2222],{"name":931,"kind":885,"required":888},{"type":771,"name":2181,"path":2145,"parent":1617,"description":2224,"lines":2225,"value":940,"annotation":2226},"A python logger.",[1226,1033],{"name":1325,"cls":796},{"type":771,"name":2182,"path":2145,"parent":1617,"description":2228,"lines":2229,"value":940,"annotation":2231},"The `DeviceManager` instance.\n\nLazily-loaded for test-injection.",[989,2230],72,{"left":2232,"slice":2233},{"name":1393,"cls":796},{"name":1850,"cls":796},{"type":877,"name":2187,"path":2145,"parent":1617,"description":2235,"lines":2236,"parameters":2237,"returns":2239},"Get the correct `DeviceManager` based on the `TransportType`.",[1083,1232],[2238],{"name":931,"kind":885,"required":888},{"description":1118,"annotation":2240},{"left":2241,"slice":2242},{"name":1393,"cls":796},{"name":1850,"cls":796},{"type":771,"name":2183,"path":2145,"parent":1617,"description":2244,"lines":2245,"value":940,"annotation":2246},"Whether or not we are currently trying to connect to a device.",[996,909],{"name":1052,"cls":796},{"type":877,"name":2188,"path":2145,"parent":1617,"description":2248,"lines":2249,"parameters":2252},"User entry-point.\n\nIterates through all available devices until a connection is successfully made,\nor all available devices have been tested. If no valid connection can be found,\ncalls to `protocol.connection_lost` to pass control back to `protocol`.",[2250,2251],87,122,[2253,2254,2257],{"name":931,"kind":885,"required":888},{"name":1704,"kind":885,"annotation":2255,"required":888,"description":2256},{"name":1541,"cls":796},"How long in seconds to wait for a response from `Protocol.validate`.",{"name":1688,"kind":1057,"required":42,"default":1058,"description":2258},"kwargs from `Protocol.validate` used to validate the connection.",{"type":877,"name":2189,"path":2145,"parent":1617,"description":2260,"lines":2261,"parameters":2263,"returns":2270},"Set and open a new `Transport` on the `Protocol`, then validate the connection using `Protocol.validate`.",[1112,2262],141,[2264,2265,2267],{"name":931,"kind":885,"required":888},{"name":1704,"kind":885,"annotation":2266,"required":888,"description":2256},{"name":1541,"cls":796},{"name":1044,"kind":885,"annotation":2268,"required":888,"description":2269},{"name":1843,"cls":796},"The device to which we wish to attempt to validate a connection.",{"description":2271,"annotation":2272},"Whether or not the connection was successfully made and validated.",{"name":1052,"cls":796},{"type":877,"name":2190,"path":2145,"parent":1617,"description":2274,"lines":2275,"parameters":2277},"Update the `Protocol`s underlying `Transport` to connect to the given `device`.",[2276,2172],143,[2278,2279],{"name":931,"kind":885,"required":888},{"name":1044,"kind":885,"annotation":2280,"required":888,"description":2281},{"name":1843,"cls":796},"The `DeviceInfo` of the new device to connect the `Protocol` to.",{"type":738,"name":1839,"path":2283,"parent":746,"attributes":2284},"unitelabs\u002Fbus\u002Futils\u002Fdevice_manager_cli.py",[2285,2286],"unitelabs.bus.utils.device_manager_cli.logger","unitelabs.bus.utils.device_manager_cli.devices",{"type":771,"name":2285,"path":2283,"parent":1839,"lines":2288,"value":2289},[863,863],"logging.getLogger(__name__)",{"type":771,"name":2286,"path":2283,"parent":1839,"lines":2291,"value":2292},[811,811],"SerialDeviceManager().get_all()",{"type":738,"name":747,"path":2294,"parent":739,"packages":2295,"attributes":2303,"classes":2305},"unitelabs\u002Fbus\u002Ftransports\u002F__init__.py",[2296,2297,2298,2299,2300,2301,2302],"unitelabs.bus.transports.serial_transport","unitelabs.bus.transports.read_transport","unitelabs.bus.transports.transport","unitelabs.bus.transports.usb_transport","unitelabs.bus.transports.hid_transport","unitelabs.bus.transports.write_transport","unitelabs.bus.transports.base_transport",[2304],"unitelabs.bus.transports.__all__",[1030,766,1028,2306,2307,767,2308,1013,768,1029],"unitelabs.bus.transports.serial_transport.ByteSize","unitelabs.bus.transports.serial_transport.Parity","unitelabs.bus.transports.serial_transport.StopBits",{"type":771,"name":2304,"path":2294,"parent":747,"lines":2310,"value":2311},[810,2151],[1030,2306,766,2307,1028,767,2308,1013,768,1029],{"type":738,"name":2296,"path":2313,"parent":747,"attributes":2314,"classes":2316},"unitelabs\u002Fbus\u002Ftransports\u002Fserial_transport.py",[2315],"unitelabs.bus.transports.serial_transport.POLL_WAIT_TIME",[2306,2307,2308,767],{"type":787,"name":2306,"path":2313,"parent":2296,"description":2318,"lines":2319,"bases":2320,"attributes":2324,"mro":2329},"Number of data bits.",[1008,830],[2321],{"annotation":2322},{"name":2323,"cls":796},"enum.IntEnum",[2325,2326,2327,2328],"unitelabs.bus.transports.serial_transport.ByteSize.FIVEBITS","unitelabs.bus.transports.serial_transport.ByteSize.SIXBITS","unitelabs.bus.transports.serial_transport.ByteSize.SEVENBITS","unitelabs.bus.transports.serial_transport.ByteSize.EIGHTBITS",[2306],{"type":771,"name":2325,"path":2313,"parent":2306,"lines":2331,"value":2332},[1163,1163],"5",{"type":771,"name":2326,"path":2313,"parent":2306,"lines":2334,"value":2335},[773,773],"6",{"type":771,"name":2327,"path":2313,"parent":2306,"lines":2337,"value":2338},[829,829],"7",{"type":771,"name":2328,"path":2313,"parent":2306,"lines":2340,"value":2341},[830,830],"8",{"type":787,"name":2307,"path":2313,"parent":2296,"description":2343,"lines":2344,"bases":2345,"attributes":2350,"mro":2356},"Parity checking method for error-detection.",[838,950],[2346,2348],{"annotation":2347},{"name":971,"cls":796},{"annotation":2349},{"name":2155,"cls":796},[2351,2352,2353,2354,2355],"unitelabs.bus.transports.serial_transport.Parity.NONE","unitelabs.bus.transports.serial_transport.Parity.ODD","unitelabs.bus.transports.serial_transport.Parity.EVEN","unitelabs.bus.transports.serial_transport.Parity.MARK","unitelabs.bus.transports.serial_transport.Parity.SPACE",[2307],{"type":771,"name":2351,"path":2313,"parent":2307,"lines":2358,"value":2359},[1164,1164],"'N'",{"type":771,"name":2352,"path":2313,"parent":2307,"lines":2361,"value":2362},[943,943],"'O'",{"type":771,"name":2353,"path":2313,"parent":2307,"lines":2364,"value":2365},[928,928],"'E'",{"type":771,"name":2354,"path":2313,"parent":2307,"lines":2367,"value":2368},[1317,1317],"'M'",{"type":771,"name":2355,"path":2313,"parent":2307,"lines":2370,"value":2371},[950,950],"'S'",{"type":787,"name":2308,"path":2313,"parent":2296,"description":2373,"lines":2374,"bases":2375,"attributes":2380,"mro":2384},"The number of stopbits.",[951,1197],[2376,2378],{"annotation":2377},{"name":1541,"cls":796},{"annotation":2379},{"name":2155,"cls":796},[2381,2382,2383],"unitelabs.bus.transports.serial_transport.StopBits.ONE","unitelabs.bus.transports.serial_transport.StopBits.ONE_POINT_FIVE","unitelabs.bus.transports.serial_transport.StopBits.TWO",[2308],{"type":771,"name":2381,"path":2313,"parent":2308,"lines":2386,"value":1706},[957,957],{"type":771,"name":2382,"path":2313,"parent":2308,"lines":2388,"value":2389},[1931,1931],"1.5",{"type":771,"name":2383,"path":2313,"parent":2308,"lines":2391,"value":2392},[1197,1197],"2.0",{"type":771,"name":2315,"path":2313,"parent":2296,"lines":2394,"value":2395},[1202,1202],"0.0005",{"type":787,"name":767,"path":2313,"parent":2296,"description":2397,"lines":2398,"bases":2400,"attributes":2403,"functions":2407,"mro":2419},"Transport for serial devices.",[975,2399],160,[2401],{"annotation":2402},{"name":1013,"cls":796},[2404,2405,2406],"unitelabs.bus.transports.serial_transport.SerialTransport._serial","unitelabs.bus.transports.serial_transport.SerialTransport._max_read_size","unitelabs.bus.transports.serial_transport.SerialTransport._read_buffer",[2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418],"unitelabs.bus.transports.serial_transport.SerialTransport.__init__","unitelabs.bus.transports.serial_transport.SerialTransport._open","unitelabs.bus.transports.serial_transport.SerialTransport._close","unitelabs.bus.transports.serial_transport.SerialTransport._ensure_reader","unitelabs.bus.transports.serial_transport.SerialTransport._poll_read","unitelabs.bus.transports.serial_transport.SerialTransport._remove_reader","unitelabs.bus.transports.serial_transport.SerialTransport._read","unitelabs.bus.transports.serial_transport.SerialTransport._ensure_writer","unitelabs.bus.transports.serial_transport.SerialTransport._poll_write","unitelabs.bus.transports.serial_transport.SerialTransport._remove_writer","unitelabs.bus.transports.serial_transport.SerialTransport._write",[767,1013,1028,1029,1030],{"type":877,"name":2408,"path":2313,"parent":767,"lines":2421,"parameters":2424},[2422,2423],54,75,[2425,2426,2430,2435,2439,2443],{"name":931,"kind":885,"required":888},{"name":2427,"kind":885,"annotation":2428,"required":888,"description":2429},"port",{"name":971,"cls":796},"The port where the serial device is connected.",{"name":2431,"kind":885,"annotation":2432,"required":42,"default":2433,"description":2434},"baudrate",{"name":1120,"cls":796},"9600","The baud rate.",{"name":2436,"kind":885,"annotation":2437,"required":42,"default":2438,"description":2318},"bytesize",{"name":2306,"cls":796},{"name":2328,"cls":796},{"name":2440,"kind":885,"annotation":2441,"required":42,"default":2442,"description":2343},"parity",{"name":2307,"cls":796},{"name":2351,"cls":796},{"name":2444,"kind":885,"annotation":2445,"required":42,"default":2446,"description":2373},"stopbits",{"name":2308,"cls":796},{"name":2381,"cls":796},{"type":771,"name":2404,"path":2313,"parent":767,"lines":2448,"value":2449},[1082,2230],"serial.serial_for_url(port, baudrate=baudrate, bytesize=bytesize, parity=parity, stopbits=stopbits, timeout=0, write_timeout=0, do_not_open=True)",{"type":771,"name":2405,"path":2313,"parent":767,"lines":2451,"value":2452},[1610,1610],"1024",{"type":771,"name":2406,"path":2313,"parent":767,"lines":2454,"value":1576},[2423,2423],{"type":877,"name":2409,"path":2313,"parent":767,"description":2456,"lines":2457,"parameters":2459},"Open underlying serial port, if not already open.",[2458,990],77,[2460],{"name":931,"kind":885,"required":888},{"type":877,"name":2410,"path":2313,"parent":767,"description":2462,"lines":2463,"parameters":2464},"Close underlying serial port, if open.",[996,2250],[2465],{"name":931,"kind":885,"required":888},{"type":877,"name":2411,"path":2313,"parent":767,"lines":2467,"parameters":2470},[2468,2469],92,101,[2471],{"name":931,"kind":885,"required":888},{"type":877,"name":2412,"path":2313,"parent":767,"lines":2473,"parameters":2476},[2474,2475],103,109,[2477],{"name":931,"kind":885,"required":888},{"type":877,"name":2413,"path":2313,"parent":767,"lines":2479,"parameters":2482},[2480,2481],111,117,[2483],{"name":931,"kind":885,"required":888},{"type":877,"name":2414,"path":2313,"parent":767,"lines":2485,"parameters":2487,"returns":2489},[2486,1123],119,[2488],{"name":931,"kind":885,"required":888},{"description":1118,"annotation":2490},{"join":2491},[2492,940],{"name":887,"cls":796},{"type":877,"name":2415,"path":2313,"parent":767,"description":2494,"lines":2495,"parameters":2498},"Add a writer to the loop if not already added.",[2496,2497],131,142,[2499],{"name":931,"kind":885,"required":888},{"type":877,"name":2416,"path":2313,"parent":767,"lines":2501,"parameters":2504},[2502,2503],144,147,[2505],{"name":931,"kind":885,"required":888},{"type":877,"name":2417,"path":2313,"parent":767,"description":2507,"lines":2508,"parameters":2510},"Remove a writer from the loop.",[2509,1679],149,[2511],{"name":931,"kind":885,"required":888},{"type":877,"name":2418,"path":2313,"parent":767,"lines":2513,"parameters":2515,"returns":2519},[2514,2399],159,[2516,2517],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":2518,"required":888},{"name":887,"cls":796},{"description":1118,"annotation":2520},{"name":1120,"cls":796},{"type":738,"name":2297,"path":2522,"parent":747,"classes":2523},"unitelabs\u002Fbus\u002Ftransports\u002Fread_transport.py",[1028],{"type":787,"name":1028,"path":2522,"parent":2297,"description":2525,"lines":2526,"bases":2527,"attributes":2533,"functions":2535,"mro":2549},"Interface for read-only transports.",[880,1123],[2528,2530],{"annotation":2529},{"name":1030,"cls":796},{"annotation":2531},{"name":2532,"cls":796},"asyncio.ReadTransport",[2534],"unitelabs.bus.transports.read_transport.ReadTransport._has_reader",[2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548],"unitelabs.bus.transports.read_transport.ReadTransport.__init__","unitelabs.bus.transports.read_transport.ReadTransport.open","unitelabs.bus.transports.read_transport.ReadTransport.close","unitelabs.bus.transports.read_transport.ReadTransport.is_reading","unitelabs.bus.transports.read_transport.ReadTransport.pause_reading","unitelabs.bus.transports.read_transport.ReadTransport.resume_reading","unitelabs.bus.transports.read_transport.ReadTransport._abort","unitelabs.bus.transports.read_transport.ReadTransport._ensure_reader","unitelabs.bus.transports.read_transport.ReadTransport._remove_reader","unitelabs.bus.transports.read_transport.ReadTransport._safe_read","unitelabs.bus.transports.read_transport.ReadTransport._read","unitelabs.bus.transports.read_transport.ReadTransport.read_all","unitelabs.bus.transports.read_transport.ReadTransport.clear_read_buffer",[1028,1030],{"type":877,"name":2536,"path":2522,"parent":1028,"lines":2551,"parameters":2552},[811,1008],[2553],{"name":931,"kind":885,"required":888},{"type":771,"name":2534,"path":2522,"parent":1028,"lines":2555,"value":1053},[1008,1008],{"type":877,"name":2537,"path":2522,"parent":1028,"description":2557,"lines":2558,"parameters":2559},"Open the transport and set state to allow future read operations.",[821,1178],[2560],{"name":931,"kind":885,"required":888},{"type":877,"name":2538,"path":2522,"parent":1028,"description":2562,"lines":2563,"parameters":2564},"Close the transport and set state to disallow further read operations.",[838,943],[2565],{"name":931,"kind":885,"required":888},{"type":877,"name":2539,"path":2522,"parent":1028,"description":2567,"lines":2568,"parameters":2569,"returns":2571},"Whether or not reading operations are currently being performed.",[1317,1931],[2570],{"name":931,"kind":885,"required":888},{"description":2572,"annotation":2573},"True if the transport is receiving, otherwise False.",{"name":1052,"cls":796},{"type":877,"name":2540,"path":2522,"parent":1028,"description":2575,"lines":2576,"parameters":2577},"Pause the receiving end.\n\nNo data will be passed to the protocol's `data_received()`\nmethod until `resume_reading()` is called.",[969,976],[2578],{"name":931,"kind":885,"required":888},{"type":877,"name":2541,"path":2522,"parent":1028,"description":2580,"lines":2581,"parameters":2582},"Resume the receiving end.\n\nData received will once again be passed to the protocol's\n`data_received()` method.",[982,1225],[2583],{"name":931,"kind":885,"required":888},{"type":877,"name":2542,"path":2522,"parent":1028,"description":2585,"lines":2586,"parameters":2589},"Close the transport immediately and update state to disable further read operations.",[2587,2588],57,66,[2590,2591],{"name":931,"kind":885,"required":888},{"name":2592,"kind":885,"annotation":2593,"required":42,"default":940,"description":2596},"exception",{"join":2594},[2595,940],{"name":815,"cls":796},"The Exception to propagate to the protocol when aborting, if connected.",{"type":877,"name":2543,"path":2522,"parent":1028,"description":2598,"lines":2599,"parameters":2600},"Set state to enable future read operations.",[1601,2042],[2601],{"name":931,"kind":885,"required":888},{"type":877,"name":2544,"path":2522,"parent":1028,"description":2603,"lines":2604,"parameters":2605},"Set state to disable further read operations.",[1610,1092],[2606],{"name":931,"kind":885,"required":888},{"type":877,"name":2545,"path":2522,"parent":1028,"description":2608,"lines":2609,"parameters":2612},"Safely and asynchronously read data from the transport.",[2610,2611],78,88,[2613],{"name":931,"kind":885,"required":888},{"type":877,"name":2546,"path":2522,"parent":1028,"description":2615,"lines":2616,"parameters":2619,"returns":2621},"Read data from the transport.\n\nCalled within `_safe_read` for asynchronous reading.",[2617,2618],90,100,[2620],{"name":931,"kind":885,"required":888},{"description":2622,"annotation":2623},"Data read from the transport.",{"join":2624},[2625,940],{"name":887,"cls":796},{"type":877,"name":2547,"path":2522,"parent":1028,"description":2627,"lines":2628,"parameters":2629,"returns":2631},"Read all available data from the transport.\n\nRepeatedly call `_read` and aggregate the results until no further data is available.",[1382,2481],[2630],{"name":931,"kind":885,"required":888},{"description":2632,"annotation":2633},"All available data from the transport.",{"name":887,"cls":796},{"type":877,"name":2548,"path":2522,"parent":1028,"description":2635,"lines":2636,"parameters":2637},"Clear out all available read data without notifying the protocol.\n\nCall `read_all` and discard the result.",[2486,1123],[2638],{"name":931,"kind":885,"required":888},{"type":738,"name":2298,"path":2640,"parent":747,"classes":2641},"unitelabs\u002Fbus\u002Ftransports\u002Ftransport.py",[1013],{"type":787,"name":1013,"path":2640,"parent":2298,"description":2643,"lines":2644,"bases":2645,"functions":2652,"mro":2661},"Interface defining bidirectional communication with a device.\n\nTransports read bytes from and write bytes to a device.",[880,1197],[2646,2648,2650],{"annotation":2647},{"name":1565,"cls":796},{"annotation":2649},{"name":1028,"cls":796},{"annotation":2651},{"name":1029,"cls":796},[2653,2654,2655,2656,2657,2658,2659,2660],"unitelabs.bus.transports.transport.Transport._open","unitelabs.bus.transports.transport.Transport._close","unitelabs.bus.transports.transport.Transport._ensure_reader","unitelabs.bus.transports.transport.Transport._remove_reader","unitelabs.bus.transports.transport.Transport._read","unitelabs.bus.transports.transport.Transport._ensure_writer","unitelabs.bus.transports.transport.Transport._remove_writer","unitelabs.bus.transports.transport.Transport._write",[1013,1028,1029,1030],{"type":877,"name":2653,"path":2640,"parent":1013,"lines":2663,"parameters":2664},[821,1163],[2665],{"name":931,"kind":885,"required":888},{"type":877,"name":2654,"path":2640,"parent":1013,"lines":2667,"parameters":2668},[829,830],[2669],{"name":931,"kind":885,"required":888},{"type":877,"name":2655,"path":2640,"parent":1013,"lines":2671,"parameters":2672},[2151,838],[2673],{"name":931,"kind":885,"required":888},{"type":877,"name":2656,"path":2640,"parent":1013,"lines":2675,"parameters":2676},[2171,1164],[2677],{"name":931,"kind":885,"required":888},{"type":877,"name":2657,"path":2640,"parent":1013,"lines":2679,"parameters":2680,"returns":2682},[928,1317],[2681],{"name":931,"kind":885,"required":888},{"description":1118,"annotation":2683},{"join":2684},[2685,940],{"name":887,"cls":796},{"type":877,"name":2658,"path":2640,"parent":1013,"lines":2687,"parameters":2688},[1920,1188],[2689],{"name":931,"kind":885,"required":888},{"type":877,"name":2659,"path":2640,"parent":1013,"lines":2691,"parameters":2692},[881,956],[2693],{"name":931,"kind":885,"required":888},{"type":877,"name":2660,"path":2640,"parent":1013,"lines":2695,"parameters":2696,"returns":2700},[1931,1197],[2697,2698],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":2699,"required":888},{"name":887,"cls":796},{"description":1118,"annotation":2701},{"name":1120,"cls":796},{"type":738,"name":2299,"path":2703,"parent":747,"attributes":2704,"classes":2707,"functions":2709},"unitelabs\u002Fbus\u002Ftransports\u002Fusb_transport.py",[2705,2706],"unitelabs.bus.transports.usb_transport.POLL_WAIT_TIME","unitelabs.bus.transports.usb_transport.DEFAULT_USB_INTERFACE",[2708,768],"unitelabs.bus.transports.usb_transport.WindowsDriverInstallationError",[2710,2711],"unitelabs.bus.transports.usb_transport.is_disconnection_error","unitelabs.bus.transports.usb_transport.get_libusb_backend",{"type":771,"name":2705,"path":2703,"parent":2299,"lines":2713,"value":2714},[829,829],"0.1",{"type":771,"name":2706,"path":2703,"parent":2299,"lines":2716,"value":2717},[830,830],"0",{"type":787,"name":2708,"path":2703,"parent":2299,"description":2719,"lines":2720,"bases":2721,"mro":2724},"USB connection on Windows requires setting libusbk as the driver for the device.\n\nUse Zadig to adjust your device's driver.",[838,928],[2722],{"annotation":2723},{"name":815,"cls":796},[2708],{"type":877,"name":2710,"path":2703,"parent":2299,"description":2726,"lines":2727,"parameters":2728,"returns":2734},"Determine if a `USBError` indicates device disconnection.\n\nCommon USB error codes that indicate disconnection:\n- LIBUSB_ERROR_NO_DEVICE (-4): Device has been disconnected\n- LIBUSB_ERROR_IO (-1): Input\u002Foutput error (often disconnection)\n- LIBUSB_ERROR_PIPE (-9): Pipe error (can indicate disconnection)\n- errno 5: Input\u002FOutput Error (common on Windows)",[1920,1033],[2729],{"name":2730,"kind":885,"annotation":2731,"required":888,"description":2733},"error",{"name":2732,"cls":796},"usb.core.USBError","The `USBError` to analyze.",{"description":2735,"annotation":2736},"True if `error` indicates disconnection, otherwise False.",{"name":1052,"cls":796},{"type":877,"name":2711,"path":2703,"parent":2299,"description":2738,"lines":2739,"returns":2740,"throws":2747},"Get the libusb backend for the current platform.",[989,2610],{"description":2741,"annotation":2742},"The libusb backend for the current platform, or None if it is not available.",{"left":2743,"slice":2745},{"name":2744,"cls":796},"typing.Optional",{"name":2746,"cls":796},"usb.backend.IBackend",[2748],{"description":2749,"annotation":2750},"If the libusb backend initialization fails.",{"name":2751,"cls":796},"RuntimeError",{"type":787,"name":768,"path":2703,"parent":2299,"description":2753,"lines":2754,"bases":2756,"attributes":2759,"functions":2771,"mro":2782},"Transport for devices connected via USB.\n\nBy default, uses the `libusb` backend and Interface 0 of Configuration 1 on the device.",[990,2755],294,[2757],{"annotation":2758},{"name":1013,"cls":796},[2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770],"unitelabs.bus.transports.usb_transport.USBTransport.read_size","unitelabs.bus.transports.usb_transport.USBTransport.vendor","unitelabs.bus.transports.usb_transport.USBTransport.product","unitelabs.bus.transports.usb_transport.USBTransport.interface_number","unitelabs.bus.transports.usb_transport.USBTransport._backend","unitelabs.bus.transports.usb_transport.USBTransport._device","unitelabs.bus.transports.usb_transport.USBTransport.read_endpoint","unitelabs.bus.transports.usb_transport.USBTransport.write_endpoint","unitelabs.bus.transports.usb_transport.USBTransport._was_opened","unitelabs.bus.transports.usb_transport.USBTransport._reader_event","unitelabs.bus.transports.usb_transport.USBTransport.logger",[2772,2773,2774,2775,2776,2777,2778,2779,2780,2781],"unitelabs.bus.transports.usb_transport.USBTransport.__init__","unitelabs.bus.transports.usb_transport.USBTransport._open","unitelabs.bus.transports.usb_transport.USBTransport._close","unitelabs.bus.transports.usb_transport.USBTransport._ensure_reader","unitelabs.bus.transports.usb_transport.USBTransport._remove_reader","unitelabs.bus.transports.usb_transport.USBTransport.__read","unitelabs.bus.transports.usb_transport.USBTransport._read","unitelabs.bus.transports.usb_transport.USBTransport._ensure_writer","unitelabs.bus.transports.usb_transport.USBTransport._remove_writer","unitelabs.bus.transports.usb_transport.USBTransport._write",[768,1013,1028,1029,1030],{"type":771,"name":2760,"path":2703,"parent":768,"lines":2784,"value":940,"annotation":2786},[2785,2785],94,{"name":1120,"cls":796},{"type":877,"name":2772,"path":2703,"parent":768,"lines":2788,"parameters":2791},[2789,2790],96,116,[2792,2793,2797,2800,2805],{"name":931,"kind":885,"required":888},{"name":2794,"kind":885,"annotation":2795,"required":888,"description":2796},"vendor",{"name":1120,"cls":796},"The vendor ID of the USB device.",{"name":1984,"kind":885,"annotation":2798,"required":888,"description":2799},{"name":1120,"cls":796},"The product ID of the USB device.",{"name":2801,"kind":885,"annotation":2802,"required":42,"default":2803,"description":2804},"interface_index",{"name":1120,"cls":796},{"name":2706,"cls":796},"The index of the USB Interface to use. Defaults to 0.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":2806},"Additional backend-specific configuration options.",{"type":771,"name":2761,"path":2703,"parent":768,"lines":2808,"value":2794},[1404,1404],{"type":771,"name":2762,"path":2703,"parent":768,"lines":2810,"value":1984},[1111,1111],{"type":771,"name":2763,"path":2703,"parent":768,"lines":2812,"value":2801},[2813,2813],107,{"type":771,"name":2764,"path":2703,"parent":768,"lines":2815,"value":940},[2475,2475],{"type":771,"name":2765,"path":2703,"parent":768,"lines":2817,"value":940,"annotation":2819},[2818,2818],110,{"join":2820},[2821,940],{"name":2822,"cls":796},"usb.core.Device",{"type":771,"name":2766,"path":2703,"parent":768,"lines":2824,"value":940,"annotation":2825},[2480,2480],{"join":2826},[2827,940],{"name":2828,"cls":796},"usb.core.Endpoint",{"type":771,"name":2767,"path":2703,"parent":768,"lines":2830,"value":940,"annotation":2832},[2831,2831],112,{"join":2833},[2834,940],{"name":2828,"cls":796},{"type":771,"name":2768,"path":2703,"parent":768,"lines":2836,"value":1053},[2837,2837],114,{"type":771,"name":2769,"path":2703,"parent":768,"lines":2839,"value":944},[2790,2790],{"type":771,"name":2770,"path":2703,"parent":768,"description":1608,"lines":2841,"value":940,"annotation":2842},[2486,2251],{"name":1325,"cls":796},{"type":877,"name":2773,"path":2703,"parent":768,"description":2844,"lines":2845,"parameters":2847},"Open the USB device using the selected backend.",[1112,2846],200,[2848],{"name":931,"kind":885,"required":888},{"type":877,"name":2774,"path":2703,"parent":768,"lines":2850,"parameters":2853},[2851,2852],202,212,[2854],{"name":931,"kind":885,"required":888},{"type":877,"name":2775,"path":2703,"parent":768,"lines":2856,"parameters":2859},[2857,2858],217,220,[2860],{"name":931,"kind":885,"required":888},{"type":877,"name":2776,"path":2703,"parent":768,"lines":2862,"parameters":2865},[2863,2864],222,225,[2866],{"name":931,"kind":885,"required":888},{"type":877,"name":2777,"path":2703,"parent":768,"lines":2868,"parameters":2871},[2869,2870],227,230,[2872],{"name":931,"kind":885,"required":888},{"type":877,"name":2778,"path":2703,"parent":768,"description":2874,"lines":2875,"parameters":2877,"returns":2879},"Read data from the transport.",[1714,2876],263,[2878],{"name":931,"kind":885,"required":888},{"description":2880,"annotation":2881},"Data read from the device, if any.",{"join":2882},[2883,940],{"name":887,"cls":796},{"type":877,"name":2779,"path":2703,"parent":768,"lines":2885,"parameters":2888},[2886,2887],268,271,[2889],{"name":931,"kind":885,"required":888},{"type":877,"name":2780,"path":2703,"parent":768,"lines":2891,"parameters":2893},[2892,1743],273,[2894],{"name":931,"kind":885,"required":888},{"type":877,"name":2781,"path":2703,"parent":768,"description":2896,"lines":2897,"parameters":2898,"returns":2903},"Write data to USB device.\n\nWrite errors are caught by `WriteTransport._safe_write`, which wraps this method.",[1749,2755],[2899,2900],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":2901,"required":888,"description":2902},{"name":887,"cls":796},"Bytes to write.",{"description":2904,"annotation":2905},"Number of bytes written or 0 if the device connection is not currently available.",{"name":1120,"cls":796},{"type":738,"name":2300,"path":2907,"parent":747,"attributes":2908,"classes":2911},"unitelabs\u002Fbus\u002Ftransports\u002Fhid_transport.py",[2909,2910],"unitelabs.bus.transports.hid_transport.DEFAULT_USB_INTERFACE","unitelabs.bus.transports.hid_transport.POLL_WAIT_TIME",[766],{"type":771,"name":2909,"path":2907,"parent":2300,"lines":2913,"value":2717},[1008,1008],{"type":771,"name":2910,"path":2907,"parent":2300,"lines":2915,"value":2714},[820,820],{"type":787,"name":766,"path":2907,"parent":2300,"description":2917,"lines":2918,"bases":2920,"attributes":2923,"functions":2937,"mro":2948},"Transport for devices connected to an HID USB interface.",[773,2919],163,[2921],{"annotation":2922},{"name":1013,"cls":796},[2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936],"unitelabs.bus.transports.hid_transport.HIDTransport.read_size","unitelabs.bus.transports.hid_transport.HIDTransport.vendor","unitelabs.bus.transports.hid_transport.HIDTransport.product","unitelabs.bus.transports.hid_transport.HIDTransport.interface_number","unitelabs.bus.transports.hid_transport.HIDTransport.serial_number","unitelabs.bus.transports.hid_transport.HIDTransport.usage_page","unitelabs.bus.transports.hid_transport.HIDTransport.usage","unitelabs.bus.transports.hid_transport.HIDTransport.write_report_id","unitelabs.bus.transports.hid_transport.HIDTransport.read_report_id","unitelabs.bus.transports.hid_transport.HIDTransport._device","unitelabs.bus.transports.hid_transport.HIDTransport._was_opened","unitelabs.bus.transports.hid_transport.HIDTransport._reader_event","unitelabs.bus.transports.hid_transport.HIDTransport.logger",[2938,2939,2940,2941,2942,2943,2944,2945,2946,2947],"unitelabs.bus.transports.hid_transport.HIDTransport.__init__","unitelabs.bus.transports.hid_transport.HIDTransport._open","unitelabs.bus.transports.hid_transport.HIDTransport._close","unitelabs.bus.transports.hid_transport.HIDTransport._ensure_reader","unitelabs.bus.transports.hid_transport.HIDTransport._remove_reader","unitelabs.bus.transports.hid_transport.HIDTransport.__read","unitelabs.bus.transports.hid_transport.HIDTransport._read","unitelabs.bus.transports.hid_transport.HIDTransport._ensure_writer","unitelabs.bus.transports.hid_transport.HIDTransport._remove_writer","unitelabs.bus.transports.hid_transport.HIDTransport._write",[766,1013,1028,1029,1030],{"type":771,"name":2924,"path":2907,"parent":766,"lines":2950,"value":2951,"annotation":2952},[881,881],"64",{"name":1120,"cls":796},{"type":877,"name":2938,"path":2907,"parent":766,"lines":2954,"parameters":2955},[957,2587],[2956,2957,2959,2961,2964],{"name":931,"kind":885,"required":888},{"name":2794,"kind":885,"annotation":2958,"required":888,"description":2796},{"name":1120,"cls":796},{"name":1984,"kind":885,"annotation":2960,"required":888,"description":2799},{"name":1120,"cls":796},{"name":2801,"kind":885,"annotation":2962,"required":42,"default":2963,"description":2804},{"name":1120,"cls":796},{"name":2909,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":2965},"Additional configuration options:\n- serial_number: Specific device serial number to connect to\n- usage_page: HID usage page filter\n- usage: HID usage filter\n- write_report_id: HID report ID to use\n- read_report_id: HID read report ID to use",{"type":771,"name":2925,"path":2907,"parent":766,"lines":2967,"value":2794},[2968,2968],43,{"type":771,"name":2926,"path":2907,"parent":766,"lines":2970,"value":1984},[1068,1068],{"type":771,"name":2927,"path":2907,"parent":766,"lines":2972,"value":2801},[976,976],{"type":771,"name":2928,"path":2907,"parent":766,"lines":2974,"value":2975},[982,982],"kwargs.get('serial_number')",{"type":771,"name":2929,"path":2907,"parent":766,"lines":2977,"value":2978},[1218,1218],"kwargs.get('usage_page')",{"type":771,"name":2930,"path":2907,"parent":766,"lines":2980,"value":2981},[1570,1570],"kwargs.get('usage')",{"type":771,"name":2931,"path":2907,"parent":766,"lines":2983,"value":2984,"annotation":2985},[1077,1077],"kwargs.get('write_report_id', b'')",{"name":887,"cls":796},{"type":771,"name":2932,"path":2907,"parent":766,"lines":2987,"value":2988,"annotation":2989},[1381,1381],"kwargs.get('read_report_id', b'')",{"name":887,"cls":796},{"type":771,"name":2933,"path":2907,"parent":766,"lines":2991,"value":940,"annotation":2992},[1219,1219],{"join":2993},[2994,940],{"name":2995,"cls":796},"hid.device",{"type":771,"name":2934,"path":2907,"parent":766,"lines":2997,"value":1053},[1225,1225],{"type":771,"name":2935,"path":2907,"parent":766,"lines":2999,"value":944},[2587,2587],{"type":771,"name":2936,"path":2907,"parent":766,"description":1608,"lines":3001,"value":940,"annotation":3002},[1591,1082],{"name":1325,"cls":796},{"type":877,"name":2939,"path":2907,"parent":766,"lines":3004,"parameters":3006},[3005,990],65,[3007],{"name":931,"kind":885,"required":888},{"type":877,"name":2940,"path":2907,"parent":766,"lines":3009,"parameters":3011},[996,3010],91,[3012],{"name":931,"kind":885,"required":888},{"type":877,"name":2941,"path":2907,"parent":766,"lines":3014,"parameters":3016},[2789,3015],99,[3017],{"name":931,"kind":885,"required":888},{"type":877,"name":2942,"path":2907,"parent":766,"lines":3019,"parameters":3020},[2469,1093],[3021],{"name":931,"kind":885,"required":888},{"type":877,"name":2943,"path":2907,"parent":766,"lines":3023,"parameters":3024},[1111,2475],[3025],{"name":931,"kind":885,"required":888},{"type":877,"name":2944,"path":2907,"parent":766,"lines":3027,"parameters":3028,"returns":3030},[2480,2496],[3029],{"name":931,"kind":885,"required":888},{"description":1118,"annotation":3031},{"join":3032},[3033,940],{"name":887,"cls":796},{"type":877,"name":2945,"path":2907,"parent":766,"lines":3035,"parameters":3038},[3036,3037],136,139,[3039],{"name":931,"kind":885,"required":888},{"type":877,"name":2946,"path":2907,"parent":766,"lines":3041,"parameters":3042},[2262,2276],[3043],{"name":931,"kind":885,"required":888},{"type":877,"name":2947,"path":2907,"parent":766,"lines":3045,"parameters":3047,"returns":3051},[3046,2919],145,[3048,3049],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":3050,"required":888},{"name":887,"cls":796},{"description":1118,"annotation":3052},{"name":1120,"cls":796},{"type":738,"name":2301,"path":3054,"parent":747,"description":3055,"classes":3056},"unitelabs\u002Fbus\u002Ftransports\u002Fwrite_transport.py","Modified from https:\u002F\u002Fgithub.com\u002Fpyserial\u002Fpyserial-asyncio\u002Fblob\u002Fmaster\u002Fserial_asyncio\u002F__init__.py.",[3057,1029],"unitelabs.bus.transports.write_transport.WritingOperationError",{"type":787,"name":3057,"path":3054,"parent":2301,"description":3059,"lines":3060,"bases":3062,"mro":3065},"An error occurred during a write operation.",[3061,1008],11,[3063],{"annotation":3064},{"name":815,"cls":796},[3057],{"type":787,"name":1029,"path":3054,"parent":2301,"description":3067,"lines":3068,"bases":3070,"attributes":3076,"functions":3081,"mro":3101},"Interface for write-only transports.",[1163,3069],322,[3071,3073],{"annotation":3072},{"name":1030,"cls":796},{"annotation":3074},{"name":3075,"cls":796},"asyncio.WriteTransport",[3077,3078,3079,3080],"unitelabs.bus.transports.write_transport.WriteTransport._has_writer","unitelabs.bus.transports.write_transport.WriteTransport._is_writing_paused","unitelabs.bus.transports.write_transport.WriteTransport._write_buffer","unitelabs.bus.transports.write_transport.WriteTransport.writes_pending",[3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100],"unitelabs.bus.transports.write_transport.WriteTransport.__init__","unitelabs.bus.transports.write_transport.WriteTransport.open","unitelabs.bus.transports.write_transport.WriteTransport.close","unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_size","unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_limits","unitelabs.bus.transports.write_transport.WriteTransport.set_write_buffer_limits","unitelabs.bus.transports.write_transport.WriteTransport.write","unitelabs.bus.transports.write_transport.WriteTransport.can_write_eof","unitelabs.bus.transports.write_transport.WriteTransport.write_eof","unitelabs.bus.transports.write_transport.WriteTransport.writelines","unitelabs.bus.transports.write_transport.WriteTransport.flush","unitelabs.bus.transports.write_transport.WriteTransport._ensure_writer","unitelabs.bus.transports.write_transport.WriteTransport._remove_writer","unitelabs.bus.transports.write_transport.WriteTransport._abort","unitelabs.bus.transports.write_transport.WriteTransport._safe_write","unitelabs.bus.transports.write_transport.WriteTransport._write","unitelabs.bus.transports.write_transport.WriteTransport._maybe_pause_writing","unitelabs.bus.transports.write_transport.WriteTransport._maybe_resume_protocol","unitelabs.bus.transports.write_transport.WriteTransport._set_write_buffer_limits",[1029,1030],{"type":877,"name":3082,"path":3054,"parent":1029,"lines":3103,"parameters":3104},[830,1164],[3105],{"name":931,"kind":885,"required":888},{"type":771,"name":3077,"path":3054,"parent":1029,"lines":3107,"value":1053},[838,838],{"type":771,"name":3078,"path":3054,"parent":1029,"lines":3109,"value":1053},[839,839],{"type":771,"name":3079,"path":3054,"parent":1029,"lines":3111,"value":1576,"annotation":3112},[2171,2171],{"left":3113,"slice":3114},{"name":938,"cls":796},{"join":3115},[3116,3117,3119],{"name":887,"cls":796},{"name":3118,"cls":796},"bytearray",{"name":3120,"cls":796},"memoryview",{"type":877,"name":3083,"path":3054,"parent":1029,"description":3122,"lines":3123,"parameters":3124},"Open the transport.\n\nIf write buffer currently contains data, sets state to allow future write operations.",[928,1931],[3125],{"name":931,"kind":885,"required":888},{"type":877,"name":3084,"path":3054,"parent":1029,"description":3127,"lines":3128,"parameters":3129},"Close the transport.\n\nIf write buffer is empty, sets state to disallow further write operations.",[969,1207],[3130],{"name":931,"kind":885,"required":888},{"type":771,"name":3080,"path":3054,"parent":1029,"description":3132,"lines":3133,"value":940,"annotation":3134},"Whether or not there is data in the write buffer waiting to be written.",[1570,1585],{"name":1052,"cls":796},{"type":877,"name":3085,"path":3054,"parent":1029,"description":3136,"lines":3137,"parameters":3138,"returns":3140},"Calculate the current size of the write buffer.",[2005,2588],[3139],{"name":931,"kind":885,"required":888},{"description":3141,"annotation":3142},"The number of bytes in the write buffer.",{"name":1120,"cls":796},{"type":877,"name":3086,"path":3054,"parent":1029,"description":3144,"lines":3145,"parameters":3146,"returns":3148},"Get the high and low watermarks for write flow control.",[1601,1092],[3147],{"name":931,"kind":885,"required":888},{"description":3149,"annotation":3150},"a tuple (low, high) where low and high are positive number of bytes.",{"left":3151,"slice":3152},{"name":1210,"cls":796},{"elements":3153},[3154,3155],{"name":1120,"cls":796},{"name":1120,"cls":796},{"type":877,"name":3087,"path":3054,"parent":1029,"description":3157,"lines":3158,"parameters":3159},"Set the high- and low-water limits for write flow control.\n\nThese two values control when to call the protocol's\n`pause_writing()` and `resume_writing()` methods. If specified,\nthe low-water limit must be less than or equal to the\nhigh-water limit. Neither value can be negative.\n\nThe defaults are implementation-specific. If only the\nhigh-water limit is given, the low-water limit defaults to an\nimplementation-specific value less than or equal to the\nhigh-water limit. Setting high to zero forces low to zero as\nwell, and causes `pause_writing()` to be called whenever the\nbuffer becomes non-empty. Setting low to zero causes\n`resume_writing()` to be called only once the buffer is empty.\nUse of zero for either limit is generally sub-optimal as it\nreduces opportunities for doing I\u002FO and computation\nconcurrently.",[2610,2085],[3160,3161,3167],{"name":931,"kind":885,"required":888},{"name":3162,"kind":885,"annotation":3163,"required":42,"default":940,"description":3166},"high",{"join":3164},[3165,940],{"name":1120,"cls":796},"The maximum allowed number of bytes in the write buffer.",{"name":3168,"kind":885,"annotation":3169,"required":42,"default":940,"description":3172},"low",{"join":3170},[3171,940],{"name":1120,"cls":796},"The minimum allowed number of bytes in the write buffer.",{"type":877,"name":3088,"path":3054,"parent":1029,"description":3174,"lines":3175,"parameters":3177},"Write some data bytes to the transport.\n\nThis does not block; it buffers the data and arranges for it\nto be sent out asynchronously.",[2818,3176],125,[3178,3179],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":3180,"required":888,"description":1088},{"join":3181},[3182,3183,3184],{"name":887,"cls":796},{"name":3118,"cls":796},{"name":3120,"cls":796},{"type":877,"name":3089,"path":3054,"parent":1029,"description":3186,"lines":3187,"parameters":3190,"returns":3192},"Whether or not this transport has implemented `write_eof()` method.",[3188,3189],127,135,[3191],{"name":931,"kind":885,"required":888},{"description":3193,"annotation":3194},"True if this transport supports `write_eof()`, False if not.",{"name":1052,"cls":796},{"type":877,"name":3090,"path":3054,"parent":1029,"description":3196,"lines":3197,"parameters":3199},"Close the write with end-of-file after flushing buffered data.\n\n(This is like typing ^D into a UNIX program reading from stdin.)\n\nData may still be received.",[3198,2502],137,[3200],{"name":931,"kind":885,"required":888},{"type":877,"name":3091,"path":3054,"parent":1029,"description":3202,"lines":3203,"parameters":3206},"Write a list (or any iterable) of data bytes to the transport.\n\nThe default implementation concatenates the arguments and\ncalls `write()` on the result.",[3204,3205],146,158,[3207,3208],{"name":931,"kind":885,"required":888},{"name":3209,"kind":885,"annotation":3210,"required":888,"description":3218},"list_of_data",{"left":3211,"slice":3213},{"name":3212,"cls":796},"typing.Iterable",{"join":3214},[3215,3216,3217],{"name":887,"cls":796},{"name":3118,"cls":796},{"name":3120,"cls":796},"The list of bytes to concatenate and write to the Transport.",{"type":877,"name":3092,"path":3054,"parent":1029,"description":3220,"lines":3221,"parameters":3222},"Flush the write buffer and disable further writing.",[2399,1405],[3223],{"name":931,"kind":885,"required":888},{"type":877,"name":3093,"path":3054,"parent":1029,"description":3225,"lines":3226,"parameters":3229},"Set state to allow future write operations, if transport is still open.",[3227,3228],167,171,[3230],{"name":931,"kind":885,"required":888},{"type":877,"name":3094,"path":3054,"parent":1029,"description":3232,"lines":3233,"parameters":3236},"Set state to disallow future write operations.",[3234,3235],173,176,[3237],{"name":931,"kind":885,"required":888},{"type":877,"name":3095,"path":3054,"parent":1029,"description":3239,"lines":3240,"parameters":3243},"Close the transport immediately and set state to disallow further write operations.",[3241,3242],178,187,[3244,3245],{"name":931,"kind":885,"required":888},{"name":2592,"kind":885,"annotation":3246,"required":42,"default":940,"description":3249},{"join":3247},[3248,940],{"name":815,"cls":796},"The exception to propagate to the transport when closing.",{"type":877,"name":3096,"path":3054,"parent":1029,"description":3251,"lines":3252,"parameters":3255},"Asynchronously write buffered data.\n\nThis method is called back asynchronously as a writer\nregistered with the asyncio event-loop against the\nunderlying file descriptor for the serial port.\n\nIf this method is invoked while the transport is closing,\nand the write-buffer is then emptied by this method, the protocol's\n`connection_lost()` method will be called with None as its\nargument.",[3253,3254],189,236,[3256],{"name":931,"kind":885,"required":888},{"type":877,"name":3097,"path":3054,"parent":1029,"description":3258,"lines":3259,"parameters":3262,"returns":3266},"Write data to the Transport.\n\nCalled within `_safe_write` for asynchronous writing.",[3260,3261],238,251,[3263,3264],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":3265,"required":888,"description":1088},{"name":887,"cls":796},{"description":3267,"annotation":3268},"the number of bytes written.",{"name":1120,"cls":796},{"type":877,"name":3098,"path":3054,"parent":1029,"description":3270,"lines":3271,"parameters":3273},"To be called whenever the write-buffer size increases.\n\nTests the current write-buffer size against the high water\nmark configured for this transport. If the high water mark is\nexceeded, the `Protocol` is instructed to `pause_writing()`.",[3272,2887],253,[3274],{"name":931,"kind":885,"required":888},{"type":877,"name":3099,"path":3054,"parent":1029,"description":3276,"lines":3277,"parameters":3279},"To be called whenever the write-buffer size decreases.\n\nTests the current write-buffer size against the low water\nmark configured for this transport. If writing is currently paused and the\nwrite-buffer size is below the low water mark, the `Protocol` is\ninstructed to `resume_writing()`.",[2892,3278],290,[3280],{"name":931,"kind":885,"required":888},{"type":877,"name":3100,"path":3054,"parent":1029,"description":3282,"lines":3283,"parameters":3285,"throws":3297},"Set the high- and low-water limits for write flow control.\n\nBy default, the high-water limit is 4 times the high-water limit\nand if neither is specified, (16384, 65536).",[3284,3069],292,[3286,3287,3292],{"name":931,"kind":885,"required":888},{"name":3168,"kind":885,"annotation":3288,"required":42,"default":940,"description":3291},{"join":3289},[3290,940],{"name":1120,"cls":796},"The low-water limit for write flow control.",{"name":3162,"kind":885,"annotation":3293,"required":42,"default":940,"description":3296},{"join":3294},[3295,940],{"name":1120,"cls":796},"The high-water limit for write flow control.",[3298],{"description":3299,"annotation":3300},"if the high-water limit is less than the low-water limit,\nor the low-water limit is less than 0.",{"name":762,"cls":796},{"type":738,"name":2302,"path":3302,"parent":747,"attributes":3303,"classes":3305},"unitelabs\u002Fbus\u002Ftransports\u002Fbase_transport.py",[3304],"unitelabs.bus.transports.base_transport.P",[1030],{"type":771,"name":3304,"path":3302,"parent":2302,"lines":3307,"value":3308},[874,874],"typing.TypeVar('P', bound=(asyncio.BaseProtocol))",{"type":787,"name":1030,"path":3302,"parent":2302,"description":3310,"lines":3311,"bases":3312,"attributes":3321,"functions":3325,"mro":3337},"Base Transport class, based on asyncio's BaseTransport.",[880,3189],[3313,3316],{"annotation":3314},{"name":3315,"cls":796},"asyncio.BaseTransport",{"annotation":3317},{"left":3318,"slice":3320},{"name":3319,"cls":796},"typing.Generic",{"name":3304,"cls":796},[3322,3323,3324],"unitelabs.bus.transports.base_transport.BaseTransport._loop","unitelabs.bus.transports.base_transport.BaseTransport._protocol","unitelabs.bus.transports.base_transport.BaseTransport._is_closing",[3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336],"unitelabs.bus.transports.base_transport.BaseTransport.__init__","unitelabs.bus.transports.base_transport.BaseTransport.get_protocol","unitelabs.bus.transports.base_transport.BaseTransport.set_protocol","unitelabs.bus.transports.base_transport.BaseTransport.is_closing","unitelabs.bus.transports.base_transport.BaseTransport.open","unitelabs.bus.transports.base_transport.BaseTransport._open","unitelabs.bus.transports.base_transport.BaseTransport.close","unitelabs.bus.transports.base_transport.BaseTransport._close","unitelabs.bus.transports.base_transport.BaseTransport.abort","unitelabs.bus.transports.base_transport.BaseTransport._abort","unitelabs.bus.transports.base_transport.BaseTransport._exception",[1030],{"type":877,"name":3326,"path":3302,"parent":1030,"lines":3339,"parameters":3340},[811,829],[3341],{"name":931,"kind":885,"required":888},{"type":771,"name":3322,"path":3302,"parent":1030,"lines":3343,"value":3344},[820,820],"asyncio.get_event_loop()",{"type":771,"name":3323,"path":3302,"parent":1030,"lines":3346,"value":940,"annotation":3347},[773,773],{"join":3348},[3349,940],{"name":3304,"cls":796},{"type":771,"name":3324,"path":3302,"parent":1030,"lines":3351,"value":1536},[829,829],{"type":877,"name":3327,"path":3302,"parent":1030,"description":3353,"lines":3354,"parameters":3355,"returns":3357},"Get the current `Protocol` associated with this transport.",[1178,1317],[3356],{"name":931,"kind":885,"required":888},{"description":3358,"annotation":3359},"The current `Protocol` instance.",{"join":3360},[3361,940],{"name":3304,"cls":796},{"type":877,"name":3328,"path":3302,"parent":1030,"description":3363,"lines":3364,"parameters":3365,"throws":3370},"Associate a new `Protocol` with this transport.",[1920,976],[3366,3367],{"name":931,"kind":885,"required":888},{"name":2200,"kind":885,"annotation":3368,"required":888,"description":3369},{"name":3304,"cls":796},"The new `Protocol` instance.",[3371],{"description":3372,"annotation":3373},"If the protocol is not an instance of asyncio.BaseProtocol\nor None.",{"name":3374,"cls":796},"TypeError",{"type":877,"name":3329,"path":3302,"parent":1030,"description":3376,"lines":3377,"parameters":3378,"returns":3380},"Whether the transport is closing or closed.",[982,1225],[3379],{"name":931,"kind":885,"required":888},{"description":3381,"annotation":3382},"True if the transport is closing or closed, False otherwise.",{"name":1052,"cls":796},{"type":877,"name":3330,"path":3302,"parent":1030,"description":3384,"lines":3385,"parameters":3386},"Open the transport and inform the `Protocol` whether the connection was established.",[2587,1601],[3387],{"name":931,"kind":885,"required":888},{"type":877,"name":3331,"path":3302,"parent":1030,"description":3389,"lines":3390,"parameters":3391},"Underlying action performed when calling `open`.\n\nSubclasses override this method to specify behavior when opening the\nconnection.",[1526,1092],[3392],{"name":931,"kind":885,"required":888},{"type":877,"name":3332,"path":3302,"parent":1030,"description":3394,"lines":3395,"parameters":3397},"Close the transport and inform the protocol whether the connection was terminated successfully.",[2610,3396],89,[3398],{"name":931,"kind":885,"required":888},{"type":877,"name":3333,"path":3302,"parent":1030,"description":3400,"lines":3401,"parameters":3402},"Underlying action performed when calling `close`.\n\nSubclasses override this method to specify behavior when closing the connection.",[3010,2789],[3403],{"name":931,"kind":885,"required":888},{"type":877,"name":3334,"path":3302,"parent":1030,"description":3405,"lines":3406,"parameters":3408},"Close the transport immediately.",[3407,2469],98,[3409],{"name":931,"kind":885,"required":888},{"type":877,"name":3335,"path":3302,"parent":1030,"description":3411,"lines":3412,"parameters":3413},"Underlying action performed when calling `abort`.\n\nSubclasses may override this method to specify behavior when aborting the\nconnection.",[2474,2790],[3414,3415],{"name":931,"kind":885,"required":888},{"name":2592,"kind":885,"annotation":3416,"required":42,"default":940,"description":3419},{"join":3417},[3418,940],{"name":815,"cls":796},"The Exception to propagate to the protocol, if connected.",{"type":877,"name":3336,"path":3302,"parent":1030,"description":3421,"lines":3422,"parameters":3424},"Report a fatal error to the event-loop and abort the transport.",[3423,3189],118,[3425,3426,3429],{"name":931,"kind":885,"required":888},{"name":2592,"kind":885,"annotation":3427,"required":888,"description":3428},{"name":815,"cls":796},"The Exception to pass on the the loop's exception handler.",{"name":3430,"kind":885,"annotation":3431,"required":888,"description":3432},"message",{"name":971,"cls":796},"Human-readable text describing the exception's execution state, cause, etc.",{"type":738,"name":748,"path":3434,"parent":739,"packages":3435,"attributes":3444,"classes":3446},"unitelabs\u002Fbus\u002Fcommands\u002F__init__.py",[3436,3437,3438,3439,3440,3441,3442,3443],"unitelabs.bus.commands.multiline","unitelabs.bus.commands.request","unitelabs.bus.commands.command","unitelabs.bus.commands.builder","unitelabs.bus.commands.serial_command","unitelabs.bus.commands.http_command","unitelabs.bus.commands.byte_command","unitelabs.bus.commands.response",[3445],"unitelabs.bus.commands.__all__",[755,753,754,756,757,758,759],{"type":738,"name":3436,"path":3448,"parent":748,"functions":3449},"unitelabs\u002Fbus\u002Fcommands\u002Fmultiline.py",[3450],"unitelabs.bus.commands.multiline.multiline",{"type":877,"name":3450,"path":3448,"parent":3436,"description":3452,"lines":3453,"parameters":3454,"returns":3459},"Handle multi-line responses in which the standard `_validate_response` method would trigger an early exit.\n\nThis decorator can be used in combination with the `_validate_response` method of `Command`\nto create a delay of `timeout` seconds to allow for more data to come in before calling the `_validate_response`\nmethod to set the `payload` of the `Response`.",[863,1202],[3455],{"name":1684,"kind":885,"annotation":3456,"required":42,"default":3457,"description":3458},{"name":1541,"cls":796},"0.01","The wait time in seconds before calling the `_validate_response` method.",{"description":1118,"annotation":3460},{"name":1262,"cls":796},{"type":771,"name":3445,"path":3434,"parent":748,"lines":3462,"value":3463},[811,839],[753,754,755,756,1810,1812,757,1814,758,759],{"type":738,"name":3437,"path":3465,"parent":748,"classes":3466},"unitelabs\u002Fbus\u002Fcommands\u002Frequest.py",[757],{"type":787,"name":757,"path":3465,"parent":3437,"description":3468,"lines":3469,"decorators":3470,"attributes":3471,"functions":3474,"mro":3477},"Data that is sent to a `Transport`.",[880,881],[1856],[3472,3473],"unitelabs.bus.commands.request.Request.payload","unitelabs.bus.commands.request.Request.timeout",[3475,3476],"unitelabs.bus.commands.request.Request.__init__","unitelabs.bus.commands.request.Request.__post_init__",[757],{"type":771,"name":3472,"path":3465,"parent":757,"lines":3479,"value":940,"annotation":3480},[1164,1164],{"name":887,"cls":796},{"type":771,"name":3473,"path":3465,"parent":757,"lines":3482,"value":940,"annotation":3483},[943,943],{"join":3484},[3485,940],{"name":1541,"cls":796},{"type":877,"name":3476,"path":3465,"parent":757,"lines":3487,"parameters":3488},[1317,881],[3489],{"name":931,"kind":885,"required":888},{"type":877,"name":3475,"path":3465,"parent":757,"lines":3491,"parameters":3492},[1940,1940],[3493,3494,3498],{"name":931,"kind":885,"required":888},{"name":3495,"kind":885,"annotation":3496,"required":888,"description":3497},"payload",{"name":887,"cls":796},"The payload of the request.",{"name":1684,"kind":885,"annotation":3499,"required":42,"default":940,"description":3502},{"join":3500},[3501,940],{"name":1541,"cls":796},"The duration in seconds to wait for a response before\nraising a timeout exception. Set to 0.0 to wait indefinitely.",{"type":738,"name":3438,"path":3504,"parent":748,"attributes":3505,"classes":3509},"unitelabs\u002Fbus\u002Fcommands\u002Fcommand.py",[1810,1812,1814,3506,3507,3508],"unitelabs.bus.commands.command.P","unitelabs.bus.commands.command.T","unitelabs.bus.commands.command.Parser",[3510,3511,3512,3513,754],"unitelabs.bus.commands.command.Serializer","unitelabs.bus.commands.command.SelfSerializer","unitelabs.bus.commands.command.Deserializer","unitelabs.bus.commands.command.SelfDeserializer",{"type":771,"name":1810,"path":3504,"parent":3438,"lines":3515,"value":3516},[820,820],"typing.TypeVar('InType')",{"type":771,"name":1812,"path":3504,"parent":3438,"lines":3518,"value":3519},[821,821],"typing.TypeVar('OutType')",{"type":771,"name":1814,"path":3504,"parent":3438,"lines":3521,"value":3522},[1163,1163],"TypeVar('ResType', default=OutType)",{"type":771,"name":3506,"path":3504,"parent":3438,"lines":3524,"value":3525},[829,829],"ParamSpec('P')",{"type":771,"name":3507,"path":3504,"parent":3438,"lines":3527,"value":3528},[830,830],"typing.TypeVar('T')",{"type":771,"name":3508,"path":3504,"parent":3438,"lines":3530,"value":3531},[2151,2151],"typing.Callable[P, T]",{"type":787,"name":3510,"path":3504,"parent":3438,"description":3533,"lines":3534,"bases":3535,"functions":3541,"mro":3543},"Serialize a structured message into bytes.",[2171,1197],[3536],{"annotation":3537},{"left":3538,"slice":3540},{"name":3539,"cls":796},"typing.Protocol",{"name":1810,"cls":796},[3542],"unitelabs.bus.commands.command.Serializer.__call__",[3510],{"type":877,"name":3542,"path":3504,"parent":3510,"lines":3545,"parameters":3546,"returns":3555},[1197,1197],[3547,3548,3550,3554],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":3549,"required":888},{"name":1810,"cls":796},{"name":3551,"kind":3552,"required":42,"default":3553},"*args","variadic positional","()",{"name":1056,"kind":1057,"required":42,"default":1058},{"description":1118,"annotation":3556},{"name":887,"cls":796},{"type":787,"name":3511,"path":3504,"parent":3438,"description":3558,"lines":3559,"bases":3560,"functions":3565,"mro":3567},"Serialize a structured message into bytes and operate on command instance.",[1202,1219],[3561],{"annotation":3562},{"left":3563,"slice":3564},{"name":3539,"cls":796},{"name":1810,"cls":796},[3566],"unitelabs.bus.commands.command.SelfSerializer.__call__",[3511],{"type":877,"name":3566,"path":3504,"parent":3511,"lines":3569,"parameters":3570,"returns":3579},[1219,1219],[3571,3572,3575,3577,3578],{"name":931,"kind":885,"required":888},{"name":3573,"kind":885,"annotation":3574,"required":888},"cmd",{"name":754,"cls":796},{"name":3430,"kind":885,"annotation":3576,"required":888},{"name":1810,"cls":796},{"name":3551,"kind":3552,"required":42,"default":3553},{"name":1056,"kind":1057,"required":42,"default":1058},{"description":1118,"annotation":3580},{"name":887,"cls":796},{"type":787,"name":3512,"path":3504,"parent":3438,"description":3582,"lines":3583,"bases":3584,"functions":3589,"mro":3591},"Deserialize bytes into a structured response.",[1585,1604],[3585],{"annotation":3586},{"left":3587,"slice":3588},{"name":3539,"cls":796},{"name":1812,"cls":796},[3590],"unitelabs.bus.commands.command.Deserializer.__call__",[3512],{"type":877,"name":3590,"path":3504,"parent":3512,"lines":3593,"parameters":3594,"returns":3600},[1604,1604],[3595,3596,3598,3599],{"name":931,"kind":885,"required":888},{"name":1097,"kind":885,"annotation":3597,"required":888},{"name":887,"cls":796},{"name":3551,"kind":3552,"required":42,"default":3553},{"name":1056,"kind":1057,"required":42,"default":1058},{"description":1118,"annotation":3601},{"name":1812,"cls":796},{"type":787,"name":3513,"path":3504,"parent":3438,"description":3603,"lines":3604,"bases":3605,"functions":3610,"mro":3612},"Deserialize bytes into a structured response and operate on a command instance.",[2230,1621],[3606],{"annotation":3607},{"left":3608,"slice":3609},{"name":3539,"cls":796},{"name":1812,"cls":796},[3611],"unitelabs.bus.commands.command.SelfDeserializer.__call__",[3513],{"type":877,"name":3611,"path":3504,"parent":3513,"lines":3614,"parameters":3615,"returns":3623},[1621,1621],[3616,3617,3619,3621,3622],{"name":931,"kind":885,"required":888},{"name":3573,"kind":885,"annotation":3618,"required":888},{"name":754,"cls":796},{"name":1097,"kind":885,"annotation":3620,"required":888},{"name":887,"cls":796},{"name":3551,"kind":3552,"required":42,"default":3553},{"name":1056,"kind":1057,"required":42,"default":1058},{"description":1118,"annotation":3624},{"name":1812,"cls":796},{"type":787,"name":754,"path":3504,"parent":3438,"description":3626,"lines":3627,"bases":3629,"attributes":3638,"functions":3650,"mro":3666},"Generic Command that can be used with `Protocol.execute`.\n\nThe first type parameter of the `Command` determines the type that the `Command` accepts on init and serialization,\nthe second type parameter determines the type returned by deserialization,\nand the third type parameter determines the type returned by the `result` method, e.g.\n`Command[str, list[str], list[bool]]` would ingest strings from the user,\nbe converted to a list of strings for the parser and then return a list of booleans when\nused with `Protocol.execute`.\n\nSubclasses which change the constructor signature should be careful to preserve the `timeout` and `is_void`\nparameters. Removal of these arguments may result in compatability issues with the `CommandBuilder`.",[3396,3628],376,[3630],{"annotation":3631},{"left":3632,"slice":3633},{"name":3319,"cls":796},{"elements":3634},[3635,3636,3637],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":1814,"cls":796},[3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649],"unitelabs.bus.commands.command.Command.receiver","unitelabs.bus.commands.command.Command._parsers","unitelabs.bus.commands.command.Command._response","unitelabs.bus.commands.command.Command._request","unitelabs.bus.commands.command.Command.message","unitelabs.bus.commands.command.Command.timeout","unitelabs.bus.commands.command.Command._response_buffer","unitelabs.bus.commands.command.Command.is_void","unitelabs.bus.commands.command.Command.request","unitelabs.bus.commands.command.Command.response","unitelabs.bus.commands.command.Command.parsers",[3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665],"unitelabs.bus.commands.command.Command.__new__","unitelabs.bus.commands.command.Command.__init__","unitelabs.bus.commands.command.Command.__repr__","unitelabs.bus.commands.command.Command.result","unitelabs.bus.commands.command.Command.serialize","unitelabs.bus.commands.command.Command._serialize","unitelabs.bus.commands.command.Command.deserialize","unitelabs.bus.commands.command.Command._deserialize","unitelabs.bus.commands.command.Command.validate_request","unitelabs.bus.commands.command.Command._set_response","unitelabs.bus.commands.command.Command.validate_response","unitelabs.bus.commands.command.Command._validate_response","unitelabs.bus.commands.command.Command.match_response","unitelabs.bus.commands.command.Command.add_parser","unitelabs.bus.commands.command.Command.parse",[754],{"type":771,"name":3639,"path":3504,"parent":754,"lines":3668,"value":940,"annotation":3669},[2475,2475],{"left":3670,"slice":3671},{"name":2744,"cls":796},{"name":765,"cls":796},{"type":771,"name":3640,"path":3504,"parent":754,"lines":3673,"value":940,"annotation":3674},[2818,2818],{"join":3675},[3676,940],{"left":3677,"slice":3678},{"name":938,"cls":796},{"name":3508,"cls":796},{"type":877,"name":3651,"path":3504,"parent":754,"lines":3680,"parameters":3682,"returns":3689},[1650,3681],129,[3683,3684,3685,3688],{"name":2011,"kind":885,"required":888},{"name":3551,"kind":3552,"required":42,"default":3553},{"name":3686,"kind":1270,"annotation":3687,"required":42,"default":1053},"is_void",{"name":1052,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058},{"description":1118,"annotation":3690},{"join":3691},[3692,3699],{"left":3693,"slice":3694},{"name":754,"cls":796},{"elements":3695},[3696,3697,3698],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":1814,"cls":796},{"left":3700,"slice":3701},{"name":754,"cls":796},{"elements":3702},[3703,940,940],{"name":1810,"cls":796},{"type":877,"name":3652,"path":3504,"parent":754,"lines":3705,"parameters":3706},[2496,2276],[3707,3708,3711,3716],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":3709,"required":888,"description":3710},{"name":1810,"cls":796},"The contents of the message to be sent to the device, pre-serialization.",{"name":1684,"kind":885,"annotation":3712,"required":42,"default":940,"description":3715},{"join":3713},[3714,940],{"name":1541,"cls":796},"How long is seconds to wait for a response.",{"name":3686,"kind":1270,"annotation":3717,"required":42,"default":1053,"description":3718},{"name":1052,"cls":796},"If true, does not return a response. Void commands ignore all response validations.",{"type":771,"name":3641,"path":3504,"parent":754,"lines":3720,"value":940,"annotation":3721},[2113,2113],{"join":3722},[3723,940],{"name":758,"cls":796},{"type":771,"name":3642,"path":3504,"parent":754,"lines":3725,"value":940,"annotation":3726},[3037,3037],{"join":3727},[3728,940],{"name":757,"cls":796},{"type":771,"name":3643,"path":3504,"parent":754,"lines":3730,"value":3430},[2123,2123],{"type":771,"name":3644,"path":3504,"parent":754,"lines":3732,"value":1684},[2262,2262],{"type":771,"name":3645,"path":3504,"parent":754,"lines":3734,"value":3735},[2497,2497],"b''",{"type":771,"name":3646,"path":3504,"parent":754,"lines":3737,"value":3686},[2276,2276],{"type":877,"name":3653,"path":3504,"parent":754,"lines":3739,"parameters":3740,"returns":3742},[3046,2503],[3741],{"name":931,"kind":885,"required":888},{"description":1118,"annotation":3743},{"name":971,"cls":796},{"type":771,"name":3647,"path":3504,"parent":754,"description":3745,"lines":3746,"value":940,"annotation":3747},"The `Request` which will be used by the `Protocol` to send bytes to the device.\n\nCalls `validate_request` on the `command` before serializing it and creating the `Request` object.",[2135,1445],{"name":757,"cls":796},{"type":771,"name":3648,"path":3504,"parent":754,"description":3749,"lines":3750,"value":940,"annotation":3752},"The `Response` used by `Protocol.data_received` to set the `payload` of the command.\n\nWhen using the `Protocol.execute` method, the `Protocol` will call `validate_response`\nfrom within it's `Protocol.data_received` method and only set the result if valid.",[3228,3751],182,{"name":758,"cls":796},{"type":877,"name":3654,"path":3504,"parent":754,"description":3754,"lines":3755,"parameters":3758,"returns":3760},"Deserializes the `Response.payload.result()` bytes and consecutively applies `self.parsers`.",[3756,3757],184,196,[3759],{"name":931,"kind":885,"required":888},{"description":3761,"annotation":3762},"The deserialized `Response.payload` or None if `Command.is_void` is True.",{"name":1814,"cls":796},{"type":877,"name":3655,"path":3504,"parent":754,"description":3764,"lines":3765,"parameters":3768,"returns":3775},"Serialize the message into bytes.\n\nUses `self.message` if `message` is None.\nNB: Calling with `message` DOES NOT SET the `self.message'` attribute;\nthe `Request` sent to the device will use the `self.message` attribute.",[3766,3767],198,213,[3769,3770],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":3771,"required":42,"default":940,"description":3774},{"join":3772},[3773,940],{"name":1810,"cls":796},"A command input, or None to use `self.message`.",{"description":3776,"annotation":3777},"The serialized message to be sent to the device.",{"name":887,"cls":796},{"type":877,"name":3656,"path":3504,"parent":754,"description":3779,"lines":3780,"decorators":3783,"parameters":3784,"returns":3788},"User-configured serialization method.",[3781,3782],215,218,[2008],[3785,3786],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":3787,"required":888},{"name":1810,"cls":796},{"description":1118,"annotation":3789},{"name":887,"cls":796},{"type":877,"name":3657,"path":3504,"parent":754,"description":3791,"lines":3792,"parameters":3793,"returns":3800},"Deserializes the `response` bytes. Calls `_deserialize` with `self.response` payload if `response` is None.",[2858,1721],[3794,3795],{"name":931,"kind":885,"required":888},{"name":1097,"kind":885,"annotation":3796,"required":42,"default":940,"description":3799},{"join":3797},[3798,940],{"name":887,"cls":796},"bytes to be deserialized, or None to use `Response` payload.",{"description":3801,"annotation":3802},"None if `self.is_void`, else the deserialized `response`.",{"name":1812,"cls":796},{"type":877,"name":3658,"path":3504,"parent":754,"description":3804,"lines":3805,"decorators":3807,"parameters":3808,"returns":3812},"User-configured deserialization method.",[1730,3806],244,[2008],[3809,3810],{"name":931,"kind":885,"required":888},{"name":1097,"kind":885,"annotation":3811,"required":888},{"name":887,"cls":796},{"description":1118,"annotation":3813},{"name":1812,"cls":796},{"type":877,"name":3659,"path":3504,"parent":754,"description":3815,"lines":3816,"parameters":3819,"returns":3824},"Validate a serialized message.\n\nCalled within `Command.request` before generating a `Request` object.",[3817,3818],246,259,[3820,3821],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":3822,"required":888,"description":3823},{"name":887,"cls":796},"The serialized message to set as the `Request.payload`, if valid.",{"description":3825,"annotation":3826},"Whether or not the `message` is valid.",{"name":1052,"cls":796},{"type":877,"name":3660,"path":3504,"parent":754,"description":3828,"lines":3829,"parameters":3832},"Set the result of `self.response.payload` to `self._response_buffer` and clears `self._response_buffer`.",[3830,3831],261,265,[3833],{"name":931,"kind":885,"required":888},{"type":877,"name":3661,"path":3504,"parent":754,"description":3835,"lines":3836,"parameters":3839},"Set `Response.payload` if it belongs to this Command.\n\nThis method is called by `Protocol.data_received` and is responsible for setting the `Response.payload`.\n\nIt manages the `_response_buffer` that accumulates the response bytes and calls `_validate_response`\nto determine whether the accumulated message in the `_response_buffer` is finished \u002F 'valid'.\nIf the response is valid, it sets the `Response.payload.result`\nto the accumulated bytes from the `_response_buffer`.",[3837,3838],267,284,[3840,3841],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":3842,"required":888,"description":3843},{"name":887,"cls":796},"The bytes from the `Transport` to add to the response_buffer and evaluate for completeness.",{"type":877,"name":3662,"path":3504,"parent":754,"description":3845,"lines":3846,"parameters":3849,"returns":3854},"User-configured response validation method.\n\nValidate the data received from the `Transport` and determine if the data is a complete response.\nSubclasses override this method to specify behavior for validating data before setting it as the response.",[3847,3848],286,300,[3850,3851],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":3852,"required":888,"description":3853},{"name":887,"cls":796},"The bytes to evaluate for completeness.",{"description":3855,"annotation":3856},"True if `data` is a complete, valid message from the device, otherwise False.",{"name":1052,"cls":796},{"type":877,"name":3663,"path":3504,"parent":754,"description":3858,"lines":3859,"parameters":3862,"returns":3867,"examples":3870},"Check if `data` belongs to this command and then validate the response.\n\nFor devices that allow parallel command processing.",[3860,3861],302,330,[3863,3864],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":3865,"required":888,"description":3866},{"name":887,"cls":796},"The bytes to check for match during parallel processing, usually an identifier\nshared by request and response.",{"description":3868,"annotation":3869},"True if the `data` matches to this command, otherwise False.",{"name":1052,"cls":796},[3871],{"description":3872,"code":3873},"For a command which expects responses to begin with the shared identifier `command_id`",">>> class MyCommand(Command):\n>>>   command_id: str = uuid.uuid4().hex\n>>>   def match_response(self, data: bytes):\n>>>     try:\n>>>       processed_data: str = self.deserialize(data)\n>>>       if not processed_data.startswith(self.command_id):\n>>>         return False\n>>>     except DeserializationError:\n>>>       return False\n>>>     return super().match_response(data)",{"type":771,"name":3649,"path":3504,"parent":754,"description":3875,"lines":3876,"value":940,"annotation":3879},"Parsers are functions that are applied to the deserialized data when calling `result()`.",[3877,3878],333,335,{"left":3880,"slice":3881},{"name":938,"cls":796},{"name":3508,"cls":796},{"type":877,"name":3664,"path":3504,"parent":754,"description":3883,"lines":3884,"parameters":3887,"returns":3898,"examples":3906},"Add a parser to the list of parsers applied when calling `result()`.\n\nParsers are chained together in the order that they are added and are consecutively applied\nto the deserialized data based on the return value of the previous parser, meaning that any\ndata filtered by earlier parsers will no longer be accessible to later parsers.",[3885,3886],337,365,[3888,3889],{"name":931,"kind":885,"required":888},{"name":3890,"kind":885,"annotation":3891,"required":888,"description":3897},"parser",{"left":3892,"slice":3893},{"name":3508,"cls":796},{"elements":3894},[3895,3896],{"name":3506,"cls":796},{"name":3507,"cls":796},"A function that operates on the deserialized `result` (the first `Parser`),\nor the result of another `Parser` (all parsers after the first are chained together).",{"description":1118,"annotation":3899},{"left":3900,"slice":3901},{"name":754,"cls":796},{"elements":3902},[3903,3904,3905],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":3507,"cls":796},[3907,3909],{"description":1674,"code":3908},">>> def parser(data) -> dict[str, str]:\n>>>   return {\"data\": data.upper()}\n>>> cmd = SerialCommand(\"message\").add_parser(parser)\nType inference only works as expected with the `Command` returned from `add_parser`",{"description":3910,"code":3911},"Can be chained to add multiple parsers",">>> cmd = SerialCommand(\"message\").add_parser(parser1).add_parser(parser2)",{"type":877,"name":3665,"path":3504,"parent":754,"description":3913,"lines":3914,"parameters":3916,"returns":3921},"Apply `parsers` iteratively to the `data`.",[3915,3628],367,[3917,3918],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":3919,"required":888,"description":3920},{"name":1812,"cls":796},"The data source which is fed into the parsers for processing.",{"description":1118,"annotation":3922},{"name":1814,"cls":796},{"type":738,"name":3439,"path":3924,"parent":748,"attributes":3925,"classes":3931},"unitelabs\u002Fbus\u002Fcommands\u002Fbuilder.py",[3926,3927,3928,3929,3930],"unitelabs.bus.commands.builder.P","unitelabs.bus.commands.builder.T","unitelabs.bus.commands.builder.R","unitelabs.bus.commands.builder.S_InType","unitelabs.bus.commands.builder.D_OutType",[755],{"type":771,"name":3926,"path":3924,"parent":3439,"lines":3933,"value":3525},[773,773],{"type":771,"name":3927,"path":3924,"parent":3439,"lines":3935,"value":3936},[829,829],"TypeVar('T')",{"type":771,"name":3928,"path":3924,"parent":3439,"lines":3938,"value":3939},[830,830],"TypeVar('R', default=OutType)",{"type":771,"name":3929,"path":3924,"parent":3439,"lines":3941,"value":3942},[1178,1178],"TypeVar('S_InType')",{"type":771,"name":3930,"path":3924,"parent":3439,"lines":3944,"value":3945},[2151,2151],"TypeVar('D_OutType')",{"type":787,"name":755,"path":3924,"parent":3439,"description":3947,"lines":3948,"bases":3950,"attributes":3959,"functions":3969,"examples":3981,"mro":3991},"Class that coordinates the chainable building of a `Command` instance.",[2171,3949],378,[3951],{"annotation":3952},{"left":3953,"slice":3954},{"name":3319,"cls":796},{"elements":3955},[3956,3957,3958],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":3928,"cls":796},[3960,3961,3962,3963,3964,3965,3966,3967,3968],"unitelabs.bus.commands.builder.CommandBuilder._command","unitelabs.bus.commands.builder.CommandBuilder._cmd_cls_name","unitelabs.bus.commands.builder.CommandBuilder._serializer","unitelabs.bus.commands.builder.CommandBuilder._deserializer","unitelabs.bus.commands.builder.CommandBuilder._response_validator","unitelabs.bus.commands.builder.CommandBuilder._response_validator_timeout","unitelabs.bus.commands.builder.CommandBuilder._timeout","unitelabs.bus.commands.builder.CommandBuilder._is_void","unitelabs.bus.commands.builder.CommandBuilder._parsers",[3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980],"unitelabs.bus.commands.builder.CommandBuilder.__init__","unitelabs.bus.commands.builder.CommandBuilder.__copy__","unitelabs.bus.commands.builder.CommandBuilder.__deepcopy__","unitelabs.bus.commands.builder.CommandBuilder.create_command_method","unitelabs.bus.commands.builder.CommandBuilder.with_serializer","unitelabs.bus.commands.builder.CommandBuilder.with_deserializer","unitelabs.bus.commands.builder.CommandBuilder.with_parser","unitelabs.bus.commands.builder.CommandBuilder.with_timeout","unitelabs.bus.commands.builder.CommandBuilder.without_response","unitelabs.bus.commands.builder.CommandBuilder.with_multiline","unitelabs.bus.commands.builder.CommandBuilder.build",[3982,3985,3988],{"description":3983,"code":3984},"Call functions individually, replacing the builder instance",">>> builder = CommandBuilder(ByteCommand)\n>>> builder = builder.with_serializer(lambda x: x + b\"\\r\\n\")\n>>> builder = builder.with_deserializer(lambda x: x.strip(b\"\\r\\n\"))\n>>> cmd = builder.build(\"message\", timeout=0.5, is_void=True)\nCommandBuilder `with_` methods do not operate on themselves, but rather create and operate on\na new instance of the CommandBuilder.",{"description":3986,"code":3987},"Chain functions together",">>> cmd = (\n>>>   CommandBuilder(ByteCommand)\n>>>   .with_serializer(lambda x: x + b\"\\r\\n\")\n>>>   .with_deserializer(lambda x: x.strip(b\"\\r\\n\"))\n>>>   .build(\"message\", timeout=0.5, is_void=True)\n>>> )",{"description":3989,"code":3990},"Create multiple commands from the same builder, or builder intermediate",">>> crlf_builder = (\n>>>   CommandBuilder(ByteCommand)\n>>>   .with_serializer(lambda x: x + b\"\\r\\n\")\n>>>   .with_deserializer(lambda x: x.strip(b\"\\r\\n\"))\n>>> )\n>>> cmd = crlf_builder.build(\"message\", timeout=0.5)\n>>> cmd2 = crlf_builder.build(\"message2\", timeout=0.5)\n>>> cmd3 = crlf_builder.with_serializer(lambda x: x).build(b\"message3\", timeout=0.5)\nHere `cmd` and `cmd2` both use the same serializer and deserializer methods,\nbut `cmd3` uses a different serializer.",[755],{"type":877,"name":3970,"path":3924,"parent":755,"lines":3993,"parameters":3994},[983,2042],[3995,3996,4007],{"name":931,"kind":885,"required":888},{"name":1804,"kind":885,"annotation":3997,"required":42,"default":4005,"description":4006},{"left":3998,"slice":3999},{"name":1393,"cls":796},{"left":4000,"slice":4001},{"name":754,"cls":796},{"elements":4002},[4003,4004],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":753,"cls":796},"The `Command` class to build on top of.",{"name":4008,"kind":885,"annotation":4009,"required":42,"default":4010,"description":4011},"cls_name",{"name":971,"cls":796},"'BuiltCommand'","The name of the `Command` subclass returned by `build`.",{"type":771,"name":3960,"path":3924,"parent":755,"lines":4013,"value":1804},[1082,1082],{"type":771,"name":3961,"path":3924,"parent":755,"lines":4015,"value":4008},[989,989],{"type":771,"name":3962,"path":3924,"parent":755,"lines":4017,"value":940},[3005,3005],{"type":771,"name":3963,"path":3924,"parent":755,"lines":4019,"value":940},[2588,2588],{"type":771,"name":3964,"path":3924,"parent":755,"lines":4021,"value":940},[1598,1598],{"type":771,"name":3965,"path":3924,"parent":755,"lines":4023,"value":940},[1601,1601],{"type":771,"name":3966,"path":3924,"parent":755,"lines":4025,"value":940},[1604,1604],{"type":771,"name":3967,"path":3924,"parent":755,"lines":4027,"value":1053},[1526,1526],{"type":771,"name":3968,"path":3924,"parent":755,"lines":4029,"value":1576,"annotation":4030},[2042,2042],{"left":4031,"slice":4032},{"name":938,"cls":796},{"name":3508,"cls":796},{"type":877,"name":3971,"path":3924,"parent":755,"lines":4034,"parameters":4035,"returns":4037},[1610,2458],[4036],{"name":931,"kind":885,"required":888},{"description":1118,"annotation":4038},{"left":4039,"slice":4040},{"name":755,"cls":796},{"elements":4041},[4042,4043,4044],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":3928,"cls":796},{"type":877,"name":3972,"path":3924,"parent":755,"lines":4046,"parameters":4047,"returns":4054},[1615,1621],[4048,4049],{"name":931,"kind":885,"required":888},{"name":4050,"kind":885,"annotation":4051,"required":42,"default":940},"memo",{"join":4052},[4053,940],{"name":1424,"cls":796},{"description":1118,"annotation":4055},{"left":4056,"slice":4057},{"name":755,"cls":796},{"elements":4058},[4059,4060,4061],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":3928,"cls":796},{"type":877,"name":3973,"path":3924,"parent":755,"description":4063,"lines":4064,"decorators":4066,"parameters":4068,"returns":4080,"throws":4102,"examples":4106},"Wrap a function into a command method.",[2611,4065],162,[4067],"staticmethod",[4069,4078],{"name":4070,"kind":885,"annotation":4071,"required":888,"description":4077},"func",{"left":4072,"slice":4073},{"name":1262,"cls":796},{"elements":4074},[4075,4076],{"name":3926,"cls":796},{"name":3927,"cls":796},"The function to format into a command method. Must be a callable with a final signature of\n(input) or (self, input) when partially loaded with `kwargs`.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":4079},"Keyword arguments to pass to the command method.",{"description":4081,"annotation":4082},"A wrapped, partially-loaded function with the final signature of (input) or (self, input).",{"join":4083},[4084,4096],{"left":4085,"slice":4086},{"name":1262,"cls":796},{"elements":4087},[4088,4095],{"left":4089,"slice":4091},{"name":4090,"cls":796},"typing.Concatenate",{"elements":4092},[4093,4094],{"name":754,"cls":796},{"name":3926,"cls":796},{"name":3927,"cls":796},{"left":4097,"slice":4098},{"name":1262,"cls":796},{"elements":4099},[4100,4101],{"name":3926,"cls":796},{"name":3927,"cls":796},[4103],{"description":4104,"annotation":4105},"If the function is not a callable with exactly 1 or 2 unset parameters\n(based on `kwargs` and default values).",{"name":784,"cls":796},[4107,4110],{"description":4108,"code":4109},"Provide a function with all parameters set.",">>> def my_func(message: str, submessage: str, is_complex: bool = False) -> str:\n>>>     return (message + submessage) if is_complex else message\n>>> new_func = builder.create_command_method(\n...     my_func, submessage=\"shhh\", is_complex=True\n... )\nThe new function signature is (message: str) -> str",{"description":4111,"code":4112},"Missing parameters may cause a `TypeError`",">>> new_func = builder.create_command_method(my_func, is_complex=True)\nThe new function signature is (self, message: str) -> str\n  A `TypeError` will be raised. The underlying function has a true signature (message: str, submessage: str)\n  `Command` will be passed in as the first parameter.",{"type":877,"name":3974,"path":3924,"parent":755,"description":4114,"lines":4115,"parameters":4116,"returns":4131},"Set a serializer to apply to the `Command.message` before sending it to the device.\n\nThe serializer will be called with the message to send to the device as the first and only argument.\nAdditional arguments can be preloaded into the serializer with `**kwargs`.",[2172,3751],[4117,4118,4129],{"name":931,"kind":885,"required":888},{"name":4119,"kind":885,"annotation":4120,"required":888,"description":4128},"serializer",{"join":4121},[4122,4125],{"left":4123,"slice":4124},{"name":3510,"cls":796},{"name":3929,"cls":796},{"left":4126,"slice":4127},{"name":3511,"cls":796},{"name":3929,"cls":796},"The serializer function to apply.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":4130},"Keyword arguments to pass to the serializer.",{"description":1118,"annotation":4132},{"left":4133,"slice":4134},{"name":755,"cls":796},{"elements":4135},[4136,4137,4138],{"name":3929,"cls":796},{"name":1812,"cls":796},{"name":3928,"cls":796},{"type":877,"name":3975,"path":3924,"parent":755,"description":4140,"lines":4141,"parameters":4142,"returns":4157,"examples":4165},"Set a deserializer function to apply to the `Command.response` recieved from the device.\n\nThe deserializer will be called with the response bytes as the first and only argument.\nAdditional arguments can be preloaded into the deserializer with  `**kwargs`.\n\nThis function will wrap the deserializer in a check for null values to ensure that calls without `response'\nuse the `Response.payload.result()`.",[3756,1700],[4143,4144,4155],{"name":931,"kind":885,"required":888},{"name":4145,"kind":885,"annotation":4146,"required":888,"description":4154},"deserializer",{"join":4147},[4148,4151],{"left":4149,"slice":4150},{"name":3512,"cls":796},{"name":3930,"cls":796},{"left":4152,"slice":4153},{"name":3513,"cls":796},{"name":3930,"cls":796},"The deserializer function to apply.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":4156},"Keyword arguments to pass to the deserializer.",{"description":1118,"annotation":4158},{"left":4159,"slice":4160},{"name":755,"cls":796},{"elements":4161},[4162,4163,4164],{"name":1810,"cls":796},{"name":3930,"cls":796},{"name":3928,"cls":796},[4166,4169,4172],{"description":4167,"code":4168},"Use an existing deserializer function.",">>> builder = CommandBuilder(ByteCommand)\n>>> def deserializer(response: bytes) -> bytes:\n>>>     return response.strip()\n>>> builder.with_deserializer(deserializer)",{"description":4170,"code":4171},"Equivalent functionality with a lambda function.",">>> builder = CommandBuilder(ByteCommand)\n>>> builder.with_deserializer(lambda response: response.strip())",{"description":4173,"code":4174},"Use a custom deserializer function containing kwargs.",">>> def deserializer(response: bytes, match: str, multi: typing.Optional[bool]) -> str:\n>>>     pass\n>>> builder.with_deserializer(deserializer, match=\"foo\", multi=True)\nAll parameters for the deserializer _must_ be passed as kwargs.",{"type":877,"name":3976,"path":3924,"parent":755,"description":4176,"lines":4177,"parameters":4178,"returns":4190},"Add a partial parser function to the `Command`.\n\nParsers are chained together consequetively from `Command._parsers` when calling `Command.result()`.\nThe first parser receives the deserialized data and must pass data through to the next parser.",[1713,1730],[4179,4180,4188],{"name":931,"kind":885,"required":888},{"name":3890,"kind":885,"annotation":4181,"required":888,"description":4187},{"left":4182,"slice":4183},{"name":3508,"cls":796},{"elements":4184},[4185,4186],{"name":3926,"cls":796},{"name":3927,"cls":796},"The parser function to apply.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":4189},"Keyword arguments to pass to the parser.",{"description":1118,"annotation":4191},{"left":4192,"slice":4193},{"name":755,"cls":796},{"elements":4194},[4195,4196,4197],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":3927,"cls":796},{"type":877,"name":3977,"path":3924,"parent":755,"description":4199,"lines":4200,"parameters":4203,"returns":4208,"throws":4216},"Set the timeout to apply to the command.\n\nAlternative to setting `timeout` in `build`, will be overriden by `timeout` in `build`, if provided.",[4201,4202],243,260,[4204,4205],{"name":931,"kind":885,"required":888},{"name":1684,"kind":885,"annotation":4206,"required":888,"description":4207},{"name":1541,"cls":796},"The timeout to apply to the command.",{"description":1118,"annotation":4209},{"left":4210,"slice":4211},{"name":755,"cls":796},{"elements":4212},[4213,4214,4215],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":3928,"cls":796},[4217],{"description":4218,"annotation":4219},"If the timeout is lower than 0.",{"name":761,"cls":796},{"type":877,"name":3978,"path":3924,"parent":755,"description":4221,"lines":4222,"parameters":4225,"returns":4227,"examples":4233},"Set the command to be a void command, i.e. return None as a response.\n\nAlternative to setting `is_void` in `build`, will be overriden by `is_void` in `build`, if provided.",[4223,4224],262,276,[4226],{"name":931,"kind":885,"required":888},{"description":1118,"annotation":4228},{"left":4229,"slice":4230},{"name":755,"cls":796},{"elements":4231},[4232,940,940],{"name":1810,"cls":796},[4234],{"description":1674,"code":4235},">>> builder = CommandBuilder().without_response()\n>>> cmd: Command[bytes, None, None] = builder.build(b\"message\")\n>>> res = await protocol.execute(cmd)\n>>> assert res is None",{"type":877,"name":3979,"path":3924,"parent":755,"description":4237,"lines":4238,"parameters":4241,"returns":4270,"throws":4278,"examples":4281},"Handle multi-line responses.",[4239,4240],278,318,[4242,4243,4246],{"name":931,"kind":885,"required":888},{"name":1684,"kind":885,"annotation":4244,"required":888,"description":4245},{"name":1541,"cls":796},"The time in seconds to wait for more data before calling the `_validate_response` method.",{"name":4247,"kind":885,"annotation":4248,"required":42,"default":940,"description":4269},"validate_response",{"join":4249},[4250,4258,940],{"left":4251,"slice":4252},{"name":1262,"cls":796},{"elements":4253},[4254,4257],{"elements":4255},[4256],{"name":887,"cls":796},{"name":1052,"cls":796},{"left":4259,"slice":4260},{"name":1262,"cls":796},{"elements":4261},[4262,4268],{"elements":4263},[4264,4267],{"left":4265,"slice":4266},{"name":1393,"cls":796},{"name":754,"cls":796},{"name":887,"cls":796},{"name":1052,"cls":796},"The function to replace the `Command._validate_response` method.",{"description":1118,"annotation":4271},{"left":4272,"slice":4273},{"name":755,"cls":796},{"elements":4274},[4275,4276,4277],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":3928,"cls":796},[4279],{"description":4218,"annotation":4280},{"name":761,"cls":796},[4282,4285],{"description":4283,"code":4284},"Use the base class's `_validate_response` method.",">>> builder = CommandBuilder().with_multiline(0.01)\n>>> cmd = builder.build(b\"message\")",{"description":4286,"code":4287},"Provide a custom validation function.",">>> builder = builder.with_multiline(\n...     0.01, validate_response=lambda x: x.endswith(b\"\\r\\n\")\n... )\n>>> cmd = builder.build(b\"message\")",{"type":877,"name":3980,"path":3924,"parent":755,"description":4289,"lines":4290,"parameters":4292,"returns":4310},"Build the `Command` instance with the previously set serializer, deserializer and parsers.",[4291,3949],320,[4293,4294,4297,4299,4303,4308],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":4295,"required":888,"description":4296},{"name":1810,"cls":796},"The message to send to the device.",{"name":3551,"kind":3552,"required":42,"default":3553,"description":4298},"Additional positional arguments to pass to the command.",{"name":1684,"kind":1270,"annotation":4300,"required":42,"default":940,"description":4207},{"join":4301},[4302,940],{"name":1541,"cls":796},{"name":3686,"kind":1270,"annotation":4304,"required":42,"default":940,"description":4307},{"join":4305},[4306,940],{"name":1052,"cls":796},"Whether the command is a void command.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":4309},"Additional keyword arguments to pass to the command.",{"description":4311,"annotation":4312},"A custom `Command` instance.",{"left":4313,"slice":4314},{"name":754,"cls":796},{"elements":4315},[4316,4317,4318],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":3928,"cls":796},{"type":738,"name":3440,"path":4320,"parent":748,"classes":4321},"unitelabs\u002Fbus\u002Fcommands\u002Fserial_command.py",[759],{"type":787,"name":759,"path":4320,"parent":3440,"description":4323,"lines":4324,"bases":4325,"attributes":4333,"functions":4337,"mro":4342},"Command for use with serial communication device.",[874,975],[4326],{"annotation":4327},{"left":4328,"slice":4329},{"name":754,"cls":796},{"elements":4330},[4331,4332],{"name":971,"cls":796},{"name":971,"cls":796},[4334,4335,4336],"unitelabs.bus.commands.serial_command.SerialCommand._read_terminator","unitelabs.bus.commands.serial_command.SerialCommand._write_terminator","unitelabs.bus.commands.serial_command.SerialCommand._encoding",[4338,4339,4340,4341],"unitelabs.bus.commands.serial_command.SerialCommand.__init__","unitelabs.bus.commands.serial_command.SerialCommand._serialize","unitelabs.bus.commands.serial_command.SerialCommand._deserialize","unitelabs.bus.commands.serial_command.SerialCommand._validate_response",[759,754],{"type":877,"name":4338,"path":4320,"parent":759,"lines":4344,"parameters":4345},[829,950],[4346,4347,4350,4355,4359,4364],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":4348,"required":888,"description":4349},{"name":971,"cls":796},"the string message to send to the device.",{"name":4351,"kind":885,"annotation":4352,"required":42,"default":4353,"description":4354},"read_terminator",{"name":887,"cls":796},"b'\\r\\n'","the byte-string expected at the end of messages coming from the device.",{"name":4356,"kind":885,"annotation":4357,"required":42,"default":4353,"description":4358},"write_terminator",{"name":887,"cls":796},"the byte-string to append to our string `message` which indicates to the device that\na complete message has been received.",{"name":4360,"kind":885,"annotation":4361,"required":42,"default":4362,"description":4363},"encoding",{"name":971,"cls":796},"'ascii'","The encoding used to convert between strings and bytes.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":4365},"Additional `Command` kwargs.",{"type":771,"name":4334,"path":4320,"parent":759,"lines":4367,"value":4351},[928,928],{"type":771,"name":4335,"path":4320,"parent":759,"lines":4369,"value":4356},[1317,1317],{"type":771,"name":4336,"path":4320,"parent":759,"lines":4371,"value":4360},[950,950],{"type":877,"name":4339,"path":4320,"parent":759,"lines":4373,"parameters":4374,"returns":4380},[1188,1197],[4375,4376],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":4377,"required":42,"default":940},{"join":4378},[4379,940],{"name":971,"cls":796},{"description":1118,"annotation":4381},{"name":887,"cls":796},{"type":877,"name":4340,"path":4320,"parent":759,"lines":4383,"parameters":4384,"returns":4390},[1854,1202],[4385,4386],{"name":931,"kind":885,"required":888},{"name":1097,"kind":885,"annotation":4387,"required":888},{"join":4388},[4389,940],{"name":887,"cls":796},{"description":1118,"annotation":4391},{"name":971,"cls":796},{"type":877,"name":4341,"path":4320,"parent":759,"lines":4393,"parameters":4394,"returns":4398},[1065,975],[4395,4396],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":4397,"required":888},{"name":887,"cls":796},{"description":1118,"annotation":4399},{"name":1052,"cls":796},{"type":738,"name":3441,"path":4401,"parent":748,"classes":4402},"unitelabs\u002Fbus\u002Fcommands\u002Fhttp_command.py",[4403,4404,756],"unitelabs.bus.commands.http_command._Method","unitelabs.bus.commands.http_command.HTTPResponse",{"type":787,"name":4403,"path":4401,"parent":3441,"lines":4406,"bases":4407,"attributes":4412,"mro":4422},[811,1178],[4408,4410],{"annotation":4409},{"name":971,"cls":796},{"annotation":4411},{"name":2155,"cls":796},[4413,4414,4415,4416,4417,4418,4419,4420,4421],"unitelabs.bus.commands.http_command._Method.OPTIONS","unitelabs.bus.commands.http_command._Method.GET","unitelabs.bus.commands.http_command._Method.HEAD","unitelabs.bus.commands.http_command._Method.POST","unitelabs.bus.commands.http_command._Method.PUT","unitelabs.bus.commands.http_command._Method.DELETE","unitelabs.bus.commands.http_command._Method.TRACE","unitelabs.bus.commands.http_command._Method.CONNECT","unitelabs.bus.commands.http_command._Method.PATCH",[4403],{"type":771,"name":4413,"path":4401,"parent":4403,"lines":4424,"value":4425},[3061,3061],"'OPTIONS'",{"type":771,"name":4414,"path":4401,"parent":4403,"lines":4427,"value":4428},[1008,1008],"'GET'",{"type":771,"name":4415,"path":4401,"parent":4403,"lines":4430,"value":4431},[820,820],"'HEAD'",{"type":771,"name":4416,"path":4401,"parent":4403,"lines":4433,"value":4434},[821,821],"'POST'",{"type":771,"name":4417,"path":4401,"parent":4403,"lines":4436,"value":4437},[1163,1163],"'PUT'",{"type":771,"name":4418,"path":4401,"parent":4403,"lines":4439,"value":4440},[773,773],"'DELETE'",{"type":771,"name":4419,"path":4401,"parent":4403,"lines":4442,"value":4443},[829,829],"'TRACE'",{"type":771,"name":4420,"path":4401,"parent":4403,"lines":4445,"value":4446},[830,830],"'CONNECT'",{"type":771,"name":4421,"path":4401,"parent":4403,"lines":4448,"value":4449},[1178,1178],"'PATCH'",{"type":787,"name":4404,"path":4401,"parent":3441,"description":4451,"lines":4452,"decorators":4453,"attributes":4454,"functions":4458,"mro":4460},"An HTTP Response.",[839,950],[1856],[4455,4456,4457],"unitelabs.bus.commands.http_command.HTTPResponse.status_code","unitelabs.bus.commands.http_command.HTTPResponse.headers","unitelabs.bus.commands.http_command.HTTPResponse.payload",[4459],"unitelabs.bus.commands.http_command.HTTPResponse.__init__",[4404],{"type":771,"name":4455,"path":4401,"parent":4404,"lines":4462,"value":940,"annotation":4463},[928,928],{"name":1120,"cls":796},{"type":771,"name":4456,"path":4401,"parent":4404,"lines":4465,"value":4466,"annotation":4467},[1317,1317],"dataclasses.field(default_factory=dict)",{"left":4468,"slice":4469},{"name":1424,"cls":796},{"elements":4470},[4471,4472],{"name":971,"cls":796},{"name":971,"cls":796},{"type":771,"name":4457,"path":4401,"parent":4404,"lines":4474,"value":940,"annotation":4475},[950,950],{"join":4476},[4477,940],{"name":887,"cls":796},{"type":877,"name":4459,"path":4401,"parent":4404,"lines":4479,"parameters":4480},[1940,1940],[4481,4482,4485,4493],{"name":931,"kind":885,"required":888},{"name":4483,"kind":885,"annotation":4484,"required":888},"status_code",{"name":1120,"cls":796},{"name":4486,"kind":885,"annotation":4487,"required":42},"headers",{"left":4488,"slice":4489},{"name":1424,"cls":796},{"elements":4490},[4491,4492],{"name":971,"cls":796},{"name":971,"cls":796},{"name":3495,"kind":885,"annotation":4494,"required":42,"default":940},{"join":4495},[4496,940],{"name":887,"cls":796},{"type":787,"name":756,"path":4401,"parent":3441,"description":4498,"lines":4499,"bases":4500,"attributes":4508,"functions":4516,"mro":4522},"An HTTP Request.",[951,1123],[4501],{"annotation":4502},{"left":4503,"slice":4504},{"name":754,"cls":796},{"elements":4505},[4506,4507],{"name":887,"cls":796},{"name":4404,"cls":796},[4509,4510,4511,4512,4513,4514,4515],"unitelabs.bus.commands.http_command.HTTPCommand.Method","unitelabs.bus.commands.http_command.HTTPCommand.host","unitelabs.bus.commands.http_command.HTTPCommand.path","unitelabs.bus.commands.http_command.HTTPCommand.method","unitelabs.bus.commands.http_command.HTTPCommand.headers","unitelabs.bus.commands.http_command.HTTPCommand.protocol_version","unitelabs.bus.commands.http_command.HTTPCommand.http_response",[4517,4518,4519,4520,4521],"unitelabs.bus.commands.http_command.HTTPCommand.__init__","unitelabs.bus.commands.http_command.HTTPCommand._serialize","unitelabs.bus.commands.http_command.HTTPCommand._validate_response","unitelabs.bus.commands.http_command.HTTPCommand._deserialize","unitelabs.bus.commands.http_command.HTTPCommand._parse_http_response",[756,754],{"type":771,"name":4509,"path":4401,"parent":756,"lines":4524,"value":4525,"annotation":4526},[1207,1207],"_Method",{"left":4527,"slice":4528},{"name":1393,"cls":796},{"name":4403,"cls":796},{"type":877,"name":4517,"path":4401,"parent":756,"lines":4530,"parameters":4531},[1218,1598],[4532,4533,4538,4544,4549,4554,4564,4569,4574],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":4534,"required":42,"default":940,"description":4537},{"join":4535},[4536,940],{"name":887,"cls":796},"The `body` of the request.",{"name":4539,"kind":885,"annotation":4540,"required":42,"default":940,"description":4543},"host",{"join":4541},[4542,940],{"name":971,"cls":796},"The host of the remote server.",{"name":4545,"kind":885,"annotation":4546,"required":42,"default":4547,"description":4548},"path",{"name":971,"cls":796},"'\u002F'","The path of the HTTP request.",{"name":4550,"kind":885,"annotation":4551,"required":42,"default":4552,"description":4553},"method",{"name":4403,"cls":796},{"name":4414,"cls":796},"The type of HTTP request.",{"name":4486,"kind":885,"annotation":4555,"required":42,"default":940,"description":4563},{"join":4556},[4557,940],{"left":4558,"slice":4559},{"name":1424,"cls":796},{"elements":4560},[4561,4562],{"name":971,"cls":796},{"name":971,"cls":796},"The headers of the HTTP request.",{"name":4565,"kind":885,"annotation":4566,"required":42,"default":4567,"description":4568},"protocol_version",{"name":1120,"cls":796},"11","The protocol version to use. Either 10 or 11.",{"name":1684,"kind":885,"annotation":4570,"required":42,"default":940,"description":4573},{"join":4571},[4572,940],{"name":1541,"cls":796},"How long in seconds to wait for a response.",{"name":3686,"kind":885,"annotation":4575,"required":42,"default":1053,"description":4576},{"name":1052,"cls":796},"Whether or not we should wait for a response at all.",{"type":771,"name":4510,"path":4401,"parent":756,"lines":4578,"value":4539},[1033,1033],{"type":771,"name":4511,"path":4401,"parent":756,"lines":4580,"value":4545},[983,983],{"type":771,"name":4512,"path":4401,"parent":756,"lines":4582,"value":4550},[1082,1082],{"type":771,"name":4513,"path":4401,"parent":756,"lines":4584,"value":4585},[989,989],"headers or {}",{"type":771,"name":4514,"path":4401,"parent":756,"lines":4587,"value":4565},[3005,3005],{"type":771,"name":4515,"path":4401,"parent":756,"lines":4589,"value":940,"annotation":4590},[1598,1598],{"join":4591},[4592,940],{"name":4404,"cls":796},{"type":877,"name":4518,"path":4401,"parent":756,"lines":4594,"parameters":4595,"returns":4599},[1604,996],[4596,4597],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":4598,"required":888},{"name":887,"cls":796},{"description":1118,"annotation":4600},{"name":887,"cls":796},{"type":877,"name":4519,"path":4401,"parent":756,"lines":4602,"parameters":4603,"returns":4607},[909,3010],[4604,4605],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":4606,"required":888},{"name":887,"cls":796},{"description":1118,"annotation":4608},{"name":1052,"cls":796},{"type":877,"name":4520,"path":4401,"parent":756,"lines":4610,"parameters":4612,"returns":4616},[4611,2785],93,[4613,4614],{"name":931,"kind":885,"required":888},{"name":1097,"kind":885,"annotation":4615,"required":888},{"name":887,"cls":796},{"description":1118,"annotation":4617},{"name":4404,"cls":796},{"type":877,"name":4521,"path":4401,"parent":756,"description":4619,"lines":4620,"parameters":4621,"returns":4626,"throws":4629},"Read and parse the given binary data into an `HTTPResponse`.",[2789,1123],[4622,4623],{"name":931,"kind":885,"required":888},{"name":1000,"kind":885,"annotation":4624,"required":888,"description":4625},{"name":887,"cls":796},"The binary data that contains an HTTP response message.",{"description":4627,"annotation":4628},"An `HTTPResponse` instance with its status code, headers and",{"name":4404,"cls":796},[4630],{"description":4631,"annotation":4632},"If the data stream does not yet contain the\ncomplete HTTP response method.",{"name":795,"cls":796},{"type":738,"name":3442,"path":4634,"parent":748,"classes":4635},"unitelabs\u002Fbus\u002Fcommands\u002Fbyte_command.py",[753],{"type":787,"name":753,"path":4634,"parent":3442,"description":4637,"lines":4638,"bases":4639,"functions":4647,"mro":4651},"The most basic form of a `Command`, which ingests and returns bytes.",[874,2151],[4640],{"annotation":4641},{"left":4642,"slice":4643},{"name":754,"cls":796},{"elements":4644},[4645,4646],{"name":887,"cls":796},{"name":887,"cls":796},[4648,4649,4650],"unitelabs.bus.commands.byte_command.ByteCommand.__init__","unitelabs.bus.commands.byte_command.ByteCommand._serialize","unitelabs.bus.commands.byte_command.ByteCommand._deserialize",[753,754],{"type":877,"name":4648,"path":4634,"parent":753,"lines":4653,"parameters":4654},[880,821],[4655,4656,4658,4662,4666],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":4657,"required":888},{"name":887,"cls":796},{"name":1684,"kind":885,"annotation":4659,"required":42,"default":940},{"join":4660},[4661,940],{"name":1541,"cls":796},{"name":3686,"kind":885,"annotation":4663,"required":42,"default":1053},{"join":4664},[4665,940],{"name":1052,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058},{"type":877,"name":4649,"path":4634,"parent":753,"lines":4668,"parameters":4669,"returns":4675},[773,829],[4670,4671],{"name":931,"kind":885,"required":888},{"name":3430,"kind":885,"annotation":4672,"required":42,"default":940},{"join":4673},[4674,940],{"name":887,"cls":796},{"description":1118,"annotation":4676},{"name":887,"cls":796},{"type":877,"name":4650,"path":4634,"parent":753,"lines":4678,"parameters":4679,"returns":4683},[1178,2151],[4680,4681],{"name":931,"kind":885,"required":888},{"name":1097,"kind":885,"annotation":4682,"required":888},{"name":887,"cls":796},{"description":1118,"annotation":4684},{"name":887,"cls":796},{"type":738,"name":3443,"path":4686,"parent":748,"classes":4687},"unitelabs\u002Fbus\u002Fcommands\u002Fresponse.py",[758],{"type":787,"name":758,"path":4686,"parent":3443,"description":4689,"lines":4690,"decorators":4691,"attributes":4692,"functions":4694,"mro":4698},"Protocols use `Response`s to specify data that is received from a transport.",[863,1854],[1856],[4693],"unitelabs.bus.commands.response.Response.request",[4695,4696,4697],"unitelabs.bus.commands.response.Response.__init__","unitelabs.bus.commands.response.Response.__post_init__","unitelabs.bus.commands.response.Response.__handle_done",[758],{"type":771,"name":4693,"path":4686,"parent":758,"lines":4700,"value":940,"annotation":4701},[1178,1178],{"name":757,"cls":796},{"type":877,"name":4696,"path":4686,"parent":758,"lines":4703,"parameters":4704},[838,950],[4705],{"name":931,"kind":885,"required":888},{"type":877,"name":4697,"path":4686,"parent":758,"description":4707,"lines":4708,"parameters":4709},"Set a callback to be run when the payload `Future` becomes done.",[1188,1854],[4710,4711],{"name":931,"kind":885,"required":888},{"name":4712,"kind":885,"annotation":4713,"required":888,"description":4717},"_payload",{"left":4714,"slice":4716},{"name":4715,"cls":796},"asyncio.Future",{"name":887,"cls":796},"The `Future` object.",{"type":877,"name":4695,"path":4686,"parent":758,"lines":4719,"parameters":4720},[1940,1940],[4721,4722],{"name":931,"kind":885,"required":888},{"name":884,"kind":885,"annotation":4723,"required":888},{"name":757,"cls":796},{"type":738,"name":749,"path":4725,"parent":739,"packages":4726,"attributes":4733,"classes":4735},"unitelabs\u002Fbus\u002Ffactories\u002F__init__.py",[4727,4728,4729,4730,4731,4732],"unitelabs.bus.factories.usb_factory","unitelabs.bus.factories.serial_factory","unitelabs.bus.factories.transport_factory","unitelabs.bus.factories.hid_factory","unitelabs.bus.factories.tcp_factory","unitelabs.bus.factories.udp_factory",[4734],"unitelabs.bus.factories.__all__",[764],{"type":771,"name":4734,"path":4725,"parent":749,"lines":4737,"value":4738},[863,1163],[764,776,777,778,779,780],{"type":738,"name":4727,"path":4740,"parent":749,"functions":4741},"unitelabs\u002Fbus\u002Ffactories\u002Fusb_factory.py",[780],{"type":877,"name":780,"path":4740,"parent":4727,"description":4743,"lines":4744,"parameters":4745,"returns":4759},"Create a USB connection with a device based on specified `vendor` and `product` IDs.",[880,969],[4746,4753,4755,4757],{"name":1258,"kind":1259,"annotation":4747,"required":888,"description":4752},{"left":4748,"slice":4749},{"name":1262,"cls":796},{"elements":4750},[1265,4751],{"name":1267,"cls":796},"A callable that returns an instance of the protocol to be used.",{"name":2794,"kind":1270,"annotation":4754,"required":888,"description":2796},{"name":1120,"cls":796},{"name":1984,"kind":1270,"annotation":4756,"required":888,"description":2799},{"name":1120,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4758},"Additional keyword arguments to be passed to the `UsbTransport` constructor.",{"description":4760,"annotation":4761},"A tuple containing the `UsbTransport` instance and the protocol instance.",{"left":4762,"slice":4763},{"name":1210,"cls":796},{"elements":4764},[4765,4766],{"name":768,"cls":796},{"name":1267,"cls":796},{"type":738,"name":4728,"path":4768,"parent":749,"functions":4769},"unitelabs\u002Fbus\u002Ffactories\u002Fserial_factory.py",[777],{"type":877,"name":777,"path":4768,"parent":4728,"description":4771,"lines":4772,"parameters":4773,"returns":4797},"Create a serial connection with the specified port.",[880,1207],[4774,4781,4784,4786,4789,4792,4795],{"name":1258,"kind":1259,"annotation":4775,"required":888,"description":4780},{"left":4776,"slice":4777},{"name":1262,"cls":796},{"elements":4778},[1265,4779],{"name":1267,"cls":796},"A callable that returns an instance of the `Protocol` to be used.",{"name":2427,"kind":1270,"annotation":4782,"required":888,"description":4783},{"name":971,"cls":796},"The port of the serial device.",{"name":2431,"kind":1270,"annotation":4785,"required":42,"default":2433,"description":2434},{"name":1120,"cls":796},{"name":2436,"kind":1270,"annotation":4787,"required":42,"default":4788,"description":2318},{"name":2306,"cls":796},{"name":2328,"cls":796},{"name":2440,"kind":1270,"annotation":4790,"required":42,"default":4791,"description":2343},{"name":2307,"cls":796},{"name":2351,"cls":796},{"name":2444,"kind":1270,"annotation":4793,"required":42,"default":4794,"description":2373},{"name":2308,"cls":796},{"name":2381,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4796},"Additional keyword arguments to be passed to the `SerialTransport` constructor.",{"description":4798,"annotation":4799},"A tuple containing the `SerialTransport` instance and the `Protocol` instance.",{"left":4800,"slice":4801},{"name":1210,"cls":796},{"elements":4802},[4803,4804],{"name":767,"cls":796},{"name":1267,"cls":796},{"type":738,"name":4729,"path":4806,"parent":749,"attributes":4807,"classes":4808},"unitelabs\u002Fbus\u002Ffactories\u002Ftransport_factory.py",[1267],[764],{"type":771,"name":1267,"path":4806,"parent":4729,"lines":4810,"value":4811},[874,874],"typing.TypeVar('P', bound=(asyncio.Protocol), covariant=True)",{"type":787,"name":764,"path":4806,"parent":4729,"description":4813,"lines":4814,"bases":4815,"functions":4818,"mro":4820},"Interface representing a factory for creating transports.",[880,1178],[4816],{"annotation":4817},{"name":3539,"cls":796},[4819],"unitelabs.bus.factories.transport_factory.TransportFactory.__call__",[764],{"type":877,"name":4819,"path":4806,"parent":764,"lines":4822,"parameters":4823,"returns":4832},[1178,1178],[4824,4825,4831],{"name":931,"kind":1259,"required":888},{"name":1258,"kind":1259,"annotation":4826,"required":888},{"left":4827,"slice":4828},{"name":1262,"cls":796},{"elements":4829},[1265,4830],{"name":1267,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058},{"description":1118,"annotation":4833},{"left":4834,"slice":4835},{"name":1210,"cls":796},{"elements":4836},[4837,4838],{"name":1565,"cls":796},{"name":1267,"cls":796},{"type":738,"name":4730,"path":4840,"parent":749,"functions":4841},"unitelabs\u002Fbus\u002Ffactories\u002Fhid_factory.py",[776],{"type":877,"name":776,"path":4840,"parent":4730,"description":4843,"lines":4844,"parameters":4845,"returns":4860},"Create a HID connection with a device based on specified `vendor` and `product` IDs.",[880,969],[4846,4852,4855,4858],{"name":1258,"kind":1259,"annotation":4847,"required":888,"description":4752},{"left":4848,"slice":4849},{"name":1262,"cls":796},{"elements":4850},[1265,4851],{"name":1267,"cls":796},{"name":2794,"kind":1270,"annotation":4853,"required":888,"description":4854},{"name":1120,"cls":796},"The vendor ID of the HID device.",{"name":1984,"kind":1270,"annotation":4856,"required":888,"description":4857},{"name":1120,"cls":796},"The product ID of the HID device.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":4859},"Additional keyword arguments to be passed to the `HIDTransport` constructor.",{"description":4861,"annotation":4862},"A tuple containing the `HIDTransport` instance and the protocol instance.",{"left":4863,"slice":4864},{"name":1210,"cls":796},{"elements":4865},[4866,4867],{"name":766,"cls":796},{"name":1267,"cls":796},{"type":738,"name":4731,"path":4869,"parent":749,"functions":4870},"unitelabs\u002Fbus\u002Ffactories\u002Ftcp_factory.py",[778],{"type":877,"name":778,"path":4869,"parent":4731,"description":4872,"lines":4873,"parameters":4874,"returns":4899},"Create and open a streaming TCP connection to a given address specified by host and port.",[863,1077],[4875,4882,4885,4889,4897],{"name":1258,"kind":1259,"annotation":4876,"required":888,"description":4881},{"left":4877,"slice":4878},{"name":1262,"cls":796},{"elements":4879},[1265,4880],{"name":1267,"cls":796},"A callable that returns an instance if the `Protocol` to be used.",{"name":4539,"kind":1270,"annotation":4883,"required":42,"default":4884,"description":4543},{"name":971,"cls":796},"'localhost'",{"name":2427,"kind":1270,"annotation":4886,"required":42,"default":4887,"description":4888},{"name":1120,"cls":796},"80","The port number of the remote server.",{"name":4890,"kind":1270,"annotation":4891,"required":42,"default":940,"description":4896},"verify",{"join":4892},[940,4893,4894],{"name":1052,"cls":796},{"name":4895,"cls":796},"ssl.SSLContext","Either `True` to use an SSL context with the default CA bundle, `False` to\ndisable verification, or an instance of `ssl.SSLContext` to use a custom context.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":4898},"Additional keyword arguments passed to `loop.create_connection`.",{"description":4900,"annotation":4901},"A tuple containing the transport and protocol.",{"left":4902,"slice":4903},{"name":1210,"cls":796},{"elements":4904},[4905,4906],{"name":1565,"cls":796},{"name":1267,"cls":796},{"type":738,"name":4732,"path":4908,"parent":749,"functions":4909},"unitelabs\u002Fbus\u002Ffactories\u002Fudp_factory.py",[779],{"type":877,"name":779,"path":4908,"parent":4732,"description":4911,"lines":4912,"parameters":4913,"returns":4939},"Create a UDP connection with the specified server (sender) and client (receiver) addresses.",[863,2968],[4914,4920,4924,4929,4933,4937],{"name":1258,"kind":1259,"annotation":4915,"required":888,"description":4780},{"left":4916,"slice":4917},{"name":1262,"cls":796},{"elements":4918},[1265,4919],{"name":1267,"cls":796},{"name":4921,"kind":1270,"annotation":4922,"required":42,"default":2717,"description":4923},"server_port",{"name":1120,"cls":796},"The port of the UDP server.",{"name":4925,"kind":1270,"annotation":4926,"required":42,"default":4927,"description":4928},"server_host",{"name":971,"cls":796},"''","The IP address of the UDP server.",{"name":4930,"kind":1270,"annotation":4931,"required":42,"default":2717,"description":4932},"client_port",{"name":1120,"cls":796},"The desired port of the client.",{"name":4934,"kind":1270,"annotation":4935,"required":42,"default":4927,"description":4936},"client_host",{"name":971,"cls":796},"The desired IP address of the client.",{"name":1056,"kind":1057,"required":42,"default":1058,"description":4938},"Additional keyword arguments to be passed to the `UDPTransport` constructor.",{"description":4940,"annotation":4941},"A tuple containing the `UDPTransport` instance and the `Protocol` instance.",{"left":4942,"slice":4943},{"name":1210,"cls":796},{"elements":4944},[4945,4946],{"name":1565,"cls":796},{"name":1267,"cls":796},{"type":787,"name":753,"path":4634,"parent":3442,"description":4637,"lines":4948,"bases":4949,"functions":4957,"mro":4958},[874,2151],[4950],{"annotation":4951},{"left":4952,"slice":4953},{"name":754,"cls":796},{"elements":4954},[4955,4956],{"name":887,"cls":796},{"name":887,"cls":796},[4648,4649,4650],[753,754],{"type":787,"name":754,"path":3504,"parent":3438,"description":3626,"lines":4960,"bases":4961,"attributes":4970,"functions":4971,"mro":4972},[3396,3628],[4962],{"annotation":4963},{"left":4964,"slice":4965},{"name":3319,"cls":796},{"elements":4966},[4967,4968,4969],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":1814,"cls":796},[3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649],[3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665],[754],{"type":787,"name":755,"path":3924,"parent":3439,"description":3947,"lines":4974,"bases":4975,"attributes":4984,"functions":4985,"examples":4986,"mro":4990},[2171,3949],[4976],{"annotation":4977},{"left":4978,"slice":4979},{"name":3319,"cls":796},{"elements":4980},[4981,4982,4983],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":3928,"cls":796},[3960,3961,3962,3963,3964,3965,3966,3967,3968],[3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980],[4987,4988,4989],{"description":3983,"code":3984},{"description":3986,"code":3987},{"description":3989,"code":3990},[755],{"type":787,"name":760,"path":782,"parent":743,"description":808,"lines":4992,"bases":4993,"mro":4996},[810,811],[4994],{"annotation":4995},{"name":815,"cls":796},[760],{"type":787,"name":761,"path":782,"parent":743,"description":799,"lines":4998,"bases":4999,"mro":5002},[801,802],[5000],{"annotation":5001},{"name":762,"cls":796},[761,762],{"type":787,"name":766,"path":2907,"parent":2300,"description":2917,"lines":5004,"bases":5005,"attributes":5008,"functions":5009,"mro":5010},[773,2919],[5006],{"annotation":5007},{"name":1013,"cls":796},[2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936],[2938,2939,2940,2941,2942,2943,2944,2945,2946,2947],[766,1013,1028,1029,1030],{"type":787,"name":756,"path":4401,"parent":3441,"description":4498,"lines":5012,"bases":5013,"attributes":5021,"functions":5022,"mro":5023},[951,1123],[5014],{"annotation":5015},{"left":5016,"slice":5017},{"name":754,"cls":796},{"elements":5018},[5019,5020],{"name":887,"cls":796},{"name":4404,"cls":796},[4509,4510,4511,4512,4513,4514,4515],[4517,4518,4519,4520,4521],[756,754],{"type":787,"name":762,"path":782,"parent":743,"description":788,"lines":5025,"bases":5026,"mro":5029},[790,791],[5027],{"annotation":5028},{"name":795,"cls":796},[762],{"type":787,"name":763,"path":782,"parent":743,"description":827,"lines":5031,"bases":5032,"mro":5035},[829,830],[5033],{"annotation":5034},{"name":815,"cls":796},[763],{"type":787,"name":765,"path":1466,"parent":1457,"description":1482,"lines":5037,"bases":5038,"attributes":5041,"functions":5042,"mro":5043},[1178,1484],[5039],{"annotation":5040},{"name":1488,"cls":796},[1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506],[1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522],[765],{"type":787,"name":757,"path":3465,"parent":3437,"description":3468,"lines":5045,"decorators":5046,"attributes":5047,"functions":5048,"mro":5049},[880,881],[1856],[3472,3473],[3475,3476],[757],{"type":787,"name":758,"path":4686,"parent":3443,"description":4689,"lines":5051,"decorators":5052,"attributes":5053,"functions":5054,"mro":5055},[863,1854],[1856],[4693],[4695,4696,4697],[758],{"type":787,"name":759,"path":4320,"parent":3440,"description":4323,"lines":5057,"bases":5058,"attributes":5066,"functions":5067,"mro":5068},[874,975],[5059],{"annotation":5060},{"left":5061,"slice":5062},{"name":754,"cls":796},{"elements":5063},[5064,5065],{"name":971,"cls":796},{"name":971,"cls":796},[4334,4335,4336],[4338,4339,4340,4341],[759,754],{"type":787,"name":769,"path":1848,"parent":1837,"description":2069,"lines":5070,"bases":5071,"attributes":5074,"functions":5075,"mro":5076},[1404,2071],[5072],{"annotation":5073},{"name":1850,"cls":796},[2076],[2078,2079,2080,2081],[769,1850],{"type":787,"name":767,"path":2313,"parent":2296,"description":2397,"lines":5078,"bases":5079,"attributes":5082,"functions":5083,"mro":5084},[975,2399],[5080],{"annotation":5081},{"name":1013,"cls":796},[2404,2405,2406],[2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418],[767,1013,1028,1029,1030],{"type":787,"name":764,"path":4806,"parent":4729,"description":4813,"lines":5086,"bases":5087,"functions":5090,"mro":5091},[880,1178],[5088],{"annotation":5089},{"name":3539,"cls":796},[4819],[764],{"type":787,"name":768,"path":2703,"parent":2299,"description":2753,"lines":5093,"bases":5094,"attributes":5097,"functions":5098,"mro":5099},[990,2755],[5095],{"annotation":5096},{"name":1013,"cls":796},[2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770],[2772,2773,2774,2775,2776,2777,2778,2779,2780,2781],[768,1013,1028,1029,1030],{"type":877,"name":776,"path":4840,"parent":4730,"description":4843,"lines":5101,"parameters":5102,"returns":5114},[880,969],[5103,5109,5111,5113],{"name":1258,"kind":1259,"annotation":5104,"required":888,"description":4752},{"left":5105,"slice":5106},{"name":1262,"cls":796},{"elements":5107},[1265,5108],{"name":1267,"cls":796},{"name":2794,"kind":1270,"annotation":5110,"required":888,"description":4854},{"name":1120,"cls":796},{"name":1984,"kind":1270,"annotation":5112,"required":888,"description":4857},{"name":1120,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4859},{"description":4861,"annotation":5115},{"left":5116,"slice":5117},{"name":1210,"cls":796},{"elements":5118},[5119,5120],{"name":766,"cls":796},{"name":1267,"cls":796},{"type":877,"name":777,"path":4768,"parent":4728,"description":4771,"lines":5122,"parameters":5123,"returns":5144},[880,1207],[5124,5130,5132,5134,5137,5140,5143],{"name":1258,"kind":1259,"annotation":5125,"required":888,"description":4780},{"left":5126,"slice":5127},{"name":1262,"cls":796},{"elements":5128},[1265,5129],{"name":1267,"cls":796},{"name":2427,"kind":1270,"annotation":5131,"required":888,"description":4783},{"name":971,"cls":796},{"name":2431,"kind":1270,"annotation":5133,"required":42,"default":2433,"description":2434},{"name":1120,"cls":796},{"name":2436,"kind":1270,"annotation":5135,"required":42,"default":5136,"description":2318},{"name":2306,"cls":796},{"name":2328,"cls":796},{"name":2440,"kind":1270,"annotation":5138,"required":42,"default":5139,"description":2343},{"name":2307,"cls":796},{"name":2351,"cls":796},{"name":2444,"kind":1270,"annotation":5141,"required":42,"default":5142,"description":2373},{"name":2308,"cls":796},{"name":2381,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4796},{"description":4798,"annotation":5145},{"left":5146,"slice":5147},{"name":1210,"cls":796},{"elements":5148},[5149,5150],{"name":767,"cls":796},{"name":1267,"cls":796},{"type":877,"name":778,"path":4869,"parent":4731,"description":4872,"lines":5152,"parameters":5153,"returns":5170},[863,1077],[5154,5160,5162,5164,5169],{"name":1258,"kind":1259,"annotation":5155,"required":888,"description":4881},{"left":5156,"slice":5157},{"name":1262,"cls":796},{"elements":5158},[1265,5159],{"name":1267,"cls":796},{"name":4539,"kind":1270,"annotation":5161,"required":42,"default":4884,"description":4543},{"name":971,"cls":796},{"name":2427,"kind":1270,"annotation":5163,"required":42,"default":4887,"description":4888},{"name":1120,"cls":796},{"name":4890,"kind":1270,"annotation":5165,"required":42,"default":940,"description":4896},{"join":5166},[940,5167,5168],{"name":1052,"cls":796},{"name":4895,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4898},{"description":4900,"annotation":5171},{"left":5172,"slice":5173},{"name":1210,"cls":796},{"elements":5174},[5175,5176],{"name":1565,"cls":796},{"name":1267,"cls":796},{"type":877,"name":779,"path":4908,"parent":4732,"description":4911,"lines":5178,"parameters":5179,"returns":5195},[863,2968],[5180,5186,5188,5190,5192,5194],{"name":1258,"kind":1259,"annotation":5181,"required":888,"description":4780},{"left":5182,"slice":5183},{"name":1262,"cls":796},{"elements":5184},[1265,5185],{"name":1267,"cls":796},{"name":4921,"kind":1270,"annotation":5187,"required":42,"default":2717,"description":4923},{"name":1120,"cls":796},{"name":4925,"kind":1270,"annotation":5189,"required":42,"default":4927,"description":4928},{"name":971,"cls":796},{"name":4930,"kind":1270,"annotation":5191,"required":42,"default":2717,"description":4932},{"name":1120,"cls":796},{"name":4934,"kind":1270,"annotation":5193,"required":42,"default":4927,"description":4936},{"name":971,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4938},{"description":4940,"annotation":5196},{"left":5197,"slice":5198},{"name":1210,"cls":796},{"elements":5199},[5200,5201],{"name":1565,"cls":796},{"name":1267,"cls":796},{"type":877,"name":780,"path":4740,"parent":4727,"description":4743,"lines":5203,"parameters":5204,"returns":5216},[880,969],[5205,5211,5213,5215],{"name":1258,"kind":1259,"annotation":5206,"required":888,"description":4752},{"left":5207,"slice":5208},{"name":1262,"cls":796},{"elements":5209},[1265,5210],{"name":1267,"cls":796},{"name":2794,"kind":1270,"annotation":5212,"required":888,"description":2796},{"name":1120,"cls":796},{"name":1984,"kind":1270,"annotation":5214,"required":888,"description":2799},{"name":1120,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4758},{"description":4760,"annotation":5217},{"left":5218,"slice":5219},{"name":1210,"cls":796},{"elements":5220},[5221,5222],{"name":768,"cls":796},{"name":1267,"cls":796},{"type":787,"name":857,"path":1287,"parent":852,"description":1290,"lines":5224,"bases":5225,"attributes":5228,"functions":5229,"mro":5230},[810,983],[5226],{"annotation":5227},{"name":1295,"cls":796},[1297,1298],[1300,1301],[857],{"type":787,"name":858,"path":1003,"parent":849,"description":1006,"lines":5232,"bases":5233,"attributes":5236,"functions":5237,"mro":5238},[1008,1009],[5234],{"annotation":5235},{"name":1013,"cls":796},[1015,1016,1017,1018,1019,1020],[1022,1023,1024,1025,1026],[858,1013,1028,1029,1030],{"type":787,"name":859,"path":904,"parent":848,"description":907,"lines":5240,"bases":5241,"attributes":5244,"functions":5245,"mro":5246},[811,909],[5242],{"annotation":5243},{"name":857,"cls":796},[914,915,916],[918,919,920,921,922,923,924],[859,857],{"type":771,"name":865,"path":869,"parent":847,"lines":5248,"value":875},[874,874],{"type":787,"name":860,"path":1131,"parent":850,"description":1139,"lines":5250,"bases":5251,"attributes":5254,"functions":5255,"mro":5256},[1008,1141],[5252],{"annotation":5253},{"name":857,"cls":796},[1146,1147,1148,1149,1150,1151],[1153,1154,1155,1156,1157,1158,1159],[860,857],{"type":877,"name":866,"path":1251,"parent":851,"description":1254,"lines":5258,"parameters":5259,"returns":5273},[863,1188],[5260,5266,5272],{"name":1258,"kind":1259,"annotation":5261,"required":888,"description":1268},{"left":5262,"slice":5263},{"name":1262,"cls":796},{"elements":5264},[1265,5265],{"name":1267,"cls":796},{"name":933,"kind":1270,"annotation":5267,"required":42,"default":940,"description":1276},{"join":5268},[5269,940],{"left":5270,"slice":5271},{"name":938,"cls":796},{"name":865,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058},{"description":1279,"annotation":5274},{"left":5275,"slice":5276},{"name":1210,"cls":796},{"elements":5277},[5278,5279],{"name":858,"cls":796},{"name":1267,"cls":796},{"type":877,"name":867,"path":869,"parent":847,"description":878,"lines":5281,"parameters":5282,"returns":5292},[880,881],[5283,5285],{"name":884,"kind":885,"annotation":5284,"required":888,"description":889},{"name":887,"cls":796},{"name":891,"kind":885,"annotation":5286,"required":888,"description":899},{"join":5287},[5288,5289],{"name":887,"cls":796},{"left":5290,"slice":5291},{"name":897,"cls":796},{"name":887,"cls":796},{"description":901,"annotation":5293},{"name":865,"cls":796},{"type":787,"name":765,"path":1466,"parent":1457,"description":1482,"lines":5295,"bases":5296,"attributes":5299,"functions":5300,"mro":5301},[1178,1484],[5297],{"annotation":5298},{"name":1488,"cls":796},[1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506],[1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522],[765],{"type":787,"name":1617,"path":2145,"parent":1838,"description":2169,"lines":5303,"attributes":5304,"functions":5305,"mro":5306},[2171,2172],[2174,2175,2176,2177,2178,2179,2180,2181,2182,2183],[2185,2186,2187,2188,2189,2190],[1617],{"type":787,"name":1843,"path":1848,"parent":1837,"description":1852,"lines":5308,"decorators":5309,"attributes":5310,"functions":5311,"mro":5312},[863,1854],[1856],[1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868],[1870,1871,1872],[1843],{"type":787,"name":769,"path":1848,"parent":1837,"description":2069,"lines":5314,"bases":5315,"attributes":5318,"functions":5319,"mro":5320},[1404,2071],[5316],{"annotation":5317},{"name":1850,"cls":796},[2076],[2078,2079,2080,2081],[769,1850],{"type":787,"name":1030,"path":3302,"parent":2302,"description":3310,"lines":5322,"bases":5323,"attributes":5330,"functions":5331,"mro":5332},[880,3189],[5324,5326],{"annotation":5325},{"name":3315,"cls":796},{"annotation":5327},{"left":5328,"slice":5329},{"name":3319,"cls":796},{"name":3304,"cls":796},[3322,3323,3324],[3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336],[1030],{"type":787,"name":2306,"path":2313,"parent":2296,"description":2318,"lines":5334,"bases":5335,"attributes":5338,"mro":5339},[1008,830],[5336],{"annotation":5337},{"name":2323,"cls":796},[2325,2326,2327,2328],[2306],{"type":787,"name":766,"path":2907,"parent":2300,"description":2917,"lines":5341,"bases":5342,"attributes":5345,"functions":5346,"mro":5347},[773,2919],[5343],{"annotation":5344},{"name":1013,"cls":796},[2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936],[2938,2939,2940,2941,2942,2943,2944,2945,2946,2947],[766,1013,1028,1029,1030],{"type":787,"name":2307,"path":2313,"parent":2296,"description":2343,"lines":5349,"bases":5350,"attributes":5355,"mro":5356},[838,950],[5351,5353],{"annotation":5352},{"name":971,"cls":796},{"annotation":5354},{"name":2155,"cls":796},[2351,2352,2353,2354,2355],[2307],{"type":787,"name":1028,"path":2522,"parent":2297,"description":2525,"lines":5358,"bases":5359,"attributes":5364,"functions":5365,"mro":5366},[880,1123],[5360,5362],{"annotation":5361},{"name":1030,"cls":796},{"annotation":5363},{"name":2532,"cls":796},[2534],[2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548],[1028,1030],{"type":787,"name":767,"path":2313,"parent":2296,"description":2397,"lines":5368,"bases":5369,"attributes":5372,"functions":5373,"mro":5374},[975,2399],[5370],{"annotation":5371},{"name":1013,"cls":796},[2404,2405,2406],[2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418],[767,1013,1028,1029,1030],{"type":787,"name":2308,"path":2313,"parent":2296,"description":2373,"lines":5376,"bases":5377,"attributes":5382,"mro":5383},[951,1197],[5378,5380],{"annotation":5379},{"name":1541,"cls":796},{"annotation":5381},{"name":2155,"cls":796},[2381,2382,2383],[2308],{"type":787,"name":1013,"path":2640,"parent":2298,"description":2643,"lines":5385,"bases":5386,"functions":5393,"mro":5394},[880,1197],[5387,5389,5391],{"annotation":5388},{"name":1565,"cls":796},{"annotation":5390},{"name":1028,"cls":796},{"annotation":5392},{"name":1029,"cls":796},[2653,2654,2655,2656,2657,2658,2659,2660],[1013,1028,1029,1030],{"type":787,"name":768,"path":2703,"parent":2299,"description":2753,"lines":5396,"bases":5397,"attributes":5400,"functions":5401,"mro":5402},[990,2755],[5398],{"annotation":5399},{"name":1013,"cls":796},[2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770],[2772,2773,2774,2775,2776,2777,2778,2779,2780,2781],[768,1013,1028,1029,1030],{"type":787,"name":1029,"path":3054,"parent":2301,"description":3067,"lines":5404,"bases":5405,"attributes":5410,"functions":5411,"mro":5412},[1163,3069],[5406,5408],{"annotation":5407},{"name":1030,"cls":796},{"annotation":5409},{"name":3075,"cls":796},[3077,3078,3079,3080],[3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100],[1029,1030],{"type":787,"name":753,"path":4634,"parent":3442,"description":4637,"lines":5414,"bases":5415,"functions":5423,"mro":5424},[874,2151],[5416],{"annotation":5417},{"left":5418,"slice":5419},{"name":754,"cls":796},{"elements":5420},[5421,5422],{"name":887,"cls":796},{"name":887,"cls":796},[4648,4649,4650],[753,754],{"type":787,"name":754,"path":3504,"parent":3438,"description":3626,"lines":5426,"bases":5427,"attributes":5436,"functions":5437,"mro":5438},[3396,3628],[5428],{"annotation":5429},{"left":5430,"slice":5431},{"name":3319,"cls":796},{"elements":5432},[5433,5434,5435],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":1814,"cls":796},[3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649],[3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665],[754],{"type":787,"name":755,"path":3924,"parent":3439,"description":3947,"lines":5440,"bases":5441,"attributes":5450,"functions":5451,"examples":5452,"mro":5456},[2171,3949],[5442],{"annotation":5443},{"left":5444,"slice":5445},{"name":3319,"cls":796},{"elements":5446},[5447,5448,5449],{"name":1810,"cls":796},{"name":1812,"cls":796},{"name":3928,"cls":796},[3960,3961,3962,3963,3964,3965,3966,3967,3968],[3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980],[5453,5454,5455],{"description":3983,"code":3984},{"description":3986,"code":3987},{"description":3989,"code":3990},[755],{"type":787,"name":756,"path":4401,"parent":3441,"description":4498,"lines":5458,"bases":5459,"attributes":5467,"functions":5468,"mro":5469},[951,1123],[5460],{"annotation":5461},{"left":5462,"slice":5463},{"name":754,"cls":796},{"elements":5464},[5465,5466],{"name":887,"cls":796},{"name":4404,"cls":796},[4509,4510,4511,4512,4513,4514,4515],[4517,4518,4519,4520,4521],[756,754],{"type":771,"name":1810,"path":3504,"parent":3438,"lines":5471,"value":3516},[820,820],{"type":771,"name":1812,"path":3504,"parent":3438,"lines":5473,"value":3519},[821,821],{"type":787,"name":757,"path":3465,"parent":3437,"description":3468,"lines":5475,"decorators":5476,"attributes":5477,"functions":5478,"mro":5479},[880,881],[1856],[3472,3473],[3475,3476],[757],{"type":771,"name":1814,"path":3504,"parent":3438,"lines":5481,"value":3522},[1163,1163],{"type":787,"name":758,"path":4686,"parent":3443,"description":4689,"lines":5483,"decorators":5484,"attributes":5485,"functions":5486,"mro":5487},[863,1854],[1856],[4693],[4695,4696,4697],[758],{"type":787,"name":759,"path":4320,"parent":3440,"description":4323,"lines":5489,"bases":5490,"attributes":5498,"functions":5499,"mro":5500},[874,975],[5491],{"annotation":5492},{"left":5493,"slice":5494},{"name":754,"cls":796},{"elements":5495},[5496,5497],{"name":971,"cls":796},{"name":971,"cls":796},[4334,4335,4336],[4338,4339,4340,4341],[759,754],{"type":787,"name":764,"path":4806,"parent":4729,"description":4813,"lines":5502,"bases":5503,"functions":5506,"mro":5507},[880,1178],[5504],{"annotation":5505},{"name":3539,"cls":796},[4819],[764],{"type":877,"name":776,"path":4840,"parent":4730,"description":4843,"lines":5509,"parameters":5510,"returns":5522},[880,969],[5511,5517,5519,5521],{"name":1258,"kind":1259,"annotation":5512,"required":888,"description":4752},{"left":5513,"slice":5514},{"name":1262,"cls":796},{"elements":5515},[1265,5516],{"name":1267,"cls":796},{"name":2794,"kind":1270,"annotation":5518,"required":888,"description":4854},{"name":1120,"cls":796},{"name":1984,"kind":1270,"annotation":5520,"required":888,"description":4857},{"name":1120,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4859},{"description":4861,"annotation":5523},{"left":5524,"slice":5525},{"name":1210,"cls":796},{"elements":5526},[5527,5528],{"name":766,"cls":796},{"name":1267,"cls":796},{"type":877,"name":777,"path":4768,"parent":4728,"description":4771,"lines":5530,"parameters":5531,"returns":5552},[880,1207],[5532,5538,5540,5542,5545,5548,5551],{"name":1258,"kind":1259,"annotation":5533,"required":888,"description":4780},{"left":5534,"slice":5535},{"name":1262,"cls":796},{"elements":5536},[1265,5537],{"name":1267,"cls":796},{"name":2427,"kind":1270,"annotation":5539,"required":888,"description":4783},{"name":971,"cls":796},{"name":2431,"kind":1270,"annotation":5541,"required":42,"default":2433,"description":2434},{"name":1120,"cls":796},{"name":2436,"kind":1270,"annotation":5543,"required":42,"default":5544,"description":2318},{"name":2306,"cls":796},{"name":2328,"cls":796},{"name":2440,"kind":1270,"annotation":5546,"required":42,"default":5547,"description":2343},{"name":2307,"cls":796},{"name":2351,"cls":796},{"name":2444,"kind":1270,"annotation":5549,"required":42,"default":5550,"description":2373},{"name":2308,"cls":796},{"name":2381,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4796},{"description":4798,"annotation":5553},{"left":5554,"slice":5555},{"name":1210,"cls":796},{"elements":5556},[5557,5558],{"name":767,"cls":796},{"name":1267,"cls":796},{"type":877,"name":778,"path":4869,"parent":4731,"description":4872,"lines":5560,"parameters":5561,"returns":5578},[863,1077],[5562,5568,5570,5572,5577],{"name":1258,"kind":1259,"annotation":5563,"required":888,"description":4881},{"left":5564,"slice":5565},{"name":1262,"cls":796},{"elements":5566},[1265,5567],{"name":1267,"cls":796},{"name":4539,"kind":1270,"annotation":5569,"required":42,"default":4884,"description":4543},{"name":971,"cls":796},{"name":2427,"kind":1270,"annotation":5571,"required":42,"default":4887,"description":4888},{"name":1120,"cls":796},{"name":4890,"kind":1270,"annotation":5573,"required":42,"default":940,"description":4896},{"join":5574},[940,5575,5576],{"name":1052,"cls":796},{"name":4895,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4898},{"description":4900,"annotation":5579},{"left":5580,"slice":5581},{"name":1210,"cls":796},{"elements":5582},[5583,5584],{"name":1565,"cls":796},{"name":1267,"cls":796},{"type":877,"name":779,"path":4908,"parent":4732,"description":4911,"lines":5586,"parameters":5587,"returns":5603},[863,2968],[5588,5594,5596,5598,5600,5602],{"name":1258,"kind":1259,"annotation":5589,"required":888,"description":4780},{"left":5590,"slice":5591},{"name":1262,"cls":796},{"elements":5592},[1265,5593],{"name":1267,"cls":796},{"name":4921,"kind":1270,"annotation":5595,"required":42,"default":2717,"description":4923},{"name":1120,"cls":796},{"name":4925,"kind":1270,"annotation":5597,"required":42,"default":4927,"description":4928},{"name":971,"cls":796},{"name":4930,"kind":1270,"annotation":5599,"required":42,"default":2717,"description":4932},{"name":1120,"cls":796},{"name":4934,"kind":1270,"annotation":5601,"required":42,"default":4927,"description":4936},{"name":971,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4938},{"description":4940,"annotation":5604},{"left":5605,"slice":5606},{"name":1210,"cls":796},{"elements":5607},[5608,5609],{"name":1565,"cls":796},{"name":1267,"cls":796},{"type":877,"name":780,"path":4740,"parent":4727,"description":4743,"lines":5611,"parameters":5612,"returns":5624},[880,969],[5613,5619,5621,5623],{"name":1258,"kind":1259,"annotation":5614,"required":888,"description":4752},{"left":5615,"slice":5616},{"name":1262,"cls":796},{"elements":5617},[1265,5618],{"name":1267,"cls":796},{"name":2794,"kind":1270,"annotation":5620,"required":888,"description":2796},{"name":1120,"cls":796},{"name":1984,"kind":1270,"annotation":5622,"required":888,"description":2799},{"name":1120,"cls":796},{"name":1056,"kind":1057,"required":42,"default":1058,"description":4758},{"description":4760,"annotation":5625},{"left":5626,"slice":5627},{"name":1210,"cls":796},{"elements":5628},[5629,5630],{"name":768,"cls":796},{"name":1267,"cls":796},"unitelabs-bus","# GLab\n\n![GLab](docs\u002Fsource\u002Fimg\u002Fglab-logo.png)\n\nGLab is an open source GitLab CLI tool. It brings GitLab to your terminal, next to where you are already working with `git` and your code, without switching between windows and browser tabs. While it's powerful for issues and merge requests, `glab` does even more:\n\n- View, manage, and retry CI\u002FCD pipelines directly from your CLI.\n- Create changelogs.\n- Create and manage releases.\n- Ask GitLab Duo Chat questions about Git.\n- Manage GitLab agents for Kubernetes.\n\n`glab` is available for repositories hosted on GitLab.com, GitLab Dedicated, and GitLab Self-Managed. It supports multiple authenticated GitLab instances, and automatically detects the authenticated hostname from the remotes available in your working Git directory.\n\n![command example](docs\u002Fsource\u002Fimg\u002Fglabgettingstarted.gif)\n\n## Table of contents\n\n- [Requirements](#requirements)\n- [Usage](#usage)\n  - [Core commands](#core-commands)\n  - [GitLab Duo for the CLI](#gitlab-duo-for-the-cli)\n- [Demo](#demo)\n- [Documentation](#documentation)\n- [Installation](#installation)\n  - [Homebrew](#homebrew)\n  - [Other installation methods](#other-installation-methods)\n  - [Building from source](#building-from-source)\n    - [Prerequisites for building from source](#prerequisites-for-building-from-source)\n- [Authentication](#authentication)\n  - [OAuth (GitLab.com)](#oauth-gitlabcom)\n  - [OAuth (GitLab Self-Managed, GitLab Dedicated)](#oauth-gitlab-self-managed-gitlab-dedicated)\n  - [Personal access token](#personal-access-token)\n  - [CI Job Token](#ci-job-token)\n- [Configuration](#configuration)\n  - [Configure `glab` to use your GitLab Self-Managed or GitLab Dedicated instance](#configure-glab-to-use-your-gitlab-self-managed-or-gitlab-dedicated-instance)\n  - [Configure `glab` to use mTLS certificates](#configure-glab-to-use-mtls-certificates)\n  - [Configure `glab` to use self-signed certificates](#configure-glab-to-use-self-signed-certificates)\n- [Environment variables](#environment-variables)\n  - [GitLab access variables](#gitlab-access-variables)\n  - [`glab` configuration variables](#glab-configuration-variables)\n  - [Other variables](#other-variables)\n  - [Token and environment variable precedence](#token-and-environment-variable-precedence)\n  - [Debugging](#debugging)\n- [Troubleshooting](#troubleshooting)\n- [Issues](#issues)\n- [Contributing](#contributing)\n  - [Versioning](#versioning)\n  - [Classify version changes](#classify-version-changes)\n  - [Compatibility](#compatibility)\n- [Inspiration](#inspiration)\n\n## Requirements\n\n`glab` officially supports GitLab versions 16.0 and later. Certain commands might require\nmore recent versions. While many commands might work properly in GitLab versions\n15.x and earlier, no support is provided for these versions.\n\n## Usage\n\nTo get started with `glab`:\n\n1. Follow the [installation instructions](#installation) appropriate for your operating system.\n1. [Authenticate](#authentication) into your instance of GitLab.\n1. Optional. Configure `glab` further to meet your needs:\n   - 1Password users can configure it to [authenticate to `glab`](https:\u002F\u002Fdeveloper.1password.com\u002Fdocs\u002Fcli\u002Fshell-plugins\u002Fgitlab\u002F).\n   - Set any needed global, per-project, or per-host [configuration](#configuration).\n   - Set any needed [environment variables](#environment-variables).\n\nYou're ready!\n\n### Core commands\n\nRun `glab --help` to view a list of core commands in your terminal.\n\n- [`glab alias`](docs\u002Fsource\u002Falias): Create, list, and delete aliases.\n- [`glab api`](docs\u002Fsource\u002Fapi): Make authenticated requests to the GitLab API.\n- [`glab auth`](docs\u002Fsource\u002Fauth): Manage the authentication state of the CLI.\n- [`glab changelog`](docs\u002Fsource\u002Fchangelog): Interact with the changelog API.\n- [`glab check-update`](docs\u002Fsource\u002Fcheck-update): Check for updates to the CLI.\n- [`glab ci`](docs\u002Fsource\u002Fci): Work with GitLab CI\u002FCD pipelines and jobs.\n- [`glab cluster`](docs\u002Fsource\u002Fcluster): Manage GitLab agents for Kubernetes and their clusters.\n- [`glab completion`](docs\u002Fsource\u002Fcompletion): Generate shell completion scripts.\n- [`glab config`](docs\u002Fsource\u002Fconfig): Set and get CLI settings.\n- [`glab deploy-key`](docs\u002Fsource\u002Fdeploy-key): Manage deploy keys.\n- [`glab duo`](docs\u002Fsource\u002Fduo): Generate terminal commands from natural language.\n- [`glab gpg-key`](docs\u002Fsource\u002Fgpg-key): Manage GPG keys registered with your GitLab account.\n- [`glab incident`](docs\u002Fsource\u002Fincident): Work with GitLab incidents.\n- [`glab issue`](docs\u002Fsource\u002Fissue): Work with GitLab issues.\n- [`glab iteration`](docs\u002Fsource\u002Fiteration): Retrieve iteration information.\n- [`glab job`](docs\u002Fsource\u002Fjob): Work with GitLab CI\u002FCD jobs.\n- [`glab label`](docs\u002Fsource\u002Flabel): Manage labels for your project.\n- [`glab mcp`](docs\u002Fsource\u002Fmcp): Work with a Model Context Protocol (MCP) server. (EXPERIMENTAL)\n- [`glab milestone`](docs\u002Fsource\u002Fmilestone): Manage group or project milestones.\n- [`glab mr`](docs\u002Fsource\u002Fmr): Create, view, and manage merge requests.\n- [`glab opentofu`](docs\u002Fsource\u002Fopentofu): Work with the OpenTofu or Terraform integration.\n- [`glab release`](docs\u002Fsource\u002Frelease): Manage GitLab releases.\n- [`glab repo`](docs\u002Fsource\u002Frepo): Work with GitLab repositories and projects.\n- [`glab schedule`](docs\u002Fsource\u002Fschedule): Work with GitLab CI\u002FCD schedules.\n- [`glab securefile`](docs\u002Fsource\u002Fsecurefile): Manage secure files for a project.\n- [`glab snippet`](docs\u002Fsource\u002Fsnippet): Create, view and manage snippets.\n- [`glab ssh-key`](docs\u002Fsource\u002Fssh-key): Manage SSH keys registered with your GitLab account.\n- [`glab stack`](docs\u002Fsource\u002Fstack): Create, manage, and work with stacked diffs.\n- [`glab token`](docs\u002Fsource\u002Ftoken): Manage personal, project, or group tokens.\n- [`glab user`](docs\u002Fsource\u002Fuser): Interact with a GitLab user account.\n- [`glab variable`](docs\u002Fsource\u002Fvariable): Manage variables for a GitLab project or group.\n- [`glab version`](docs\u002Fsource\u002Fversion): Show version information for the CLI.\n\nCommands follow this pattern:\n\n```bash\nglab \u003Ccommand> \u003Csubcommand> [flags]\n```\n\nMany core commands also have sub-commands. Some examples:\n\n- List merge requests assigned to you: `glab mr list --assignee=@me`\n- List review requests for you: `glab mr list --reviewer=@me`\n- Approve a merge request: `glab mr approve 235`\n- Create an issue, and add milestone, title, and label: `glab issue create -m release-2.0.0 -t \"My title here\" --label important`\n\n### GitLab Duo for the CLI\n\nThe GitLab CLI also provides support for GitLab Duo AI\u002FML powered features. These include:\n\n- [`glab duo ask`](docs\u002Fsource\u002Fduo\u002Fask.md)\n\nUse `glab duo ask` to ask questions about `git` commands. It can help you remember a\ncommand you forgot, or provide suggestions on how to run commands to perform other tasks.\n\n## Demo\n\n[![asciicast](https:\u002F\u002Fasciinema.org\u002Fa\u002F368622.svg)](https:\u002F\u002Fasciinema.org\u002Fa\u002F368622)\n\n## Documentation\n\nRead the [documentation](docs\u002Fsource\u002F_index.md) for usage instructions or check out `glab help`.\n\n## Installation\n\nDownload a binary suitable for your OS at the [releases page](https:\u002F\u002Fgitlab.com\u002Fgitlab-org\u002Fcli\u002F-\u002Freleases).\nOther installation methods depend on your operating system.\n\n### Homebrew\n\nHomebrew is the officially supported package manager for macOS, Linux, and Windows (through [Windows Subsystem for Linux](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows\u002Fwsl\u002Finstall))\n\n- Homebrew\n  - Install with: `brew install glab`\n  - Update with: `brew upgrade glab`\n\n### Other installation methods\n\nOther options to install the GitLab CLI that may not be officially supported or are maintained by the community are [also available](docs\u002Finstallation_options.md).\n\n### Building from source\n\nIf a supported binary for your OS is not found at the [releases page](https:\u002F\u002Fgitlab.com\u002Fgitlab-org\u002Fcli\u002F-\u002Freleases), you can build from source:\n\n#### Prerequisites for building from source\n\n- `make`\n- Go version as defined by [`main\u002Fgo.mod`](https:\u002F\u002Fgitlab.com\u002Fgitlab-org\u002Fcli\u002F-\u002Fblob\u002Fmain\u002Fgo.mod?ref_type=heads#L3)\n\nTo build from source:\n\n1. Run the command `go version` to verify that you have the minimum required Go version.\n   If `go` is not installed, follow instructions on [the Go website](https:\u002F\u002Fgo.dev\u002Fdoc\u002Finstall).\n1. Run the `go install gitlab.com\u002Fgitlab-org\u002Fcli\u002Fcmd\u002Fglab@main` to install `glab` cmd in `$GOPATH\u002Fbin`.\n1. The sources of `glab` will be in `$GOPATH\u002Fsrc\u002Fgitlab.com\u002Fgitlab-org\u002Fcli`.\n1. If you do not have `$GOPATH\u002Fbin` or `$GOBIN` in your `$PATH`, run `export PATH=$PWD\u002Fbin:$PATH`\n   to update your PATH with the newly compiled project.\n1. Run `glab version` to confirm that it worked.\n\n## Authentication\n\nWhen running `glab auth login` interactively inside a Git repository, `glab` automatically\ndetects GitLab instances from your Git remotes and presents them as options. This saves you\nfrom having to manually type the hostname.\n\n### OAuth (GitLab.com)\n\nTo authenticate your installation of `glab` with an OAuth application connected to GitLab.com:\n\n1. Start interactive setup with `glab auth login`.\n1. For the GitLab instance you want to sign in to, select **GitLab.com**.\n1. For the login method, select **Web**. This selection launches your web browser\n   to request authorization for the GitLab CLI to use your GitLab.com account.\n1. Select **Authorize**.\n1. Complete the authentication process in your terminal, selecting the appropriate options for your needs.\n\n### OAuth (GitLab Self-Managed, GitLab Dedicated)\n\nPrerequisites:\n\n- You've created an OAuth application at the user, group, or instance level, and you\n  have its application ID. For instructions, see how to configure GitLab\n  [as an OAuth 2.0 authentication identity provider](https:\u002F\u002Fdocs.gitlab.com\u002Fintegration\u002Foauth_provider\u002F)\n  in the GitLab documentation.\n- Your OAuth application is configured with these parameters:\n  - **Redirect URI** is `http:\u002F\u002Flocalhost:7171\u002Fauth\u002Fredirect`.\n  - **Confidential** is not selected.\n  - **Scopes** are `openid`, `profile`, `read_user`, `write_repository`, and `api`.\n\nTo authenticate your installation of `glab` with an OAuth application connected\nto your GitLab Self-Managed or GitLab Dedicated instance:\n\n1. Store the application ID with `glab config set client_id \u003CCLIENT_ID> --host \u003CHOSTNAME>`.\n   For `\u003CCLIENT_ID>`, provide your application ID.\n1. Start interactive setup with `glab auth login --hostname \u003CHOSTNAME>`.\n1. For the login method, select **Web**. This selection launches your web browser\n   to request authorization for the GitLab CLI to use your GitLab Self-Managed or GitLab Dedicated account.\n1. Select **Authorize**.\n1. Complete the authentication process in your terminal, selecting the appropriate options for your needs.\n\n### Personal access token\n\nTo authenticate your installation of `glab` with a personal access token:\n\n1. Get a GitLab personal access token with at least the `api`\n   and `write_repository` scopes. Use the method appropriate for your instance:\n   - For GitLab.com, create one at the [personal access tokens](https:\u002F\u002Fgitlab.com\u002F-\u002Fuser_settings\u002Fpersonal_access_tokens?scopes=api%2Cwrite_repository) page.\n   - For GitLab Self-Managed and GitLab Dedicated, visit `https:\u002F\u002Fgitlab.example.com\u002F-\u002Fuser_settings\u002Fpersonal_access_tokens?scopes=api,write_repository`,\n     modifying `gitlab.example.com` to match the domain name of your instance.\n1. Start interactive setup: `glab auth login`\n1. Authenticate with the method appropriate for your GitLab instance:\n   - For GitLab SaaS, authenticate against `gitlab.com` by reading the token\n     from a file: `glab auth login --stdin \u003C myaccesstoken.txt`\n   - For GitLab Self-Managed and GitLab Dedicated, authenticate by reading from a file:\n     `glab auth login --hostname gitlab.example.com --stdin \u003C myaccesstoken.txt`. This will allow you to perform\n     authenticated `glab` commands against your instance when you are in a Git repository with a remote\n     matching your instance's host. Alternatively, set `GITLAB_HOST` to direct your command to your instance.\n   - Authenticate with token and hostname: `glab auth login --hostname gitlab.example.org --token xxxxx`\n     Not recommended for shared environments.\n   - Credentials are stored in the global [configuration file](#configuration).\n\n### CI Job Token\n\nTo authenticate your installation of `glab` with a CI job token, the `glab` command must be run in a GitLab CI job.\nThe token is automatically provided by the GitLab Runner via the `CI_JOB_TOKEN` environment variable.\n\nEndpoints allowing the use of the CI job token are listed in the\n[GitLab documentation](https:\u002F\u002Fdocs.gitlab.com\u002Fci\u002Fjobs\u002Fci_job_token\u002F#job-token-access).\n\n#### Auto-Login [EXPERIMENTAL]\n\nThere is an experimental CI auto-login feature that can be enabled by setting the `GLAB_ENABLE_CI_AUTOLOGIN` variable\nto `true`. This feature automatically detects if `glab` is running in GitLab CI and, if so, uses the predefined\nCI\u002FCD variables to sign in.\n\nExample:\n\n```shell\nGLAB_ENABLE_CI_AUTLOGIN=true glab release list -R $CI_PROJECT_PATH\n```\n\n#### Manual login\n\nExample:\n\n```shell\nglab auth login --job-token $CI_JOB_TOKEN --hostname $CI_SERVER_HOST --api-protocol $CI_SERVER_PROTOCOL\nGITLAB_HOST=$CI_SERVER_URL glab release list -R $CI_PROJECT_PATH\n```\n\n## Configuration\n\nBy default, `glab` follows the\n[XDG Base Directory Spec](https:\u002F\u002Fspecifications.freedesktop.org\u002Fbasedir-spec\u002Fbasedir-spec-latest.html),\nwhich means it searches for configuration files in multiple locations with proper precedence.\n\n### Configuration Levels\n\nConfigure `glab` at different levels: system-wide, globally (per-user), locally (per-repository), or per host:\n\n- **System-wide** (for all users): Place configuration at `\u002Fetc\u002Fxdg\u002Fglab-cli\u002Fconfig.yml` (or `$XDG_CONFIG_DIRS\u002Fglab-cli\u002Fconfig.yml`).\n  - Useful for Linux distributions and system administrators to provide default configurations.\n  - User configurations will override system-wide settings.\n- **Globally** (per-user): run `glab config set --global editor vim`.\n  - The global configuration file is available at `~\u002F.config\u002Fglab-cli\u002Fconfig.yml` (or `$XDG_CONFIG_HOME\u002Fglab-cli\u002Fconfig.yml`).\n  - To override this location, set the `GLAB_CONFIG_DIR` environment variable.\n- **The current repository**: run `glab config set editor vim` in any folder in a Git repository.\n  - The local configuration file is available at `.git\u002Fglab-cli\u002Fconfig.yml` in the current working Git directory.\n- **Per host**: run `glab config set editor vim --host gitlab.example.org`, changing\n  the `--host` parameter to meet your needs.\n  - Per-host configuration info is always stored in the global configuration file, with or without the `global` flag.\n\n### Configuration Search Order\n\nWhen `glab` looks for configuration files, it searches in this order (highest priority first):\n\n1. `$GLAB_CONFIG_DIR\u002Fconfig.yml` (if `GLAB_CONFIG_DIR` is set)\n2. `~\u002F.config\u002Fglab-cli\u002Fconfig.yml` (legacy location, for backward compatibility)\n3. `$XDG_CONFIG_HOME\u002Fglab-cli\u002Fconfig.yml` (platform-specific XDG location)\n4. `$XDG_CONFIG_DIRS\u002Fglab-cli\u002Fconfig.yml` (system-wide configs, default: `\u002Fetc\u002Fxdg\u002Fglab-cli\u002Fconfig.yml`)\n\nThe first configuration file found is used.\n\n#### Configuration File Locations\n\n**For backward compatibility**, `glab` checks `~\u002F.config\u002Fglab-cli\u002Fconfig.yml` first on all platforms.\nIf no legacy config exists, `glab` uses platform-specific XDG Base Directory locations:\n\n- **Linux**: `~\u002F.config\u002Fglab-cli\u002Fconfig.yml` (XDG_CONFIG_HOME)\n- **macOS**: `~\u002FLibrary\u002FApplication Support\u002Fglab-cli\u002Fconfig.yml` (XDG_CONFIG_HOME)\n- **Windows**: `%APPDATA%\\glab-cli\\config.yml` (XDG_CONFIG_HOME)\n\n**Note**: If you have config files in both the legacy location (`~\u002F.config\u002Fglab-cli\u002Fconfig.yml`)\nand the platform-specific XDG location, `glab` will use the legacy location and display a warning.\nConsider consolidating to one location to avoid confusion.\n\n### Configure `glab` to use your GitLab Self-Managed or GitLab Dedicated instance\n\nWhen outside a Git repository, `glab` uses `gitlab.com` by default. For `glab` to default\nto your GitLab Self-Managed or GitLab Dedicated instance when you are not in a Git repository, change the host\nconfiguration settings. Use this command, changing `gitlab.example.com` to the domain name\nof your instance:\n\n```shell\nglab config set -g host gitlab.example.com\n```\n\nSetting this configuration enables you to perform commands outside a Git repository while\nusing your GitLab Self-Managed or GitLab Dedicated instance. For example:\n\n- `glab repo clone group\u002Fproject`\n- `glab issue list -R group\u002Fproject`\n\nIf you don't set a default domain name, you can declare one for the current command with\nthe `GITLAB_HOST` environment variable, like this:\n\n- `GITLAB_HOST=gitlab.example.com glab repo clone group\u002Fproject`\n- `GITLAB_HOST=gitlab.example.com glab issue list -R group\u002Fproject`\n\nWhen inside a Git repository `glab` will use that repository's GitLab host by default. For example `glab issue list`\nwill list all issues of the current directory's Git repository.\n\n### Configure `glab` to use mTLS certificates\n\nTo use a mutual TLS (Mutual Transport Layer Security) certificate with `glab`, edit your global\nconfiguration file (`~\u002F.config\u002Fglab-cli\u002Fconfig.yml`) to provide connection information:\n\n```yaml\nhosts:\n    git.your-domain.com:\n        api_protocol: https\n        api_host: git.your-domain.com\n        token: xxxxxxxxxxxxxxxxxxxxxxxxx\n        client_cert: \u002Fpath\u002Fto\u002Fclient.crt\n        client_key: \u002Fpath\u002Fto\u002Fclient.key\n        ca_cert: \u002Fpath\u002Fto\u002Fca-chain.pem\n```\n\n- `ca_cert` is optional for mTLS support if you use a publicly signed server certificate.\n- `token` is not required if you use a different authentication method.\n\n### Configure `glab` to use self-signed certificates\n\nTo configure the GitLab CLI to support GitLab Self-Managed and GitLab Dedicated instances with\nself-signed certificates, either:\n\n- Disable TLS verification with:\n\n  ```shell\n  glab config set skip_tls_verify true --host gitlab.example.com\n  ```\n\n- Add the path to the self signed CA:\n\n  ```shell\n  glab config set ca_cert \u002Fpath\u002Fto\u002Fserver.pem --host gitlab.example.com\n  ```\n\n## Environment variables\n\n### GitLab access variables\n\n| Token name         | In `config.yml`                                                                                       | Default value if [not set](#configuration) | Description                                                                                                                                                                                                 |\n|--------------------|-------------------------------------------------------------------------------------------------------|--------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `GITLAB_API_HOST`  | `hosts.\u003Chostname>.api_host`, or `hosts.\u003Chostname>` if empty                                           | Hostname found in the Git URL              | Specify the host where the API endpoint is found. Useful when there are separate (sub)domains or hosts for Git and the API endpoint.                                                                        |\n| `GITLAB_CLIENT_ID` | `hosts.\u003Chostname>.client_id`                                                                          | Client-ID for GitLab.com.                  | A custom Client-ID generated by the GitLab OAuth 2.0 application.                                                                                                                                           |\n| `GITLAB_GROUP`     | -                                                                                                     | -                                          | Default GitLab group used for listing merge requests, issues and variables. Only used if no `--group` option is given.                                                                                      |\n| `GITLAB_HOST`      | `host` (this is the default host `glab` will use when the current directory is not a `git` directory) | `https:\u002F\u002Fgitlab.com`                       | Alias of `GITLAB_URI`.                                                                                                                                                                                      |\n| `GITLAB_REPO`      | -                                                                                                     | -                                          | Default GitLab repository used for commands accepting the `--repo` option. Only used if no `--repo` option is given.                                                                                        |\n| `GITLAB_TOKEN`     | `hosts.\u003Chostname>.token`                                                                              | -                                          | an authentication token for API requests. Setting this avoids being prompted to authenticate and overrides any previously stored credentials. Can be set in the config with `glab config set token xxxxxx`. |\n| `GITLAB_URI`       | not applicable                                                                                        | not applicable                             | Alias of `GITLAB_HOST`.                                                                                                                                                                                     |\n\n### `glab` configuration variables\n\n| Token name                                   | In `config.yml`      | Default value if [not set](#configuration) | Description                                                                                                                                                                                  |\n|----------------------------------------------|----------------------|--------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `BROWSER`                                    | `browser`            | system default                             | The web browser to use for opening links. Can be set in the configuration with `glab config set browser mybrowser`.                                                                          |\n| `FORCE_HYPERLINKS`                           | `display_hyperlinks` | `false`                                    | Set to `true` to force hyperlinks to be output, even when not outputting to a TTY.                                                                                                           |\n| `GITLAB_RELEASE_ASSETS_USE_PACKAGE_REGISTRY` | -                    | -                                          | When `true` or `1`, the `glab release create` command uploads release assets to the generic package registry of the project. Can be overridden with the `--use-package-registry` flag.       |\n| `GLAB_CHECK_UPDATE`                          | -                    | -                                          | Set to `true` to force an update check.                                                                                                                                                      |\n| `GLAB_CONFIG_DIR`                            | -                    | `~\u002F.config\u002Fglab-cli\u002F`                      | Directory where the `glab` global configuration file is located. Can be set in the config with `glab config set remote_alias origin`.                                                        |\n| `GLAB_DEBUG_HTTP`                            | -                    | `false`                                    | Set to true to output HTTP transport information (request \u002F response).                                                                                                                       |\n| `GLAB_SEND_TELEMETRY`                        | `telemetry`          | `true`                                     | Set to `false` to prevent command usage data from being sent to your GitLab instance.                                                                                                        |\n| `GLAMOUR_STYLE`                              | `glamour_style`      | `dark`                                     | Environment variable to set your desired Markdown renderer style. Available options are (`dark`, `light`, `notty`) or set a [custom style](https:\u002F\u002Fgithub.com\u002Fcharmbracelet\u002Fglamour#styles). |\n| `NO_COLOR`                                   | -                    | `true`                                     | Set to any value to avoid printing ANSI escape sequences for color output.                                                                                                                   |\n| `NO_PROMPT`                                  | `no_prompt`          | `false`                                    | Set to `true` to disable prompts.                                                                                                                                                            |\n| `VISUAL`, `EDITOR`                           | `editor`             | `nano`                                     | (in order of precedence) The editor tool to use for authoring text. Can be set in the config with `glab config set editor vim`.                                                              |\n\n### Other variables\n\n| Token name           | In `config.yml` | Default value if [not set](#configuration) | Description                                                                                                            |\n|----------------------|-----------------|--------------------------------------------|------------------------------------------------------------------------------------------------------------------------|\n| `DEBUG`              | `debug`         | `false`                                    | Set to `true` to output more information for each command, like Git commands, expanded aliases, and DNS error details. |\n| `GIT_REMOTE_URL_VAR` | not applicable  | not applicable                             | Alias of `REMOTE_ALIAS`.                                                                                               |\n| `REMOTE_ALIAS`       | `remote_alias`  | -                                          | `git remote` variable or alias that contains the GitLab URL. Alias: `GIT_REMOTE_URL_VAR`                               |\n\n#### Variable deprecation\n\nIn `glab` version 2.0.0 and later, all `glab` environment variables are prefixed with `GLAB_`.\nFor more information about this deprecation, see [issue 7999](https:\u002F\u002Fgitlab.com\u002Fgitlab-org\u002Fcli\u002F-\u002Fissues\u002F7999).\n\n### Token and environment variable precedence\n\nGLab uses tokens in this order:\n\n1. Environment variable (`GITLAB_TOKEN`).\n1. Configuration file (`$HOME\u002F.config\u002Fglab-cli\u002Fconfig.yml`).\n\n### Debugging\n\nWhen the `DEBUG` environment variable is set to `true`, `glab` outputs more logging information, including:\n\n- Underlying Git commands.\n- Expanded aliases.\n- DNS error details.\n\n## Troubleshooting\n\nFor troubleshooting information, see the\n[GitLab documentation for the CLI](https:\u002F\u002Fdocs.gitlab.com\u002Feditor_extensions\u002Fgitlab_cli\u002F#troubleshooting).\n\n## Issues\n\nIf you have an issue: report it on the [issue tracker](https:\u002F\u002Fgitlab.com\u002Fgitlab-org\u002Fcli\u002F-\u002Fissues)\n\n## Contributing\n\nFeel like contributing? That's awesome! We have a [contributing guide](https:\u002F\u002Fgitlab.com\u002Fgitlab-org\u002Fcli\u002F-\u002Fblob\u002Fmain\u002FCONTRIBUTING.md) and [Code of conduct](https:\u002F\u002Fgitlab.com\u002Fgitlab-org\u002Fcli\u002F-\u002Fblob\u002Fmain\u002FCODE_OF_CONDUCT.md) to help guide you.\n\n### Versioning\n\nThis project follows the [SemVer](https:\u002F\u002Fgithub.com\u002Fsemver\u002Fsemver) specification.\n\n### Classify version changes\n\n- If deleting a command, changing how it behaves, or adding a new **required** flag, the release must use a new `MAJOR` revision.\n- If adding a new command or **optional** flag, the release must use a new `MINOR` revision.\n- If fixing a bug, the release must use a new `PATCH` revision.\n\n### Compatibility\n\nWe do our best to introduce breaking changes only when releasing a new `MAJOR` version.\nUnfortunately, there are situations where this is not possible, and we may introduce\na breaking change in a `MINOR` or `PATCH` version. Some of situations where we may do so:\n\n- If a security issue is discovered, and the solution requires a breaking change,\n  we may introduce such a change to resolve the issue and protect our users.\n- If a feature was not working as intended, and the bug fix requires a breaking change,\n  the bug fix may be introduced to ensure the functionality works as intended.\n- When feature behavior is overwhelmingly confusing due to a vague specification\n  on how it should work. In such cases, we may refine the specification\n  to remove the ambiguity, and introduce a breaking change that aligns with the\n  refined specification. For an example of this, see\n  [merge request 1382](https:\u002F\u002Fgitlab.com\u002Fgitlab-org\u002Fcli\u002F-\u002Fmerge_requests\u002F1382#note_1686888887).\n- Experimental features are not guaranteed to be stable, and can be modified or\n  removed without a breaking change.\n\nBreaking changes are a last resort, and we try our best to only introduce them when absolutely necessary.\n\n## Inspiration\n\nThe GitLab CLI was adopted from [Clement Sam](https:\u002F\u002Fgitlab.com\u002Fprofclems) in 2022 to serve as the official CLI of GitLab. Over the years the project has been inspired by both the [GitHub CLI](https:\u002F\u002Fgithub.com\u002Fcli\u002Fcli) and [Zaq? Wiedmann's](https:\u002F\u002Fgitlab.com\u002Fzaquestion) [lab](https:\u002F\u002Fgithub.com\u002Fzaquestion\u002Flab).\n\nLab has served as the foundation for many of the GitLab CI\u002FCD commands including `ci view` and `ci trace`.\n","0.5.0",[5635,5638,5642,5645,5648,5652,5655,5659,5663,5667,5671,5673,5675,5677,5678],{"name":5636,"import_name":5636,"version":5637},"python","\u003C4.0,>=3.10",{"name":5639,"import_name":5640,"version":5641},"typing-extensions","typing_extensions","4.15.0",{"name":5643,"import_name":5643,"version":5644},"wrapt","2.0.1",{"name":5646,"import_name":5646,"version":5647},"commitizen","4.12.1",{"name":5649,"import_name":5650,"version":5651},"pre-commit","pre_commit","4.5.1",{"name":5653,"import_name":5653,"version":5654},"ruff","0.14.14",{"name":5656,"import_name":5657,"version":5658},"unitelabs-jsondocs","unitelabs.jsondocs","0.4.2",{"name":5660,"import_name":5661,"version":5662},"hidapi","hidraw","0.15.0",{"name":5664,"import_name":5665,"version":5666},"libusb-package","libusb_package","1.0.26.3",{"name":5668,"import_name":5669,"version":5670},"pyserial","serial","3.5",{"name":5672,"import_name":5672,"version":1674},"pytest",{"name":5674,"import_name":5674,"version":1674},"pytest-asyncio",{"name":5676,"import_name":5676,"version":1674},"pytest-cov",{"name":5664,"import_name":5665,"version":5666},{"name":5679,"import_name":5680,"version":5681},"pyusb","usb","1.3.1",1781787395261]