[{"data":1,"prerenderedAt":3371},["ShallowReactive",2],{"navigation":3,"\u002Fconnector-development\u002Freference\u002Fpython-environment-management":955,"\u002Fconnector-development\u002Freference\u002Fpython-environment-management-surround":3368},[4,68,205,384,548,741,789],{"title":5,"device":6,"path":7,"stem":8,"children":9,"page":51},"Get Started",null,"\u002Fget-started\u002F","01.get-started",[10,14,52,56,60,64],{"title":11,"path":12,"stem":13,"device":6},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome\u002F","01.get-started\u002F00.welcome",{"title":15,"device":6,"path":16,"stem":17,"children":18,"page":51},"Setup","\u002Fget-started\u002Fsetup\u002F","01.get-started\u002F01.setup",[19,23,27,31,35,39,43,47],{"title":20,"path":21,"stem":22,"device":6},"Get access","\u002Fget-started\u002Fsetup\u002Fget-access\u002F","01.get-started\u002F01.setup\u002F00.get-access",{"title":24,"path":25,"stem":26,"device":6},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol\u002F","01.get-started\u002F01.setup\u002F10.groundcontrol",{"title":28,"path":29,"stem":30,"device":6},"Network requirements","\u002Fget-started\u002Fsetup\u002Fnetwork-requirements\u002F","01.get-started\u002F01.setup\u002F15.network-requirements",{"title":32,"path":33,"stem":34,"device":6},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform\u002F","01.get-started\u002F01.setup\u002F20.connect-to-platform",{"title":36,"path":37,"stem":38,"device":6},"Set up your development machine","\u002Fget-started\u002Fsetup\u002Fdeveloper-machine\u002F","01.get-started\u002F01.setup\u002F30.developer-machine",{"title":40,"path":41,"stem":42,"device":6},"SDK installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation\u002F","01.get-started\u002F01.setup\u002F40.sdk-installation",{"title":44,"path":45,"stem":46,"device":6},"SDK upgrade","\u002Fget-started\u002Fsetup\u002Fsdk-upgrade\u002F","01.get-started\u002F01.setup\u002F45.sdk-upgrade",{"title":48,"path":49,"stem":50,"device":6},"Connect an AI assistant to the docs","\u002Fget-started\u002Fsetup\u002Fai-assistant\u002F","01.get-started\u002F01.setup\u002F50.ai-assistant",false,{"title":53,"path":54,"stem":55,"device":6},"Control a device","\u002Fget-started\u002Fcontrol-a-device\u002F","01.get-started\u002F02.control-a-device",{"title":57,"path":58,"stem":59,"device":6},"Liquid handling as code","\u002Fget-started\u002Fliquid-handling-as-code\u002F","01.get-started\u002F03.liquid-handling-as-code",{"title":61,"path":62,"stem":63,"device":6},"Automate your workflows","\u002Fget-started\u002Fautomate-your-workflows\u002F","01.get-started\u002F04.automate-your-workflows",{"title":65,"path":66,"stem":67,"device":6},"Self-Paced Setup Guide","\u002Fget-started\u002Fself-onboarding\u002F","01.get-started\u002F90.self-onboarding",{"title":69,"device":6,"path":70,"stem":71,"children":72,"page":51},"How-to","\u002Fhow-to\u002F","02.how-to",[73,127,180,197],{"title":74,"device":6,"path":75,"stem":76,"children":77,"page":51},"Connectors and devices","\u002Fhow-to\u002Fintegrate\u002F","02.how-to\u002F02.integrate",[78,111],{"title":79,"device":6,"path":80,"stem":81,"children":82,"page":51},"Connect a device","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device",[83,87,91,95,99,103,107],{"title":84,"path":85,"stem":86,"device":6},"Connector Configuration","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fconnector-configuration\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F10.connector-configuration",{"title":88,"path":89,"stem":90,"device":6},"With an executable","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fwith-an-executable\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F20.with-an-executable",{"title":92,"path":93,"stem":94,"device":6},"From source","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Ffrom-source\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F30.from-source",{"title":96,"path":97,"stem":98,"device":6},"Build your own","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fbuild-yourself\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F40.build-yourself",{"title":100,"path":101,"stem":102,"device":6},"Headless install","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fheadless-install\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F50.headless-install",{"title":104,"path":105,"stem":106,"device":6},"Raspberry Pi","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fraspberry-pi\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F55.raspberry-pi",{"title":108,"path":109,"stem":110,"device":6},"Multi-device Networking","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fmultiple-devices\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F60.multiple-devices",{"title":112,"device":6,"path":113,"stem":114,"children":115,"page":51},"Use a device","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device",[116,119,123],{"title":24,"path":117,"stem":118,"device":6},"\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fgroundcontrol\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F10.groundcontrol",{"title":120,"path":121,"stem":122,"device":6},"Platform","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fplatform\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F20.platform",{"title":124,"path":125,"stem":126,"device":6},"UniteLabs SDK & REST API","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fpython\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F30.python",{"title":128,"device":6,"path":129,"stem":130,"children":131,"page":51},"Workflows","\u002Fhow-to\u002Fautomate\u002F","02.how-to\u002F07.automate",[132,136,140,144,148,152,156,160,164,168,172,176],{"title":133,"path":134,"stem":135,"device":6},"Workflow template","\u002Fhow-to\u002Fautomate\u002Fworkflow-template\u002F","02.how-to\u002F07.automate\u002F10.workflow-template",{"title":137,"path":138,"stem":139,"device":6},"Deploy a workflow","\u002Fhow-to\u002Fautomate\u002Fdeploy-a-workflow\u002F","02.how-to\u002F07.automate\u002F30.deploy-a-workflow",{"title":141,"path":142,"stem":143,"device":6},"Run a workflow","\u002Fhow-to\u002Fautomate\u002Frun-a-workflow\u002F","02.how-to\u002F07.automate\u002F35.run-a-workflow",{"title":145,"path":146,"stem":147,"device":6},"Workflows REST API","\u002Fhow-to\u002Fautomate\u002Fworkflows-api\u002F","02.how-to\u002F07.automate\u002F38.workflows-api",{"title":149,"path":150,"stem":151,"device":6},"CI\u002FCD for workflows","\u002Fhow-to\u002Fautomate\u002Fcicd-for-workflows\u002F","02.how-to\u002F07.automate\u002F40.cicd-for-workflows",{"title":153,"path":154,"stem":155,"device":6},"HITL basics","\u002Fhow-to\u002Fautomate\u002Fbasic-hitl\u002F","02.how-to\u002F07.automate\u002F50.basic-hitl",{"title":157,"path":158,"stem":159,"device":6},"Slack notifications and operator confirmation","\u002Fhow-to\u002Fautomate\u002Fslack-notifications\u002F","02.how-to\u002F07.automate\u002F52.slack-notifications",{"title":161,"path":162,"stem":163,"device":6},"Typed operator inputs","\u002Fhow-to\u002Fautomate\u002Ftyped-operator-inputs\u002F","02.how-to\u002F07.automate\u002F55.typed-operator-inputs",{"title":165,"path":166,"stem":167,"device":6},"Pause and resume a run","\u002Fhow-to\u002Fautomate\u002Fpause-and-resume\u002F","02.how-to\u002F07.automate\u002F57.pause-and-resume",{"title":169,"path":170,"stem":171,"device":6},"Error recovery","\u002Fhow-to\u002Fautomate\u002Fbasic-error-handling\u002F","02.how-to\u002F07.automate\u002F60.basic-error-handling",{"title":173,"path":174,"stem":175,"device":6},"Advanced error handling","\u002Fhow-to\u002Fautomate\u002Fadvanced-error-handling\u002F","02.how-to\u002F07.automate\u002F70.advanced-error-handling",{"title":177,"path":178,"stem":179,"device":6},"Emit lineage events","\u002Fhow-to\u002Fautomate\u002Femitting-lineage-events\u002F","02.how-to\u002F07.automate\u002F90.emitting-lineage-events",{"title":181,"device":6,"path":182,"stem":183,"children":184,"page":51},"Data","\u002Fhow-to\u002Fobserve\u002F","02.how-to\u002F08.observe",[185,189,193],{"title":186,"path":187,"stem":188,"device":6},"File System Connector","\u002Fhow-to\u002Fobserve\u002Ffilesystem-connector\u002F","02.how-to\u002F08.observe\u002F10.filesystem-connector",{"title":190,"path":191,"stem":192,"device":6},"Building an ETL","\u002Fhow-to\u002Fobserve\u002Fbuilding-an-etl\u002F","02.how-to\u002F08.observe\u002F20.building-an-etl",{"title":194,"path":195,"stem":196,"device":6},"Read lineage events","\u002Fhow-to\u002Fobserve\u002Freading-lineage-events\u002F","02.how-to\u002F08.observe\u002F30.reading-lineage-events",{"title":120,"device":6,"path":198,"stem":199,"children":200,"page":51},"\u002Fhow-to\u002Fplatform\u002F","02.how-to\u002F09.platform",[201],{"title":202,"path":203,"stem":204,"device":6},"UniteLabs Desktop","\u002Fhow-to\u002Fplatform\u002Funitelabs-desktop\u002F","02.how-to\u002F09.platform\u002F10.unitelabs-desktop",{"title":206,"device":6,"path":207,"stem":208,"children":209,"page":51},"Concepts","\u002Fconcepts\u002F","04.concepts",[210,248,272,321,360],{"title":211,"device":6,"path":212,"stem":213,"children":214,"page":51},"Labs as code","\u002Fconcepts\u002Flabs-as-code\u002F","04.concepts\u002F01.labs-as-code",[215,219,223],{"title":216,"path":217,"stem":218,"device":6},"Lab as Code","\u002Fconcepts\u002Flabs-as-code\u002Fwhy-code\u002F","04.concepts\u002F01.labs-as-code\u002F00.why-code",{"title":220,"path":221,"stem":222,"device":6},"How it works","\u002Fconcepts\u002Flabs-as-code\u002Fhow-it-works\u002F","04.concepts\u002F01.labs-as-code\u002F01.how-it-works",{"title":224,"device":6,"path":225,"stem":226,"children":227,"page":51},"Use Cases","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases",[228,232,236,240,244],{"title":229,"path":230,"stem":231,"device":6},"Instrument Control","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Flow-level-instrument-control\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F10.low-level-instrument-control",{"title":233,"path":234,"stem":235,"device":6},"Multi-device Control","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fmulti-device-control\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F20.multi-device-control",{"title":237,"path":238,"stem":239,"device":6},"Workflow Orchestration","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fworkflow-orchestration\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F30.workflow-orchestration",{"title":241,"path":242,"stem":243,"device":6},"Custom Apps and LIMS Integration","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fcustom-apps-lims\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F40.custom-apps-lims",{"title":245,"path":246,"stem":247,"device":6},"Scale and Fleet Management","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fscale-and-fleet\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F50.scale-and-fleet",{"title":74,"device":6,"path":249,"stem":250,"children":251,"page":51},"\u002Fconcepts\u002Fintegrate\u002F","04.concepts\u002F02.integrate",[252,256,260,264,268],{"title":253,"path":254,"stem":255,"device":6},"Device","\u002Fconcepts\u002Fintegrate\u002Fdevice\u002F","04.concepts\u002F02.integrate\u002F05.device",{"title":257,"path":258,"stem":259,"device":6},"Connector","\u002Fconcepts\u002Fintegrate\u002Fconnector\u002F","04.concepts\u002F02.integrate\u002F10.connector",{"title":261,"path":262,"stem":263,"device":6},"Module","\u002Fconcepts\u002Fintegrate\u002Fmodule\u002F","04.concepts\u002F02.integrate\u002F20.module",{"title":265,"path":266,"stem":267,"device":6},"Action","\u002Fconcepts\u002Fintegrate\u002Faction\u002F","04.concepts\u002F02.integrate\u002F30.action",{"title":269,"path":270,"stem":271,"device":6},"Subscription","\u002Fconcepts\u002Fintegrate\u002Fsubscription\u002F","04.concepts\u002F02.integrate\u002F40.subscription",{"title":273,"device":6,"path":274,"stem":275,"children":276,"page":51},"Liquid handling and robots","\u002Fconcepts\u002Foperate\u002F","04.concepts\u002F03.operate",[277,281,285,289,293,297,301,305,309,313,317],{"title":278,"path":279,"stem":280,"device":6},"Liquid Handling","\u002Fconcepts\u002Foperate\u002Fliquid-handling\u002F","04.concepts\u002F03.operate\u002F10.liquid-handling",{"title":282,"path":283,"stem":284,"device":6},"Modules","\u002Fconcepts\u002Foperate\u002Fmodules\u002F","04.concepts\u002F03.operate\u002F20.modules",{"title":286,"path":287,"stem":288,"device":6},"Deck","\u002Fconcepts\u002Foperate\u002Fdeck\u002F","04.concepts\u002F03.operate\u002F30.deck",{"title":290,"path":291,"stem":292,"device":6},"Labware","\u002Fconcepts\u002Foperate\u002Flabware\u002F","04.concepts\u002F03.operate\u002F40.labware",{"title":294,"path":295,"stem":296,"device":6},"Liquids","\u002Fconcepts\u002Foperate\u002Fliquids\u002F","04.concepts\u002F03.operate\u002F50.liquids",{"title":298,"path":299,"stem":300,"device":6},"Liquid Classes","\u002Fconcepts\u002Foperate\u002Fliquid-classes\u002F","04.concepts\u002F03.operate\u002F60.liquid-classes",{"title":302,"path":303,"stem":304,"device":6},"Parameter Sets","\u002Fconcepts\u002Foperate\u002Fparameter-sets\u002F","04.concepts\u002F03.operate\u002F65.parameter-sets",{"title":306,"path":307,"stem":308,"device":6},"Tips and Tip Tracking","\u002Fconcepts\u002Foperate\u002Ftips\u002F","04.concepts\u002F03.operate\u002F70.tips",{"title":310,"path":311,"stem":312,"device":6},"Simulation","\u002Fconcepts\u002Foperate\u002Fsimulation\u002F","04.concepts\u002F03.operate\u002F80.simulation",{"title":314,"path":315,"stem":316,"device":6},"Error Handling","\u002Fconcepts\u002Foperate\u002Ferror-handling\u002F","04.concepts\u002F03.operate\u002F90.error-handling",{"title":318,"path":319,"stem":320,"device":6},"Robot Arms","\u002Fconcepts\u002Foperate\u002Frobot-arms\u002F","04.concepts\u002F03.operate\u002F95.robot-arms",{"title":128,"device":6,"path":322,"stem":323,"children":324,"page":51},"\u002Fconcepts\u002Fautomate\u002F","04.concepts\u002F07.automate",[325,329,333,337,341,345,349,353,357],{"title":326,"path":327,"stem":328,"device":6},"Workflow","\u002Fconcepts\u002Fautomate\u002Fworkflow\u002F","04.concepts\u002F07.automate\u002F10.workflow",{"title":330,"path":331,"stem":332,"device":6},"Phase","\u002Fconcepts\u002Fautomate\u002Fphase\u002F","04.concepts\u002F07.automate\u002F20.phase",{"title":334,"path":335,"stem":336,"device":6},"Step","\u002Fconcepts\u002Fautomate\u002Fstep\u002F","04.concepts\u002F07.automate\u002F30.step",{"title":338,"path":339,"stem":340,"device":6},"Runs","\u002Fconcepts\u002Fautomate\u002Fruns\u002F","04.concepts\u002F07.automate\u002F40.runs",{"title":342,"path":343,"stem":344,"device":6},"Input","\u002Fconcepts\u002Fautomate\u002Finput\u002F","04.concepts\u002F07.automate\u002F50.input",{"title":346,"path":347,"stem":348,"device":6},"Artifacts","\u002Fconcepts\u002Fautomate\u002Fartifacts\u002F","04.concepts\u002F07.automate\u002F60.artifacts",{"title":350,"path":351,"stem":352,"device":6},"Logs","\u002Fconcepts\u002Fautomate\u002Flogs\u002F","04.concepts\u002F07.automate\u002F70.logs",{"title":354,"path":355,"stem":356,"device":6},"Human in the Loop","\u002Fconcepts\u002Fautomate\u002Fhuman-in-the-loop\u002F","04.concepts\u002F07.automate\u002F80.human-in-the-loop",{"title":314,"path":358,"stem":359,"device":6},"\u002Fconcepts\u002Fautomate\u002Ferror-handling\u002F","04.concepts\u002F07.automate\u002F90.error-handling",{"title":181,"device":6,"path":361,"stem":362,"children":363,"page":51},"\u002Fconcepts\u002Fobserve\u002F","04.concepts\u002F08.observe",[364,368,372,376,380],{"title":365,"path":366,"stem":367,"device":6},"Overview","\u002Fconcepts\u002Fobserve\u002Foverview\u002F","04.concepts\u002F08.observe\u002F10.overview",{"title":369,"path":370,"stem":371,"device":6},"Object Storage","\u002Fconcepts\u002Fobserve\u002Fstorage\u002F","04.concepts\u002F08.observe\u002F10.storage",{"title":373,"path":374,"stem":375,"device":6},"Secrets","\u002Fconcepts\u002Fobserve\u002Fsecrets\u002F","04.concepts\u002F08.observe\u002F20.secrets",{"title":377,"path":378,"stem":379,"device":6},"Data sources","\u002Fconcepts\u002Fobserve\u002Fdata-sources\u002F","04.concepts\u002F08.observe\u002F30.data-sources",{"title":381,"path":382,"stem":383,"device":6},"Data lineage","\u002Fconcepts\u002Fobserve\u002Fdata-lineage\u002F","04.concepts\u002F08.observe\u002F40.data-lineage",{"title":385,"device":6,"path":386,"stem":387,"children":388,"page":51},"Devices","\u002Fdevices\u002F","05.devices",[389,392,440,453,469,506,530],{"title":365,"path":390,"stem":391,"device":6},"\u002Fdevices\u002Foverview\u002F","05.devices\u002F00.overview",{"title":393,"path":394,"page":51,"children":395},"Heater-shakers","\u002Fdevices\u002Fheater-shakers\u002F",[396,417,427],{"title":397,"path":398,"stem":399,"device":400},"QInstruments BioShake","\u002Fdevices\u002Fqinstruments-bioshake\u002F","05.devices\u002F10.qinstruments-bioshake",{"slug":401,"vendor":402,"category":403,"connector":401,"package":404,"models":405,"communication":412,"vendor_software":6,"os":413},"qinstruments-bioshake","QInstruments","Plate Shakers & Temperature Control","unitelabs-qinstruments-bioshake",[406,407,408,409,410,411],"BioShake 3000 \u002F 3000 elm \u002F 3000 elm DWP","BioShake 3000-T \u002F 3000-T elm","BioShake 5000 elm","BioShake D30 \u002F D30 elm \u002F D30-T \u002F D30-T elm","BioShake Q1 \u002F Q1 (1.2 mm) \u002F Q1 (3.0 mm) \u002F Q2","HeatPlate","serial (RS-232 over USB)",[414,415,416],"windows","linux","macos",{"title":418,"path":419,"stem":420,"device":421},"QInstruments ColdPlate","\u002Fdevices\u002Fqinstruments-coldplate\u002F","05.devices\u002F20.qinstruments-coldplate",{"slug":422,"vendor":402,"category":403,"connector":401,"package":404,"models":423,"communication":412,"vendor_software":6,"os":426},"qinstruments-coldplate",[424,425],"ColdPlate","ColdPlate slim",[414,415,416],{"title":428,"path":429,"stem":430,"device":431},"Inheco Thermoshake","\u002Fdevices\u002Finheco-thermoshake\u002F","05.devices\u002F30.inheco-thermoshake",{"slug":432,"vendor":433,"category":403,"connector":434,"models":435},"inheco-thermoshake","Inheco","inheco-tec-controller",[436,437,438,439],"Thermoshake AC","Thermoshake AC LC","Thermoshake Classic","Thermoshake RM",{"title":441,"path":442,"page":51,"children":443},"Incubation","\u002Fdevices\u002Fincubation\u002F",[444],{"title":445,"path":446,"stem":447,"device":448},"Inheco SCILA","\u002Fdevices\u002Finheco-scila\u002F","05.devices\u002F40.inheco-scila",{"slug":449,"vendor":433,"category":441,"connector":449,"models":450},"inheco-scila",[451,452],"SCILA","SCILA MIX 2-gas mixing device",{"title":454,"path":455,"page":51,"children":456},"Thermal cyclers","\u002Fdevices\u002Fthermal-cyclers\u002F",[457],{"title":458,"path":459,"stem":460,"device":461},"Inheco ODTC","\u002Fdevices\u002Finheco-odtc\u002F","05.devices\u002F50.inheco-odtc",{"slug":462,"vendor":433,"category":463,"connector":462,"models":464},"inheco-odtc","Thermal Cycler",[465,466,467,468],"ODTC 96","ODTC 96XL","ODTC 384","ODTC 384XL",{"title":470,"path":471,"page":51,"children":472},"Readers","\u002Fdevices\u002Freaders\u002F",[473,482,491],{"title":474,"path":475,"stem":476,"device":477},"Agilent Biotek Gen5","\u002Fdevices\u002Fbiotek-gen5\u002F","05.devices\u002F60.biotek-gen5",{"slug":478,"vendor":479,"category":480,"connector":481},"biotek-gen5","Agilent","Readers & Imagers","gen5",{"title":483,"path":484,"stem":485,"device":486},"Biotek Synergy H1","\u002Fdevices\u002Fbiotek-synergy-h1\u002F","05.devices\u002F70.biotek-synergy-h1",{"slug":487,"vendor":479,"category":480,"connector":488,"models":489},"biotek-synergy-h1","agilent-synergy-h1",[490],"BioTek Synergy H1",{"title":492,"path":493,"stem":494,"device":495},"Tecan Infinite 200","\u002Fdevices\u002Ftecan-infinite-200\u002F","05.devices\u002F75.tecan-infinite-200",{"slug":496,"vendor":497,"category":480,"connector":496,"package":498,"models":499,"communication":503,"vendor_software":504,"os":505},"tecan-infinite-200","Tecan","unitelabs-tecan-infinite-200",[500,501,502],"Infinite F200","Infinite M200","Infinite M200 Pro","USB","i-control on Windows only, for its USB driver",[414,415,416],{"title":507,"path":508,"page":51,"children":509},"Tilt & turn","\u002Fdevices\u002Ftilt-and-turn\u002F",[510,520],{"title":511,"path":512,"stem":513,"device":514},"QInstruments TiltStation","\u002Fdevices\u002Fqinstruments-tiltstation\u002F","05.devices\u002F80.qinstruments-tiltstation",{"slug":515,"vendor":402,"category":516,"connector":401,"package":404,"models":517,"communication":412,"vendor_software":6,"os":519},"qinstruments-tiltstation","Plate Tilting",[518],"TiltStation",[414,415,416],{"title":521,"path":522,"stem":523,"device":524},"QInstruments TurnStation","\u002Fdevices\u002Fqinstruments-turnstation\u002F","05.devices\u002F90.qinstruments-turnstation",{"slug":525,"vendor":402,"category":526,"connector":401,"package":404,"models":527,"communication":412,"vendor_software":6,"os":529},"qinstruments-turnstation","Plate Rotating",[528],"TurnStation",[414,415,416],{"title":531,"path":532,"page":51,"children":533},"Robots","\u002Fdevices\u002Frobots\u002F",[534],{"title":535,"path":536,"stem":537,"device":538},"Brooks PreciseFlex 400","\u002Fdevices\u002Fbrooks-preciseflex-400\u002F","05.devices\u002F95.brooks-preciseflex-400",{"slug":539,"vendor":540,"category":531,"connector":539,"package":541,"models":542,"communication":546,"vendor_software":6,"os":547},"brooks-preciseflex-400","Brooks Automation","unitelabs-brooks-preciseflex-400",[543,544,545],"PreciseFlex 400, standard reach, 400 \u002F 750 \u002F 1160 mm Z","PreciseFlex 400, extended reach (XR), 400 \u002F 750 \u002F 1160 mm Z","Either on a PreciseFlex linear rail (1.0, 1.5 or 2.0 m)","Ethernet (TCP)",[414,415,416],{"title":549,"device":6,"path":550,"stem":551,"children":552,"page":51},"Liquid Handling and Robots","\u002Fliquid-handling-and-robots\u002F","06.liquid-handling-and-robots",[553,556,568,592,595,640,669,686,703,725],{"title":365,"path":554,"stem":555,"device":6},"\u002Fliquid-handling-and-robots\u002Foverview\u002F","06.liquid-handling-and-robots\u002F00.overview",{"title":286,"device":6,"path":557,"stem":558,"children":559,"page":51},"\u002Fliquid-handling-and-robots\u002Fdeck\u002F","06.liquid-handling-and-robots\u002F10.deck",[560,564],{"title":561,"path":562,"stem":563,"device":6},"Building a Deck","\u002Fliquid-handling-and-robots\u002Fdeck\u002Fbuilding-a-deck\u002F","06.liquid-handling-and-robots\u002F10.deck\u002F10.building-a-deck",{"title":565,"path":566,"stem":567,"device":6},"Save\u002FLoad a Deck","\u002Fliquid-handling-and-robots\u002Fdeck\u002Fsave-load-deck\u002F","06.liquid-handling-and-robots\u002F10.deck\u002F20.save-load-deck",{"title":569,"device":6,"path":570,"stem":571,"children":572,"page":51},"Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting",[573,577,581,585,588],{"title":574,"path":575,"stem":576,"device":6},"Basic Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F10.basic-pipetting",{"title":578,"path":579,"stem":580,"device":6},"Advanced Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fadvanced-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F20.advanced-pipetting",{"title":582,"path":583,"stem":584,"device":6},"Tip Handling","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F30.tip-handling",{"title":298,"path":586,"stem":587,"device":6},"\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F40.liquid-classes",{"title":589,"path":590,"stem":591,"device":6},"Labware Transport","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Flabware-transport\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F50.labware-transport",{"title":310,"path":593,"stem":594,"device":6},"\u002Fliquid-handling-and-robots\u002Fsimulation\u002F","06.liquid-handling-and-robots\u002F30.simulation",{"title":596,"device":6,"path":597,"stem":598,"children":599,"page":51},"Hamilton STAR","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star",[600,604,608,612,616,620,624,628,632,636],{"title":601,"path":602,"stem":603,"device":6},"Positioning & Movement","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fpositioning\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F10.positioning",{"title":605,"path":606,"stem":607,"device":6},"Gripper Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcore-gripper\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F20.core-gripper",{"title":609,"path":610,"stem":611,"device":6},"iSWAP Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fiswap\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F30.iswap",{"title":613,"path":614,"stem":615,"device":6},"Using TADM","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Ftadm\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F40.tadm",{"title":617,"path":618,"stem":619,"device":6},"Autoload Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fautoload\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F50.autoload",{"title":621,"path":622,"stem":623,"device":6},"Waste Block","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fwaste-block\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F60.waste-block",{"title":625,"path":626,"stem":627,"device":6},"Complex Mixing","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcomplex-mixing\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F66.complex-mixing",{"title":629,"path":630,"stem":631,"device":6},"Teaching Gripper Paddle Positions","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fgripper-positions\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F70.gripper-positions",{"title":633,"path":634,"stem":635,"device":6},"Training a Custom Deck Position With the iSWAP","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcustom-deck-position\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F75.custom-deck-position",{"title":637,"path":638,"stem":639,"device":6},"Observable Commands","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fobservable-commands\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F80.observable-commands",{"title":641,"device":6,"path":642,"stem":643,"children":644,"page":51},"Hamilton Vantage","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage",[645,649,653,657,661,665],{"title":646,"path":647,"stem":648,"device":6},"Waste Configuration","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fwaste-configuration\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F05.waste-configuration",{"title":650,"path":651,"stem":652,"device":6},"Covers and Lights","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fcovers-and-lights\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F10.covers-and-lights",{"title":654,"path":655,"stem":656,"device":6},"IDL Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fidl\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F20.idl",{"title":658,"path":659,"stem":660,"device":6},"IPG Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fipg\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F30.ipg",{"title":662,"path":663,"stem":664,"device":6},"XL Pipettes","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fxl-channels\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F40.xl-channels",{"title":666,"path":667,"stem":668,"device":6},"CO-RE 96 Head","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fcore96-head\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F50.core96-head",{"title":670,"device":6,"path":671,"stem":672,"children":673,"page":51},"Agilent Bravo","\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo",[674,677,680,683],{"title":582,"path":675,"stem":676,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F10.tip-handling",{"title":574,"path":678,"stem":679,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F20.basic-pipetting",{"title":298,"path":681,"stem":682,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F25.liquid-classes",{"title":605,"path":684,"stem":685,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fusing-the-gripper\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F30.using-the-gripper",{"title":687,"device":6,"path":688,"stem":689,"children":690,"page":51},"Tecan FluentControl","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol",[691,695,699],{"title":692,"path":693,"stem":694,"device":6},"Connect & Run a Method","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Fconnect-and-run\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F10.connect-and-run",{"title":696,"path":697,"stem":698,"device":6},"Sending XML Commands","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Fsending-xml-commands\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F20.sending-xml-commands",{"title":700,"path":701,"stem":702,"device":6},"Full Workflow Example","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Ffull-workflow-example\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F30.full-workflow-example",{"title":704,"device":6,"path":705,"stem":706,"children":707,"page":51},"Tecan Freedom EVO","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo",[708,712,715,718,722],{"title":709,"path":710,"stem":711,"device":6},"Deck & Carriers","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fdeck-and-carriers\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F10.deck-and-carriers",{"title":582,"path":713,"stem":714,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F20.tip-handling",{"title":574,"path":716,"stem":717,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F30.basic-pipetting",{"title":719,"path":720,"stem":721,"device":6},"Using the Gripper (RoMa)","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fusing-the-gripper\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F40.using-the-gripper",{"title":298,"path":723,"stem":724,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F50.liquid-classes",{"title":535,"device":6,"path":726,"stem":727,"children":728,"page":51},"\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400",[729,733,737],{"title":730,"path":731,"stem":732,"device":6},"Teach Positions","\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002Fteach-positions\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400\u002F10.teach-positions",{"title":734,"path":735,"stem":736,"device":6},"Move a Plate","\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002Fmove-a-plate\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400\u002F20.move-a-plate",{"title":738,"path":739,"stem":740,"device":6},"Recover from a Stop","\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002Frecover-from-a-stop\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400\u002F30.recover-from-a-stop",{"title":290,"device":6,"path":742,"stem":743,"children":744,"page":51},"\u002Flabware\u002F","07.labware",[745,748,752,756,760,764,768,772,776,785],{"title":365,"path":746,"stem":747,"device":6},"\u002Flabware\u002Foverview\u002F","07.labware\u002F00.overview",{"title":749,"path":750,"stem":751,"device":6},"Supported Labware","\u002Flabware\u002Fsupported-labware\u002F","07.labware\u002F05.supported-labware",{"title":753,"path":754,"stem":755,"device":6},"Standard Labware","\u002Flabware\u002Fstandard-labware\u002F","07.labware\u002F10.standard-labware",{"title":757,"path":758,"stem":759,"device":6},"Plates","\u002Flabware\u002Fplates\u002F","07.labware\u002F20.plates",{"title":761,"path":762,"stem":763,"device":6},"Tips and Tip Racks","\u002Flabware\u002Ftips-and-racks\u002F","07.labware\u002F30.tips-and-racks",{"title":765,"path":766,"stem":767,"device":6},"Tubes and Tube Racks","\u002Flabware\u002Ftubes-and-tube-racks\u002F","07.labware\u002F40.tubes-and-tube-racks",{"title":769,"path":770,"stem":771,"device":6},"Troughs","\u002Flabware\u002Ftroughs\u002F","07.labware\u002F50.troughs",{"title":773,"path":774,"stem":775,"device":6},"Carriers and Adapters","\u002Flabware\u002Fcarriers-and-adapters\u002F","07.labware\u002F60.carriers-and-adapters",{"title":777,"device":6,"path":778,"stem":779,"children":780,"page":51},"Hamilton","\u002Flabware\u002Fhamilton\u002F","07.labware\u002F70.hamilton",[781],{"title":782,"path":783,"stem":784,"device":6},"Hamilton MFX Carriers","\u002Flabware\u002Fhamilton\u002Fmfx-carriers\u002F","07.labware\u002F70.hamilton\u002F10.mfx-carriers",{"title":786,"path":787,"stem":788,"device":6},"Shapes","\u002Flabware\u002Fshapes\u002F","07.labware\u002F80.shapes",{"title":790,"device":6,"path":791,"stem":792,"children":793},"Connector Development (CDK)","\u002Fconnector-development\u002F","20.connector-development",[794,796,816,849,873,929],{"title":365,"path":791,"stem":795,"device":6},"20.connector-development\u002Findex",{"title":797,"path":798,"stem":799,"children":800,"page":51},"Getting Started","\u002Fconnector-development\u002Fgetting-started\u002F","20.connector-development\u002F10.getting-started",[801,804,808,812],{"title":365,"path":802,"stem":803,"device":6},"\u002Fconnector-development\u002Fgetting-started\u002Foverview\u002F","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":805,"path":806,"stem":807,"device":6},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new\u002F","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":809,"path":810,"stem":811,"device":6},"Installation","\u002Fconnector-development\u002Fgetting-started\u002Finstallation\u002F","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":813,"path":814,"stem":815,"device":6},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing\u002F","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":817,"path":818,"stem":819,"children":820,"page":51},"Tutorial","\u002Fconnector-development\u002Ftutorial\u002F","20.connector-development\u002F20.tutorial",[821,825,829,833,837,841,845],{"title":822,"path":823,"stem":824,"device":6},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough\u002F","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":826,"path":827,"stem":828,"device":6},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F15.sila-endpoints",{"title":830,"path":831,"stem":832,"device":6},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":834,"path":835,"stem":836,"device":6},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols\u002F","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":838,"path":839,"stem":840,"device":6},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types\u002F","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":842,"path":843,"stem":844,"device":6},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication\u002F","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":846,"path":847,"stem":848,"device":6},"Build a SiLA client","\u002Fconnector-development\u002Ftutorial\u002Fbuild-a-sila-client\u002F","20.connector-development\u002F20.tutorial\u002F95.build-a-sila-client",{"title":206,"device":6,"path":850,"stem":851,"children":852,"page":51},"\u002Fconnector-development\u002Fconcepts\u002F","20.connector-development\u002F30.concepts",[853,857,861,865,869],{"title":854,"path":855,"stem":856,"device":6},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila\u002F","20.connector-development\u002F30.concepts\u002F00.sila",{"title":858,"path":859,"stem":860,"device":6},"Designing Features","\u002Fconnector-development\u002Fconcepts\u002Ffeatures\u002F","20.connector-development\u002F30.concepts\u002F10.features",{"title":862,"path":863,"stem":864,"device":6},"Designing Endpoints","\u002Fconnector-development\u002Fconcepts\u002Fsila-endpoints\u002F","20.connector-development\u002F30.concepts\u002F15.sila-endpoints",{"title":866,"path":867,"stem":868,"device":6},"Designing Data Types","\u002Fconnector-development\u002Fconcepts\u002Fdata-types\u002F","20.connector-development\u002F30.concepts\u002F20.data-types",{"title":870,"path":871,"stem":872,"device":6},"Connector Architecture","\u002Fconnector-development\u002Fconcepts\u002Farchitecture\u002F","20.connector-development\u002F30.concepts\u002F30.architecture",{"title":874,"path":875,"stem":876,"children":877,"page":51},"Guides","\u002Fconnector-development\u002Fguides\u002F","20.connector-development\u002F40.guides",[878,882,886,890,894,898,902,906,910,914,918,921,925],{"title":879,"path":880,"stem":881,"device":6},"Project Structure","\u002Fconnector-development\u002Fguides\u002Fproject-structure\u002F","20.connector-development\u002F40.guides\u002F10.project-structure",{"title":883,"path":884,"stem":885,"device":6},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration\u002F","20.connector-development\u002F40.guides\u002F20.configuration",{"title":887,"path":888,"stem":889,"device":6},"Logging","\u002Fconnector-development\u002Fguides\u002Flogging\u002F","20.connector-development\u002F40.guides\u002F21.logging",{"title":891,"path":892,"stem":893,"device":6},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment\u002F","20.connector-development\u002F40.guides\u002F30.deployment",{"title":895,"path":896,"stem":897,"device":6},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity\u002F","20.connector-development\u002F40.guides\u002F40.security",{"title":899,"path":900,"stem":901,"device":6},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions\u002F","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":903,"path":904,"stem":905,"device":6},"Execution Modes","\u002Fconnector-development\u002Fguides\u002Fexecution-modes\u002F","20.connector-development\u002F40.guides\u002F46.execution-modes",{"title":907,"path":908,"stem":909,"device":6},"Constraints and Units","\u002Fconnector-development\u002Fguides\u002Fconstraints-and-units\u002F","20.connector-development\u002F40.guides\u002F47.constraints-and-units",{"title":911,"path":912,"stem":913,"device":6},"Device Variants","\u002Fconnector-development\u002Fguides\u002Fdevice-variants\u002F","20.connector-development\u002F40.guides\u002F48.device-variants",{"title":915,"path":916,"stem":917,"device":6},"Repeated Modules","\u002Fconnector-development\u002Fguides\u002Frepeated-modules\u002F","20.connector-development\u002F40.guides\u002F49.repeated-modules",{"title":314,"path":919,"stem":920,"device":6},"\u002Fconnector-development\u002Fguides\u002Ferror-handling\u002F","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":922,"path":923,"stem":924,"device":6},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting\u002F","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":926,"path":927,"stem":928,"device":6},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting\u002F","20.connector-development\u002F40.guides\u002F80.testing",{"title":930,"device":6,"path":931,"stem":932,"children":933},"References","\u002Fconnector-development\u002Freference\u002F","20.connector-development\u002F50.reference\u002Findex",[934,935,939,943,947,951],{"title":930,"path":931,"stem":932,"device":6},{"title":936,"path":937,"stem":938,"device":6},"Naming Conventions","\u002Fconnector-development\u002Freference\u002Fnaming-conventions\u002F","20.connector-development\u002F50.reference\u002F10.naming-conventions",{"title":940,"path":941,"stem":942,"device":6},"Docstring Format","\u002Fconnector-development\u002Freference\u002Fdocstrings\u002F","20.connector-development\u002F50.reference\u002F20.docstrings",{"title":944,"path":945,"stem":946,"device":6},"Feature Metadata","\u002Fconnector-development\u002Freference\u002Ffeature-metadata\u002F","20.connector-development\u002F50.reference\u002F30.feature-metadata",{"title":948,"path":949,"stem":950,"device":6},"Review Checklist","\u002Fconnector-development\u002Freference\u002Freview-checklist\u002F","20.connector-development\u002F50.reference\u002F90.review-checklist",{"title":952,"path":953,"stem":954,"device":6},"Python Environment and Project Management","\u002Fconnector-development\u002Freference\u002Fpython-environment-management\u002F","20.connector-development\u002F50.reference\u002F99.python-environment-management",{"id":956,"title":952,"body":957,"description":3360,"device":6,"extension":3361,"links":6,"meta":3362,"navigation":3363,"path":3364,"seo":3365,"stem":954,"type":3366,"__hash__":3367},"docs\u002F20.connector-development\u002F50.reference\u002F99.python-environment-management.md",{"type":958,"value":959,"toc":3342},"minimark",[960,964,969,999,1031,1058,1062,1223,1256,1260,1265,1361,1364,1368,1526,1528,1532,1668,1670,1674,1750,1752,1756,1889,1891,1895,1981,1983,1987,2358,2360,2364,2647,2649,2653,2861,2863,2867,3081,3083,3087,3260,3262,3266,3338],[961,962,963],"p",{},"The python community's offering of tooling for environment and project management provides semi-overlapping coverage of different use-cases and workflows. Choosing the \"correct\" tool depends strongly on the use-cases and workflows that one relies on for day-to-day development. This article aims to guide users in choosing which tool to use for common development tasks.",[965,966,968],"h2",{"id":967},"library-summary","Library Summary",[961,970,971,975,976,978,979,982,983,985,986,989,990],{},[972,973,974],"code",{},"uv"," offers a simplified interface for package and project management with a universal lockfile to ensure reproducible environments. ",[972,977,974],{}," while being relatively new to the scene has taken the python community by storm with a value proposition of 10-100x faster dependency resolution than ",[972,980,981],{},"pip",". Since then, Astral, the company backing both ",[972,984,974],{}," and ",[972,987,988],{},"ruff",", has grown the library to cover many of the most common project management use-cases. It should be noted that Astral is a company which intends to keep its tools free and develop paid-for services on top of its open-source tooling.\nFind out more in the ",[991,992,998],"a",{"href":993,"rel":994,"target":997},"https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002F",[995,996],"nofollow","noopener","_blank","official uv documentation",[961,1000,1001,1004,1005,1007,1008,1013,1014,1016,1017,1019,1020,1022,1023,1025,1026],{},[972,1002,1003],{},"hatch"," is designed for creating and managing multiple environments for different use-cases, allowing for greater flexibility in project management. ",[972,1006,1003],{}," is designed for extensibility with ",[991,1009,1012],{"href":1010,"rel":1011,"target":997},"https:\u002F\u002Fhatch.pypa.io\u002Flatest\u002Fplugins\u002Fabout\u002F",[995,996],"plugins"," for customizing behavior. It can be easily configured to use ",[972,1015,974],{}," for environment creation and dependency resolution, meaning ",[972,1018,1003],{}," users can enjoy many of ",[972,1021,974],{},"s convenience features and optimizations while maintaining the higher degree of customization offered by ",[972,1024,1003],{},".\nFind out more in the ",[991,1027,1030],{"href":1028,"rel":1029,"target":997},"https:\u002F\u002Fhatch.pypa.io\u002F",[995,996],"official hatch documentation",[961,1032,1033,1036,1037,985,1040,1043,1044,1046,1047,1052,1053],{},[972,1034,1035],{},"poetry","'s offering is almost purely limited to packaging and dependency management and does not contain many of the project management goodies that the other tools explored in this article offer. It is a hold-out of the previous generation of environment management tools, among the likes of ",[972,1038,1039],{},"pipenv",[972,1041,1042],{},"pyenv",". ",[972,1045,1035],{}," is only ",[991,1048,1051],{"href":1049,"rel":1050,"target":997},"https:\u002F\u002Fpeps.python.org\u002Fpep-0621\u002F",[995,996],"PEP-621"," compliant for versions later than 2.0.\nFind out more in the ",[991,1054,1057],{"href":1055,"rel":1056,"target":997},"https:\u002F\u002Fpython-poetry.org\u002F",[995,996],"official poetry documentation",[965,1059,1061],{"id":1060},"feature-comparison","Feature Comparison",[1063,1064,1065,1081],"table",{},[1066,1067,1068],"thead",{},[1069,1070,1071,1075,1077,1079],"tr",{},[1072,1073,1074],"th",{},"Feature",[1072,1076,974],{},[1072,1078,1003],{},[1072,1080,1035],{},[1082,1083,1084,1098,1119,1134,1147,1169,1189,1208],"tbody",{},[1069,1085,1086,1090,1093,1095],{},[1087,1088,1089],"td",{},"Handles python installation",[1087,1091,1092],{},"yes",[1087,1094,1092],{},[1087,1096,1097],{},"no",[1069,1099,1100,1103,1114,1117],{},[1087,1101,1102],{},"Environment scope",[1087,1104,1105,1106],{},"one env per project",[1107,1108,1110],"sup",{"id":1109},"user-content-backref-1",[991,1111,1113],{"href":1112},"#user-content-fn-1","1",[1087,1115,1116],{},"one env per use-case",[1087,1118,1105],{},[1069,1120,1121,1124,1126,1132],{},[1087,1122,1123],{},"Dependency Lock",[1087,1125,1092],{},[1087,1127,1128],{},[991,1129,1092],{"href":1130,"rel":1131,"target":997},"https:\u002F\u002Fhatch.pypa.io\u002F1.18\u002Fhow-to\u002Fenvironment\u002Flockfiles\u002F",[995,996],[1087,1133,1092],{},[1069,1135,1136,1139,1142,1145],{},[1087,1137,1138],{},"Auto-updating dependencies",[1087,1140,1141],{},"yes -- complete sync must be actively prevented by user",[1087,1143,1144],{},"yes -- constraint check updates only when current env violates declared dependencies",[1087,1146,1097],{},[1069,1148,1149,1152,1161,1167],{},[1087,1150,1151],{},"Command-line aliases",[1087,1153,1097,1154],{},[1107,1155,1157],{"id":1156},"user-content-backref-2",[991,1158,1160],{"href":1159},"#user-content-fn-2","3",[1087,1162,1163],{},[991,1164,1092],{"href":1165,"rel":1166,"target":997},"https:\u002F\u002Fhatch.pypa.io\u002Flatest\u002Fconfig\u002Fenvironment\u002Foverview\u002F#scripts",[995,996],[1087,1168,1097],{},[1069,1170,1171,1174,1181,1187],{},[1087,1172,1173],{},"Inline-metadata scripting",[1087,1175,1176,1180],{},[991,1177,1092],{"href":1178,"rel":1179,"target":997},"https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002Fguides\u002Fscripts\u002F",[995,996]," -- can add and modify dependency blocks via CLI",[1087,1182,1183],{},[991,1184,1092],{"href":1185,"rel":1186,"target":997},"https:\u002F\u002Fhatch.pypa.io\u002Flatest\u002Fhow-to\u002Frun\u002Fpython-scripts\u002F",[995,996],[1087,1188,1097],{},[1069,1190,1191,1194,1200,1206],{},[1087,1192,1193],{},"Workspace support (shared environment across multiple projects)",[1087,1195,1196],{},[991,1197,1092],{"href":1198,"rel":1199,"target":997},"https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002Fconcepts\u002Fprojects\u002Fworkspaces\u002F",[995,996],[1087,1201,1202],{},[991,1203,1092],{"href":1204,"rel":1205,"target":997},"https:\u002F\u002Fhatch.pypa.io\u002Flatest\u002Fhow-to\u002Fenvironment\u002Fworkspace\u002F",[995,996],[1087,1207,1097],{},[1069,1209,1210,1213,1215,1221],{},[1087,1211,1212],{},"ENVVAR configuration",[1087,1214,1097],{},[1087,1216,1217],{},[991,1218,1092],{"href":1219,"rel":1220,"target":997},"https:\u002F\u002Fhatch.pypa.io\u002Flatest\u002Fconfig\u002Fenvironment\u002Foverview\u002F#environment-variables",[995,996],[1087,1222,1097],{},[1224,1225,1226,1239],"ol",{},[1227,1228,1229,1234,1235],"li",{},[1230,1231,1233],"span",{"id":1232},"user-content-fn-1","For non-workspace usage."," ",[991,1236,1238],{"href":1237},"#user-content-backref-1","↩",[1227,1240,1241,1234,1253],{},[1230,1242,1244,1245,1247,1248],{"id":1243},"user-content-fn-2","Astral, the company behind ",[972,1246,974],{},", has said that they are planning support for this feature since ",[991,1249,1252],{"href":1250,"rel":1251,"target":997},"https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fuv\u002Fissues\u002F5903",[995,996],"August 2024",[991,1254,1238],{"href":1255},"#user-content-backref-2",[965,1257,1259],{"id":1258},"command-comparison","Command Comparison",[1261,1262,1264],"h3",{"id":1263},"create-a-new-project","Create a new project",[1266,1267,1268,1310,1334],"tabs",{},[1269,1270,1272,1299],"div",{"icon":1271,"label":974},"i-simple-icons-uv",[1273,1274,1279],"pre",{"className":1275,"code":1276,"language":1277,"meta":1278,"style":1278},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","uv init --lib my-app\n","bash","",[972,1280,1281],{"__ignoreMap":1278},[1230,1282,1285,1288,1292,1296],{"class":1283,"line":1284},"line",1,[1230,1286,974],{"class":1287},"sNqAu",[1230,1289,1291],{"class":1290},"sCx38"," init",[1230,1293,1295],{"class":1294},"sOiAX"," --lib",[1230,1297,1298],{"class":1290}," my-app\n",[961,1300,1301,1302,1305,1306,1309],{},"The ",[972,1303,1304],{},"--lib"," arg is required for the ",[972,1307,1308],{},"src\u002F"," directory layout.",[1269,1311,1313,1327],{"icon":1312,"label":1003},"i-simple-icons-python",[1273,1314,1316],{"className":1275,"code":1315,"language":1277,"meta":1278,"style":1278},"hatch new my-app\n",[972,1317,1318],{"__ignoreMap":1278},[1230,1319,1320,1322,1325],{"class":1283,"line":1284},[1230,1321,1003],{"class":1287},[1230,1323,1324],{"class":1290}," new",[1230,1326,1298],{"class":1290},[961,1328,1329,1331,1332,1309],{},[972,1330,1003],{}," defaults to the ",[972,1333,1308],{},[1269,1335,1337,1354],{"icon":1336,"label":1035},"i-simple-icons-poetry",[1273,1338,1340],{"className":1275,"code":1339,"language":1277,"meta":1278,"style":1278},"poetry new my-app --src\n",[972,1341,1342],{"__ignoreMap":1278},[1230,1343,1344,1346,1348,1351],{"class":1283,"line":1284},[1230,1345,1035],{"class":1287},[1230,1347,1324],{"class":1290},[1230,1349,1350],{"class":1290}," my-app",[1230,1352,1353],{"class":1294}," --src\n",[961,1355,1301,1356,1305,1359,1309],{},[972,1357,1358],{},"--src",[972,1360,1308],{},[1362,1363],"hr",{},[1261,1365,1367],{"id":1366},"install-environment","Install environment",[1266,1369,1370,1439,1487],{},[1269,1371,1372,1375,1390,1393],{"icon":1271,"label":974},[961,1373,1374],{},"If a lock is present:",[1273,1376,1378],{"className":1275,"code":1377,"language":1277,"meta":1278,"style":1278},"uv sync --all-extras\n",[972,1379,1380],{"__ignoreMap":1278},[1230,1381,1382,1384,1387],{"class":1283,"line":1284},[1230,1383,974],{"class":1287},[1230,1385,1386],{"class":1290}," sync",[1230,1388,1389],{"class":1294}," --all-extras\n",[961,1391,1392],{},"Otherwise, to create a lock:",[1273,1394,1396],{"className":1275,"code":1395,"language":1277,"meta":1278,"style":1278},"uv venv --python \u003Cversion>\nuv lock\nuv sync --all-extras\n",[972,1397,1398,1422,1430],{"__ignoreMap":1278},[1230,1399,1400,1402,1405,1408,1412,1415,1419],{"class":1283,"line":1284},[1230,1401,974],{"class":1287},[1230,1403,1404],{"class":1290}," venv",[1230,1406,1407],{"class":1294}," --python",[1230,1409,1411],{"class":1410},"sxkbv"," \u003C",[1230,1413,1414],{"class":1290},"versio",[1230,1416,1418],{"class":1417},"sc-9e","n",[1230,1420,1421],{"class":1410},">\n",[1230,1423,1425,1427],{"class":1283,"line":1424},2,[1230,1426,974],{"class":1287},[1230,1428,1429],{"class":1290}," lock\n",[1230,1431,1433,1435,1437],{"class":1283,"line":1432},3,[1230,1434,974],{"class":1287},[1230,1436,1386],{"class":1290},[1230,1438,1389],{"class":1294},[1269,1440,1441,1452,1477],{"icon":1312,"label":1003},[961,1442,1443,1444,1447,1448,1451],{},"Actively create a named environment. Environment names are declared in ",[972,1445,1446],{},"pyproject.toml"," or ",[972,1449,1450],{},"hatch.toml"," file.",[1273,1453,1455],{"className":1275,"code":1454,"language":1277,"meta":1278,"style":1278},"hatch env create \u003Cenv>\n",[972,1456,1457],{"__ignoreMap":1278},[1230,1458,1459,1461,1464,1467,1469,1472,1475],{"class":1283,"line":1284},[1230,1460,1003],{"class":1287},[1230,1462,1463],{"class":1290}," env",[1230,1465,1466],{"class":1290}," create",[1230,1468,1411],{"class":1410},[1230,1470,1471],{"class":1290},"en",[1230,1473,1474],{"class":1417},"v",[1230,1476,1421],{"class":1410},[961,1478,1479,1480,1482,1483,1486],{},"Or one can allow ",[972,1481,1003],{}," to create an environment on-the-fly when calling ",[972,1484,1485],{},"hatch run",".",[1269,1488,1489,1491,1505,1507],{"icon":1336,"label":1035},[961,1490,1374],{},[1273,1492,1494],{"className":1275,"code":1493,"language":1277,"meta":1278,"style":1278},"poetry install --all-extras\n",[972,1495,1496],{"__ignoreMap":1278},[1230,1497,1498,1500,1503],{"class":1283,"line":1284},[1230,1499,1035],{"class":1287},[1230,1501,1502],{"class":1290}," install",[1230,1504,1389],{"class":1294},[961,1506,1392],{},[1273,1508,1510],{"className":1275,"code":1509,"language":1277,"meta":1278,"style":1278},"poetry lock\npoetry install --all-extras\n",[972,1511,1512,1518],{"__ignoreMap":1278},[1230,1513,1514,1516],{"class":1283,"line":1284},[1230,1515,1035],{"class":1287},[1230,1517,1429],{"class":1290},[1230,1519,1520,1522,1524],{"class":1283,"line":1424},[1230,1521,1035],{"class":1287},[1230,1523,1502],{"class":1290},[1230,1525,1389],{"class":1294},[1362,1527],{},[1261,1529,1531],{"id":1530},"list-environments","List environments",[1266,1533,1534,1564,1622],{},[1269,1535,1536,1543],{"icon":1271,"label":974},[961,1537,1538,1539,1542],{},"N\u002FA The default location of the created environment is the ",[972,1540,1541],{},".venv"," directory.\nTo configure an alternative path:",[1273,1544,1546],{"className":1275,"code":1545,"language":1277,"meta":1278,"style":1278},"uv venv \u003Cpath>\n",[972,1547,1548],{"__ignoreMap":1278},[1230,1549,1550,1552,1554,1556,1559,1562],{"class":1283,"line":1284},[1230,1551,974],{"class":1287},[1230,1553,1404],{"class":1290},[1230,1555,1411],{"class":1410},[1230,1557,1558],{"class":1290},"pat",[1230,1560,1561],{"class":1417},"h",[1230,1563,1421],{"class":1410},[1269,1565,1566,1569,1586,1595,1601],{"icon":1312,"label":1003},[961,1567,1568],{},"List all environments:",[1273,1570,1572],{"className":1275,"code":1571,"language":1277,"meta":1278,"style":1278},"hatch env show -i\n",[972,1573,1574],{"__ignoreMap":1278},[1230,1575,1576,1578,1580,1583],{"class":1283,"line":1284},[1230,1577,1003],{"class":1287},[1230,1579,1463],{"class":1290},[1230,1581,1582],{"class":1290}," show",[1230,1584,1585],{"class":1294}," -i\n",[961,1587,1588,1591,1592,1594],{},[972,1589,1590],{},"-i"," includes ",[972,1593,1003],{},"'s internal testing and static analysis environments.",[961,1596,1597,1598,1600],{},"The directory where envs are stored can be configured, here it is set to the ",[972,1599,1541],{}," directory:",[1273,1602,1604],{"className":1275,"code":1603,"language":1277,"meta":1278,"style":1278},"hatch config set dirs.env.virtual .venv\n",[972,1605,1606],{"__ignoreMap":1278},[1230,1607,1608,1610,1613,1616,1619],{"class":1283,"line":1284},[1230,1609,1003],{"class":1287},[1230,1611,1612],{"class":1290}," config",[1230,1614,1615],{"class":1290}," set",[1230,1617,1618],{"class":1290}," dirs.env.virtual",[1230,1620,1621],{"class":1290}," .venv\n",[1269,1623,1624,1646,1651],{"icon":1336,"label":1035},[961,1625,1626,1627,1629,1630,1633,1634,1639,1640,1642,1643,1486],{},"By default ",[972,1628,1035],{}," envs are created in the ",[972,1631,1632],{},"{cache-dir}\u002Fvirtualenvs",". Check the ",[991,1635,1638],{"href":1636,"rel":1637,"target":997},"https:\u002F\u002Fpython-poetry.org\u002Fdocs\u002Fconfiguration\u002F#cache-dir",[995,996],"official documentation"," for more information about configuring ",[972,1641,1035],{},"'s ",[972,1644,1645],{},"cache-dir",[961,1647,1648,1649,1600],{},"Or configure it to use the ",[972,1650,1541],{},[1273,1652,1654],{"className":1275,"code":1653,"language":1277,"meta":1278,"style":1278},"poetry config virtualenvs.in-project true\n",[972,1655,1656],{"__ignoreMap":1278},[1230,1657,1658,1660,1662,1665],{"class":1283,"line":1284},[1230,1659,1035],{"class":1287},[1230,1661,1612],{"class":1290},[1230,1663,1664],{"class":1290}," virtualenvs.in-project",[1230,1666,1667],{"class":1294}," true\n",[1362,1669],{},[1261,1671,1673],{"id":1672},"remove-environment","Remove environment",[1266,1675,1676,1684,1732],{},[1269,1677,1678],{"icon":1271,"label":974},[961,1679,1680,1681,1683],{},"N\u002FA. There is no way to programmatically removed an environment. One must manually delete ",[972,1682,1541],{}," directory.",[1269,1685,1686,1693,1715,1718],{"icon":1312,"label":1003},[961,1687,1688,1689,1692],{},"Remove an environment named ",[972,1690,1691],{},"\u003Cenv>",":",[1273,1694,1696],{"className":1275,"code":1695,"language":1277,"meta":1278,"style":1278},"hatch env remove \u003Cenv>\n",[972,1697,1698],{"__ignoreMap":1278},[1230,1699,1700,1702,1704,1707,1709,1711,1713],{"class":1283,"line":1284},[1230,1701,1003],{"class":1287},[1230,1703,1463],{"class":1290},[1230,1705,1706],{"class":1290}," remove",[1230,1708,1411],{"class":1410},[1230,1710,1471],{"class":1290},[1230,1712,1474],{"class":1417},[1230,1714,1421],{"class":1410},[961,1716,1717],{},"Remove all environments:",[1273,1719,1721],{"className":1275,"code":1720,"language":1277,"meta":1278,"style":1278},"hatch env prune\n",[972,1722,1723],{"__ignoreMap":1278},[1230,1724,1725,1727,1729],{"class":1283,"line":1284},[1230,1726,1003],{"class":1287},[1230,1728,1463],{"class":1290},[1230,1730,1731],{"class":1290}," prune\n",[1269,1733,1734],{"icon":1336,"label":1035},[1273,1735,1737],{"className":1275,"code":1736,"language":1277,"meta":1278,"style":1278},"poetry env remove --all\n",[972,1738,1739],{"__ignoreMap":1278},[1230,1740,1741,1743,1745,1747],{"class":1283,"line":1284},[1230,1742,1035],{"class":1287},[1230,1744,1463],{"class":1290},[1230,1746,1706],{"class":1290},[1230,1748,1749],{"class":1294}," --all\n",[1362,1751],{},[1261,1753,1755],{"id":1754},"change-a-projects-python-version","Change a project's python version",[1266,1757,1758,1826,1838],{},[1269,1759,1760,1763,1786,1789],{"icon":1271,"label":974},[961,1761,1762],{},"Configure the default python version for a project:",[1273,1764,1766],{"className":1275,"code":1765,"language":1277,"meta":1278,"style":1278},"uv python pin \u003Cversion>\n",[972,1767,1768],{"__ignoreMap":1278},[1230,1769,1770,1772,1775,1778,1780,1782,1784],{"class":1283,"line":1284},[1230,1771,974],{"class":1287},[1230,1773,1774],{"class":1290}," python",[1230,1776,1777],{"class":1290}," pin",[1230,1779,1411],{"class":1410},[1230,1781,1414],{"class":1290},[1230,1783,1418],{"class":1417},[1230,1785,1421],{"class":1410},[961,1787,1788],{},"Replace the current environment with a new one with a different version of python:",[1273,1790,1792],{"className":1275,"code":1791,"language":1277,"meta":1278,"style":1278},"uv venv --python \u003Cnew_version> --refresh --clear\nuv sync --all-extras\n",[972,1793,1794,1818],{"__ignoreMap":1278},[1230,1795,1796,1798,1800,1802,1804,1807,1809,1812,1815],{"class":1283,"line":1284},[1230,1797,974],{"class":1287},[1230,1799,1404],{"class":1290},[1230,1801,1407],{"class":1294},[1230,1803,1411],{"class":1410},[1230,1805,1806],{"class":1290},"new_versio",[1230,1808,1418],{"class":1417},[1230,1810,1811],{"class":1410},">",[1230,1813,1814],{"class":1294}," --refresh",[1230,1816,1817],{"class":1294}," --clear\n",[1230,1819,1820,1822,1824],{"class":1283,"line":1424},[1230,1821,974],{"class":1287},[1230,1823,1386],{"class":1290},[1230,1825,1389],{"class":1294},[1269,1827,1828,1831],{"icon":1312,"label":1003},[961,1829,1830],{},"N\u002FA. Hatch is designed to allow multiple isolated environments. Simply run commands in the pre-configured environment with the desired version.",[961,1832,1833,1834,1486],{},"For more information about configuring an environment to run on a particular version of python, check out the ",[991,1835,1638],{"href":1836,"rel":1837,"target":997},"https:\u002F\u002Fhatch.pypa.io\u002Flatest\u002Fplugins\u002Fenvironment\u002Fvirtual\u002F#python-resolution",[995,996],[1269,1839,1840,1855],{"icon":1336,"label":1035},[961,1841,1842,1843,1845,1846,1854],{},"Changing to a different version of python with ",[972,1844,1035],{}," requires a global environment manager, e.g. ",[991,1847,1850],{"href":1848,"rel":1849,"target":997},"https:\u002F\u002Fmise.jdx.dev\u002F",[995,996],[972,1851,1853],{"style":1852},"color: green;","mise",".\nFirst remove the current env and run:",[1273,1856,1858],{"className":1275,"code":1857,"language":1277,"meta":1278,"style":1278},"mise use python@3.9\npoetry env use python3.9\npoetry install --all-extras\n",[972,1859,1860,1870,1881],{"__ignoreMap":1278},[1230,1861,1862,1864,1867],{"class":1283,"line":1284},[1230,1863,1853],{"class":1287},[1230,1865,1866],{"class":1290}," use",[1230,1868,1869],{"class":1290}," python@3.9\n",[1230,1871,1872,1874,1876,1878],{"class":1283,"line":1424},[1230,1873,1035],{"class":1287},[1230,1875,1463],{"class":1290},[1230,1877,1866],{"class":1290},[1230,1879,1880],{"class":1290}," python3.9\n",[1230,1882,1883,1885,1887],{"class":1283,"line":1432},[1230,1884,1035],{"class":1287},[1230,1886,1502],{"class":1290},[1230,1888,1389],{"class":1294},[1362,1890],{},[1261,1892,1894],{"id":1893},"list-dependencies","List dependencies",[1266,1896,1897,1933,1967],{},[1269,1898,1899,1914,1921],{"icon":1271,"label":974},[1273,1900,1902],{"className":1275,"code":1901,"language":1277,"meta":1278,"style":1278},"uv pip freeze\n",[972,1903,1904],{"__ignoreMap":1278},[1230,1905,1906,1908,1911],{"class":1283,"line":1284},[1230,1907,974],{"class":1287},[1230,1909,1910],{"class":1290}," pip",[1230,1912,1913],{"class":1290}," freeze\n",[961,1915,1916,1917,1920],{},"Or create a ",[972,1918,1919],{},"pipdeptree"," visualization of the project's dependencies:",[1273,1922,1924],{"className":1275,"code":1923,"language":1277,"meta":1278,"style":1278},"uv tree\n",[972,1925,1926],{"__ignoreMap":1278},[1230,1927,1928,1930],{"class":1283,"line":1284},[1230,1929,974],{"class":1287},[1230,1931,1932],{"class":1290}," tree\n",[1269,1934,1935,1940],{"icon":1312,"label":1003},[961,1936,1937,1938,1692],{},"For a named environment ",[972,1939,1691],{},[1273,1941,1943],{"className":1275,"code":1942,"language":1277,"meta":1278,"style":1278},"hatch run \u003Cenv>:uv pip freeze\n",[972,1944,1945],{"__ignoreMap":1278},[1230,1946,1947,1949,1952,1954,1956,1958,1960,1963,1965],{"class":1283,"line":1284},[1230,1948,1003],{"class":1287},[1230,1950,1951],{"class":1290}," run",[1230,1953,1411],{"class":1410},[1230,1955,1471],{"class":1290},[1230,1957,1474],{"class":1417},[1230,1959,1811],{"class":1410},[1230,1961,1962],{"class":1290},":uv",[1230,1964,1910],{"class":1290},[1230,1966,1913],{"class":1290},[1269,1968,1969],{"icon":1336,"label":1035},[1273,1970,1972],{"className":1275,"code":1971,"language":1277,"meta":1278,"style":1278},"poetry show\n",[972,1973,1974],{"__ignoreMap":1278},[1230,1975,1976,1978],{"class":1283,"line":1284},[1230,1977,1035],{"class":1287},[1230,1979,1980],{"class":1290}," show\n",[1362,1982],{},[1261,1984,1986],{"id":1985},"add-a-dependency","Add a dependency",[1266,1988,1989,2142,2222],{},[1269,1990,1991,2001,2013,2016,2038,2041,2058,2069,2100,2112],{"icon":1271,"label":974},[961,1992,1993,1994,1996,1997,2000],{},"Update ",[972,1995,1446],{}," and then either let ",[972,1998,1999],{},"uv run"," automatically update the environment before use or actively update the environment by running:",[1273,2002,2004],{"className":1275,"code":2003,"language":1277,"meta":1278,"style":1278},"uv sync\n",[972,2005,2006],{"__ignoreMap":1278},[1230,2007,2008,2010],{"class":1283,"line":1284},[1230,2009,974],{"class":1287},[1230,2011,2012],{"class":1290}," sync\n",[961,2014,2015],{},"Or add a standard dependency with the command-line:",[1273,2017,2019],{"className":1275,"code":2018,"language":1277,"meta":1278,"style":1278},"uv add \u003Cpackage>\n",[972,2020,2021],{"__ignoreMap":1278},[1230,2022,2023,2025,2028,2030,2033,2036],{"class":1283,"line":1284},[1230,2024,974],{"class":1287},[1230,2026,2027],{"class":1290}," add",[1230,2029,1411],{"class":1410},[1230,2031,2032],{"class":1290},"packag",[1230,2034,2035],{"class":1417},"e",[1230,2037,1421],{"class":1410},[961,2039,2040],{},"For local editable dependencies:",[1273,2042,2044],{"className":1275,"code":2043,"language":1277,"meta":1278,"style":1278},"uv add --editable \u002Fpath\u002Fto\u002Fpkg\u002F\n",[972,2045,2046],{"__ignoreMap":1278},[1230,2047,2048,2050,2052,2055],{"class":1283,"line":1284},[1230,2049,974],{"class":1287},[1230,2051,2027],{"class":1290},[1230,2053,2054],{"class":1294}," --editable",[1230,2056,2057],{"class":1290}," \u002Fpath\u002Fto\u002Fpkg\u002F\n",[961,2059,2060,2061,2064,2065,2068],{},"Add ",[972,2062,2063],{},"\u003Cpackage>"," to an ",[972,2066,2067],{},"optional-dependencies"," group:",[1273,2070,2072],{"className":1275,"code":2071,"language":1277,"meta":1278,"style":1278},"uv add --optional \u003Cgroup_name> \u003Cpackage>\n",[972,2073,2074],{"__ignoreMap":1278},[1230,2075,2076,2078,2080,2083,2085,2088,2090,2092,2094,2096,2098],{"class":1283,"line":1284},[1230,2077,974],{"class":1287},[1230,2079,2027],{"class":1290},[1230,2081,2082],{"class":1294}," --optional",[1230,2084,1411],{"class":1410},[1230,2086,2087],{"class":1290},"group_nam",[1230,2089,2035],{"class":1417},[1230,2091,1811],{"class":1410},[1230,2093,1411],{"class":1410},[1230,2095,2032],{"class":1290},[1230,2097,2035],{"class":1417},[1230,2099,1421],{"class":1410},[961,2101,2060,2102,2104,2105,2068],{},[972,2103,2063],{}," to a ",[991,2106,2109],{"href":2107,"rel":2108,"target":997},"https:\u002F\u002Fpackaging.python.org\u002Fen\u002Flatest\u002Fspecifications\u002Fdependency-groups\u002F#dependency-groups",[995,996],[972,2110,2111],{"style":1852},"dependency-groups",[1273,2113,2115],{"className":1275,"code":2114,"language":1277,"meta":1278,"style":1278},"uv add --group \u003Cgroup_name> \u003Cpackage>\n",[972,2116,2117],{"__ignoreMap":1278},[1230,2118,2119,2121,2123,2126,2128,2130,2132,2134,2136,2138,2140],{"class":1283,"line":1284},[1230,2120,974],{"class":1287},[1230,2122,2027],{"class":1290},[1230,2124,2125],{"class":1294}," --group",[1230,2127,1411],{"class":1410},[1230,2129,2087],{"class":1290},[1230,2131,2035],{"class":1417},[1230,2133,1811],{"class":1410},[1230,2135,1411],{"class":1410},[1230,2137,2032],{"class":1290},[1230,2139,2035],{"class":1417},[1230,2141,1421],{"class":1410},[1269,2143,2144,2151,2188,2191],{"icon":1312,"label":1003},[961,2145,1993,2146,2148,2149,1692],{},[972,2147,1446],{}," and then recreate the affected environment ",[972,2150,1691],{},[1273,2152,2154],{"className":1275,"code":2153,"language":1277,"meta":1278,"style":1278},"hatch env remove \u003Cenv>\nhatch env create \u003Cenv>\n",[972,2155,2156,2172],{"__ignoreMap":1278},[1230,2157,2158,2160,2162,2164,2166,2168,2170],{"class":1283,"line":1284},[1230,2159,1003],{"class":1287},[1230,2161,1463],{"class":1290},[1230,2163,1706],{"class":1290},[1230,2165,1411],{"class":1410},[1230,2167,1471],{"class":1290},[1230,2169,1474],{"class":1417},[1230,2171,1421],{"class":1410},[1230,2173,2174,2176,2178,2180,2182,2184,2186],{"class":1283,"line":1424},[1230,2175,1003],{"class":1287},[1230,2177,1463],{"class":1290},[1230,2179,1466],{"class":1290},[1230,2181,1411],{"class":1410},[1230,2183,1471],{"class":1290},[1230,2185,1474],{"class":1417},[1230,2187,1421],{"class":1410},[961,2189,2190],{},"For local editable dependencies",[1273,2192,2194],{"className":1275,"code":2193,"language":1277,"meta":1278,"style":1278},"hatch run \u003Cenv>:uv pip install -e \u002Fpath\u002Fto\u002Fpkg\n",[972,2195,2196],{"__ignoreMap":1278},[1230,2197,2198,2200,2202,2204,2206,2208,2210,2212,2214,2216,2219],{"class":1283,"line":1284},[1230,2199,1003],{"class":1287},[1230,2201,1951],{"class":1290},[1230,2203,1411],{"class":1410},[1230,2205,1471],{"class":1290},[1230,2207,1474],{"class":1417},[1230,2209,1811],{"class":1410},[1230,2211,1962],{"class":1290},[1230,2213,1910],{"class":1290},[1230,2215,1502],{"class":1290},[1230,2217,2218],{"class":1294}," -e",[1230,2220,2221],{"class":1290}," \u002Fpath\u002Fto\u002Fpkg\n",[1269,2223,2224,2229,2247,2249,2268,2270,2285,2291,2320,2329],{"icon":1336,"label":1035},[961,2225,1993,2226,2228],{},[972,2227,1446],{}," and update the environment:",[1273,2230,2231],{"className":1275,"code":1509,"language":1277,"meta":1278,"style":1278},[972,2232,2233,2239],{"__ignoreMap":1278},[1230,2234,2235,2237],{"class":1283,"line":1284},[1230,2236,1035],{"class":1287},[1230,2238,1429],{"class":1290},[1230,2240,2241,2243,2245],{"class":1283,"line":1424},[1230,2242,1035],{"class":1287},[1230,2244,1502],{"class":1290},[1230,2246,1389],{"class":1294},[961,2248,2015],{},[1273,2250,2252],{"className":1275,"code":2251,"language":1277,"meta":1278,"style":1278},"poetry add \u003Cpackage>\n",[972,2253,2254],{"__ignoreMap":1278},[1230,2255,2256,2258,2260,2262,2264,2266],{"class":1283,"line":1284},[1230,2257,1035],{"class":1287},[1230,2259,2027],{"class":1290},[1230,2261,1411],{"class":1410},[1230,2263,2032],{"class":1290},[1230,2265,2035],{"class":1417},[1230,2267,1421],{"class":1410},[961,2269,2040],{},[1273,2271,2273],{"className":1275,"code":2272,"language":1277,"meta":1278,"style":1278},"poetry add --editable \u002Fpath\u002Fto\u002Fpkg\n",[972,2274,2275],{"__ignoreMap":1278},[1230,2276,2277,2279,2281,2283],{"class":1283,"line":1284},[1230,2278,1035],{"class":1287},[1230,2280,2027],{"class":1290},[1230,2282,2054],{"class":1294},[1230,2284,2221],{"class":1290},[961,2286,2060,2287,2064,2289,2068],{},[972,2288,2063],{},[972,2290,2067],{},[1273,2292,2294],{"className":1275,"code":2293,"language":1277,"meta":1278,"style":1278},"poetry add --optional \u003Cgroup_name> \u003Cpackage>\n",[972,2295,2296],{"__ignoreMap":1278},[1230,2297,2298,2300,2302,2304,2306,2308,2310,2312,2314,2316,2318],{"class":1283,"line":1284},[1230,2299,1035],{"class":1287},[1230,2301,2027],{"class":1290},[1230,2303,2082],{"class":1294},[1230,2305,1411],{"class":1410},[1230,2307,2087],{"class":1290},[1230,2309,2035],{"class":1417},[1230,2311,1811],{"class":1410},[1230,2313,1411],{"class":1410},[1230,2315,2032],{"class":1290},[1230,2317,2035],{"class":1417},[1230,2319,1421],{"class":1410},[961,2321,2060,2322,2104,2324,2068],{},[972,2323,2063],{},[991,2325,2327],{"href":2107,"rel":2326,"target":997},[995,996],[972,2328,2111],{"style":1852},[1273,2330,2332],{"className":1275,"code":2331,"language":1277,"meta":1278,"style":1278},"poetry add --group \u003Cgroup_name> \u003Cpackage>\n",[972,2333,2334],{"__ignoreMap":1278},[1230,2335,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356],{"class":1283,"line":1284},[1230,2337,1035],{"class":1287},[1230,2339,2027],{"class":1290},[1230,2341,2125],{"class":1294},[1230,2343,1411],{"class":1410},[1230,2345,2087],{"class":1290},[1230,2347,2035],{"class":1417},[1230,2349,1811],{"class":1410},[1230,2351,1411],{"class":1410},[1230,2353,2032],{"class":1290},[1230,2355,2035],{"class":1417},[1230,2357,1421],{"class":1410},[1362,2359],{},[1261,2361,2363],{"id":2362},"remove-a-dependency","Remove a dependency",[1266,2365,2366,2482,2529],{},[1269,2367,2368,2374,2384,2387,2406,2414,2443,2453],{"icon":1271,"label":974},[961,2369,1993,2370,1996,2372,2000],{},[972,2371,1446],{},[972,2373,1999],{},[1273,2375,2376],{"className":1275,"code":2003,"language":1277,"meta":1278,"style":1278},[972,2377,2378],{"__ignoreMap":1278},[1230,2379,2380,2382],{"class":1283,"line":1284},[1230,2381,974],{"class":1287},[1230,2383,2012],{"class":1290},[961,2385,2386],{},"Or remove a standard dependency with the command-line:",[1273,2388,2390],{"className":1275,"code":2389,"language":1277,"meta":1278,"style":1278},"uv remove \u003Cpackage>\n",[972,2391,2392],{"__ignoreMap":1278},[1230,2393,2394,2396,2398,2400,2402,2404],{"class":1283,"line":1284},[1230,2395,974],{"class":1287},[1230,2397,1706],{"class":1290},[1230,2399,1411],{"class":1410},[1230,2401,2032],{"class":1290},[1230,2403,2035],{"class":1417},[1230,2405,1421],{"class":1410},[961,2407,2408,2409,2411,2412,2068],{},"Remove ",[972,2410,2063],{}," from an ",[972,2413,2067],{},[1273,2415,2417],{"className":1275,"code":2416,"language":1277,"meta":1278,"style":1278},"uv remove \u003Cpackage> --optional \u003Cgroup_name>\n",[972,2418,2419],{"__ignoreMap":1278},[1230,2420,2421,2423,2425,2427,2429,2431,2433,2435,2437,2439,2441],{"class":1283,"line":1284},[1230,2422,974],{"class":1287},[1230,2424,1706],{"class":1290},[1230,2426,1411],{"class":1410},[1230,2428,2032],{"class":1290},[1230,2430,2035],{"class":1417},[1230,2432,1811],{"class":1410},[1230,2434,2082],{"class":1294},[1230,2436,1411],{"class":1410},[1230,2438,2087],{"class":1290},[1230,2440,2035],{"class":1417},[1230,2442,1421],{"class":1410},[961,2444,2408,2445,2447,2448,2068],{},[972,2446,2063],{}," from a ",[991,2449,2451],{"href":2107,"rel":2450,"target":997},[995,996],[972,2452,2111],{"style":1852},[1273,2454,2456],{"className":1275,"code":2455,"language":1277,"meta":1278,"style":1278},"uv remove --group \u003Cgroup_name> \u003Cpackage>\n",[972,2457,2458],{"__ignoreMap":1278},[1230,2459,2460,2462,2464,2466,2468,2470,2472,2474,2476,2478,2480],{"class":1283,"line":1284},[1230,2461,974],{"class":1287},[1230,2463,1706],{"class":1290},[1230,2465,2125],{"class":1294},[1230,2467,1411],{"class":1410},[1230,2469,2087],{"class":1290},[1230,2471,2035],{"class":1417},[1230,2473,1811],{"class":1410},[1230,2475,1411],{"class":1410},[1230,2477,2032],{"class":1290},[1230,2479,2035],{"class":1417},[1230,2481,1421],{"class":1410},[1269,2483,2484,2493],{"icon":1312,"label":1003},[961,2485,1993,2486,1996,2488,2490,2491,1692],{},[972,2487,1446],{},[972,2489,1485],{}," automatically update the environment before use or actively recreate the affected environment ",[972,2492,1691],{},[1273,2494,2495],{"className":1275,"code":2153,"language":1277,"meta":1278,"style":1278},[972,2496,2497,2513],{"__ignoreMap":1278},[1230,2498,2499,2501,2503,2505,2507,2509,2511],{"class":1283,"line":1284},[1230,2500,1003],{"class":1287},[1230,2502,1463],{"class":1290},[1230,2504,1706],{"class":1290},[1230,2506,1411],{"class":1410},[1230,2508,1471],{"class":1290},[1230,2510,1474],{"class":1417},[1230,2512,1421],{"class":1410},[1230,2514,2515,2517,2519,2521,2523,2525,2527],{"class":1283,"line":1424},[1230,2516,1003],{"class":1287},[1230,2518,1463],{"class":1290},[1230,2520,1466],{"class":1290},[1230,2522,1411],{"class":1410},[1230,2524,1471],{"class":1290},[1230,2526,1474],{"class":1417},[1230,2528,1421],{"class":1410},[1269,2530,2531,2535,2553,2555,2574,2580,2609,2618],{"icon":1336,"label":1035},[961,2532,1993,2533,2228],{},[972,2534,1446],{},[1273,2536,2537],{"className":1275,"code":1509,"language":1277,"meta":1278,"style":1278},[972,2538,2539,2545],{"__ignoreMap":1278},[1230,2540,2541,2543],{"class":1283,"line":1284},[1230,2542,1035],{"class":1287},[1230,2544,1429],{"class":1290},[1230,2546,2547,2549,2551],{"class":1283,"line":1424},[1230,2548,1035],{"class":1287},[1230,2550,1502],{"class":1290},[1230,2552,1389],{"class":1294},[961,2554,2386],{},[1273,2556,2558],{"className":1275,"code":2557,"language":1277,"meta":1278,"style":1278},"poetry remove \u003Cpackage>\n",[972,2559,2560],{"__ignoreMap":1278},[1230,2561,2562,2564,2566,2568,2570,2572],{"class":1283,"line":1284},[1230,2563,1035],{"class":1287},[1230,2565,1706],{"class":1290},[1230,2567,1411],{"class":1410},[1230,2569,2032],{"class":1290},[1230,2571,2035],{"class":1417},[1230,2573,1421],{"class":1410},[961,2575,2408,2576,2411,2578,2068],{},[972,2577,2063],{},[972,2579,2067],{},[1273,2581,2583],{"className":1275,"code":2582,"language":1277,"meta":1278,"style":1278},"poetry remove --optional \u003Cgroup_name> \u003Cpackage>\n",[972,2584,2585],{"__ignoreMap":1278},[1230,2586,2587,2589,2591,2593,2595,2597,2599,2601,2603,2605,2607],{"class":1283,"line":1284},[1230,2588,1035],{"class":1287},[1230,2590,1706],{"class":1290},[1230,2592,2082],{"class":1294},[1230,2594,1411],{"class":1410},[1230,2596,2087],{"class":1290},[1230,2598,2035],{"class":1417},[1230,2600,1811],{"class":1410},[1230,2602,1411],{"class":1410},[1230,2604,2032],{"class":1290},[1230,2606,2035],{"class":1417},[1230,2608,1421],{"class":1410},[961,2610,2408,2611,2447,2613,2068],{},[972,2612,2063],{},[991,2614,2616],{"href":2107,"rel":2615,"target":997},[995,996],[972,2617,2111],{"style":1852},[1273,2619,2621],{"className":1275,"code":2620,"language":1277,"meta":1278,"style":1278},"poetry remove --group \u003Cgroup_name> \u003Cpackage>\n",[972,2622,2623],{"__ignoreMap":1278},[1230,2624,2625,2627,2629,2631,2633,2635,2637,2639,2641,2643,2645],{"class":1283,"line":1284},[1230,2626,1035],{"class":1287},[1230,2628,1706],{"class":1290},[1230,2630,2125],{"class":1294},[1230,2632,1411],{"class":1410},[1230,2634,2087],{"class":1290},[1230,2636,2035],{"class":1417},[1230,2638,1811],{"class":1410},[1230,2640,1411],{"class":1410},[1230,2642,2032],{"class":1290},[1230,2644,2035],{"class":1417},[1230,2646,1421],{"class":1410},[1362,2648],{},[1261,2650,2652],{"id":2651},"update-a-dependency","Update a dependency",[1266,2654,2655,2724,2810],{},[1269,2656,2657,2665,2668,2671,2694,2697,2711],{"icon":1271,"label":974},[961,2658,2659,2661,2662,2664],{},[972,2660,974],{}," automatically updates dependencies changed in the ",[972,2663,1446],{}," before running commands unless told otherwise.",[961,2666,2667],{},"It may, however, be desirable to actively update dependencies, e.g. when testing release candidates or pre-releases.",[961,2669,2670],{},"To update an unpinned dependency's locked version:",[1273,2672,2674],{"className":1275,"code":2673,"language":1277,"meta":1278,"style":1278},"uv lock --upgrade-package \u003Cpackage>\n",[972,2675,2676],{"__ignoreMap":1278},[1230,2677,2678,2680,2683,2686,2688,2690,2692],{"class":1283,"line":1284},[1230,2679,974],{"class":1287},[1230,2681,2682],{"class":1290}," lock",[1230,2684,2685],{"class":1294}," --upgrade-package",[1230,2687,1411],{"class":1410},[1230,2689,2032],{"class":1290},[1230,2691,2035],{"class":1417},[1230,2693,1421],{"class":1410},[961,2695,2696],{},"Or update all dependencies:",[1273,2698,2700],{"className":1275,"code":2699,"language":1277,"meta":1278,"style":1278},"uv lock --upgrade\n",[972,2701,2702],{"__ignoreMap":1278},[1230,2703,2704,2706,2708],{"class":1283,"line":1284},[1230,2705,974],{"class":1287},[1230,2707,2682],{"class":1290},[1230,2709,2710],{"class":1294}," --upgrade\n",[961,2712,2713,985,2716,2719,2720,2723],{},[972,2714,2715],{},"--upgrade",[972,2717,2718],{},"--upgrade-package"," both imply ",[972,2721,2722],{},"--refresh"," which updates cached data.",[1269,2725,2726,2733,2742,2785],{"icon":1312,"label":1003},[961,2727,1993,2728,1996,2730,2732],{},[972,2729,1446],{},[972,2731,1485],{}," automatically update the environment before use or actively recreate the affected environment.",[961,2734,2735,2736,2738,2739,2741],{},"Or call ",[972,2737,974],{}," from within the ",[972,2740,1691],{}," to update, e.g. to set as a local editable installation:",[1273,2743,2745],{"className":1275,"code":2744,"language":1277,"meta":1278,"style":1278},"hatch run \u003Cenv>:uv pip install \u003Coptions> \u003Cpackage>\n",[972,2746,2747],{"__ignoreMap":1278},[1230,2748,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767,2769,2772,2775,2777,2779,2781,2783],{"class":1283,"line":1284},[1230,2750,1003],{"class":1287},[1230,2752,1951],{"class":1290},[1230,2754,1411],{"class":1410},[1230,2756,1471],{"class":1290},[1230,2758,1474],{"class":1417},[1230,2760,1811],{"class":1410},[1230,2762,1962],{"class":1290},[1230,2764,1910],{"class":1290},[1230,2766,1502],{"class":1290},[1230,2768,1411],{"class":1410},[1230,2770,2771],{"class":1290},"option",[1230,2773,2774],{"class":1417},"s",[1230,2776,1811],{"class":1410},[1230,2778,1411],{"class":1410},[1230,2780,2032],{"class":1290},[1230,2782,2035],{"class":1417},[1230,2784,1421],{"class":1410},[961,2786,2787,2788,2790,2791,2793,2794,2796,2797,2799,2800,2802,2803,2805,2806],{},"Note: ",[972,2789,974],{}," is a dependency of ",[972,2792,1003],{}," only when ",[972,2795,1003],{}," is configured to use ",[972,2798,974],{}," as its installer, otherwise ",[972,2801,981],{}," is the underlying tool that one would call to update a dependency from the command-line. For more about enabling ",[972,2804,974],{}," from hatch see the ",[991,2807,1638],{"href":2808,"rel":2809,"target":997},"https:\u002F\u002Fhatch.pypa.io\u002F1.13\u002Fhow-to\u002Fenvironment\u002Fselect-installer\u002F#enabling-uv",[995,996],[1269,2811,2812,2816,2834,2841],{"icon":1336,"label":1035},[961,2813,1993,2814,2228],{},[972,2815,1446],{},[1273,2817,2818],{"className":1275,"code":1509,"language":1277,"meta":1278,"style":1278},[972,2819,2820,2826],{"__ignoreMap":1278},[1230,2821,2822,2824],{"class":1283,"line":1284},[1230,2823,1035],{"class":1287},[1230,2825,1429],{"class":1290},[1230,2827,2828,2830,2832],{"class":1283,"line":1424},[1230,2829,1035],{"class":1287},[1230,2831,1502],{"class":1290},[1230,2833,1389],{"class":1294},[961,2835,2836,2837],{},"Or update the ",[2838,2839,2840],"package",{}," from the command-line:",[1273,2842,2844],{"className":1275,"code":2843,"language":1277,"meta":1278,"style":1278},"poetry update \u003Cpackage>\n",[972,2845,2846],{"__ignoreMap":1278},[1230,2847,2848,2850,2853,2855,2857,2859],{"class":1283,"line":1284},[1230,2849,1035],{"class":1287},[1230,2851,2852],{"class":1290}," update",[1230,2854,1411],{"class":1410},[1230,2856,2032],{"class":1290},[1230,2858,2035],{"class":1417},[1230,2860,1421],{"class":1410},[1362,2862],{},[1261,2864,2866],{"id":2865},"run-a-script","Run a script",[1266,2868,2869,2993,3048],{},[1269,2870,2871,2876,2906,2916,2948,2951,2976],{"icon":1271,"label":974},[961,2872,2873,2874,1692],{},"Project scripts declared in ",[972,2875,1446],{},[1273,2877,2879],{"className":1275,"code":2878,"language":1277,"meta":1278,"style":1278},"uv run \u003Ccmd> \u003Cargs>\n",[972,2880,2881],{"__ignoreMap":1278},[1230,2882,2883,2885,2887,2889,2892,2895,2897,2899,2902,2904],{"class":1283,"line":1284},[1230,2884,974],{"class":1287},[1230,2886,1951],{"class":1290},[1230,2888,1411],{"class":1410},[1230,2890,2891],{"class":1290},"cm",[1230,2893,2894],{"class":1417},"d",[1230,2896,1811],{"class":1410},[1230,2898,1411],{"class":1410},[1230,2900,2901],{"class":1290},"arg",[1230,2903,2774],{"class":1417},[1230,2905,1421],{"class":1410},[961,2907,2908,2909,1447,2912,2915],{},"Using the ",[972,2910,2911],{},"uv tool",[972,2913,2914],{},"uvx"," interface:",[1273,2917,2919],{"className":1275,"code":2918,"language":1277,"meta":1278,"style":1278},"uv tool run \u003Ctool> \u003Ccmd>\n",[972,2920,2921],{"__ignoreMap":1278},[1230,2922,2923,2925,2928,2930,2932,2935,2938,2940,2942,2944,2946],{"class":1283,"line":1284},[1230,2924,974],{"class":1287},[1230,2926,2927],{"class":1290}," tool",[1230,2929,1951],{"class":1290},[1230,2931,1411],{"class":1410},[1230,2933,2934],{"class":1290},"too",[1230,2936,2937],{"class":1417},"l",[1230,2939,1811],{"class":1410},[1230,2941,1411],{"class":1410},[1230,2943,2891],{"class":1290},[1230,2945,2894],{"class":1417},[1230,2947,1421],{"class":1410},[961,2949,2950],{},"which is equivalent to:",[1273,2952,2954],{"className":1275,"code":2953,"language":1277,"meta":1278,"style":1278},"uvx \u003Ctool> \u003Ccmd>\n",[972,2955,2956],{"__ignoreMap":1278},[1230,2957,2958,2960,2962,2964,2966,2968,2970,2972,2974],{"class":1283,"line":1284},[1230,2959,2914],{"class":1287},[1230,2961,1411],{"class":1410},[1230,2963,2934],{"class":1290},[1230,2965,2937],{"class":1417},[1230,2967,1811],{"class":1410},[1230,2969,1411],{"class":1410},[1230,2971,2891],{"class":1290},[1230,2973,2894],{"class":1417},[1230,2975,1421],{"class":1410},[961,2977,2978,2979,2981,2982,2985,2986,2988,2989,1486],{},"Certain tools must not be installed into the local development environment, but are instead managed by ",[972,2980,974],{},", e.g. ",[972,2983,2984],{},"uv tool run ruff --version","\nTo learn more about the ",[972,2987,2911],{}," interface check out the ",[991,2990,1638],{"href":2991,"rel":2992,"target":997},"https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002Fconcepts\u002Ftools\u002F",[995,996],[1269,2994,2995,3033],{"icon":1312,"label":1003},[1273,2996,2998],{"className":1275,"code":2997,"language":1277,"meta":1278,"style":1278},"hatch run \u003Cenv>:\u003Ccmd> \u003Cargs>\n",[972,2999,3000],{"__ignoreMap":1278},[1230,3001,3002,3004,3006,3008,3010,3012,3014,3016,3019,3021,3023,3025,3027,3029,3031],{"class":1283,"line":1284},[1230,3003,1003],{"class":1287},[1230,3005,1951],{"class":1290},[1230,3007,1411],{"class":1410},[1230,3009,1471],{"class":1290},[1230,3011,1474],{"class":1417},[1230,3013,1811],{"class":1410},[1230,3015,1692],{"class":1290},[1230,3017,3018],{"class":1410},"\u003C",[1230,3020,2891],{"class":1290},[1230,3022,2894],{"class":1417},[1230,3024,1811],{"class":1410},[1230,3026,1411],{"class":1410},[1230,3028,2901],{"class":1290},[1230,3030,2774],{"class":1417},[1230,3032,1421],{"class":1410},[961,3034,3035,3036,3039,3040,1447,3042,3044,3045,1486],{},"where ",[972,3037,3038],{},"\u003Ccmd>"," is a project script, a named CLI alias declared in a ",[972,3041,1450],{},[972,3043,1446],{},", or any arbitrary command-line command.\nTo learn more about defining scripts see the ",[991,3046,1638],{"href":1165,"rel":3047,"target":997},[995,996],[1269,3049,3050,3054],{"icon":1336,"label":1035},[961,3051,2873,3052,1692],{},[972,3053,1446],{},[1273,3055,3057],{"className":1275,"code":3056,"language":1277,"meta":1278,"style":1278},"poetry run \u003Ccmd> \u003Cargs>\n",[972,3058,3059],{"__ignoreMap":1278},[1230,3060,3061,3063,3065,3067,3069,3071,3073,3075,3077,3079],{"class":1283,"line":1284},[1230,3062,1035],{"class":1287},[1230,3064,1951],{"class":1290},[1230,3066,1411],{"class":1410},[1230,3068,2891],{"class":1290},[1230,3070,2894],{"class":1417},[1230,3072,1811],{"class":1410},[1230,3074,1411],{"class":1410},[1230,3076,2901],{"class":1290},[1230,3078,2774],{"class":1417},[1230,3080,1421],{"class":1410},[1362,3082],{},[1261,3084,3086],{"id":3085},"format-files","Format files",[1266,3088,3089,3188,3227],{},[1269,3090,3091,3106,3131,3136,3161,3176],{"icon":1271,"label":974},[961,3092,3093,3094,3096,3097,3099,3100,3102,3103,1692],{},"Assuming the project has ",[972,3095,988],{}," as a dependency and ",[972,3098,988],{}," is configured via the ",[972,3101,1446],{}," or a ",[972,3104,3105],{},"ruff.toml",[1273,3107,3109],{"className":1275,"code":3108,"language":1277,"meta":1278,"style":1278},"uv run ruff format \u003Cpath>\n",[972,3110,3111],{"__ignoreMap":1278},[1230,3112,3113,3115,3117,3120,3123,3125,3127,3129],{"class":1283,"line":1284},[1230,3114,974],{"class":1287},[1230,3116,1951],{"class":1290},[1230,3118,3119],{"class":1290}," ruff",[1230,3121,3122],{"class":1290}," format",[1230,3124,1411],{"class":1410},[1230,3126,1558],{"class":1290},[1230,3128,1561],{"class":1417},[1230,3130,1421],{"class":1410},[961,3132,3133,3134,2915],{},"Or without the declared dependency, using the ",[972,3135,2911],{},[1273,3137,3139],{"className":1275,"code":3138,"language":1277,"meta":1278,"style":1278},"uv tool run ruff format \u003Cpath>\n",[972,3140,3141],{"__ignoreMap":1278},[1230,3142,3143,3145,3147,3149,3151,3153,3155,3157,3159],{"class":1283,"line":1284},[1230,3144,974],{"class":1287},[1230,3146,2927],{"class":1290},[1230,3148,1951],{"class":1290},[1230,3150,3119],{"class":1290},[1230,3152,3122],{"class":1290},[1230,3154,1411],{"class":1410},[1230,3156,1558],{"class":1290},[1230,3158,1561],{"class":1417},[1230,3160,1421],{"class":1410},[961,3162,3163,3164,3167,3168,3175],{},"Or with ",[972,3165,3166],{},"uv>=0.8.13"," using the experimental ",[991,3169,3172],{"href":3170,"rel":3171,"target":997},"https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002Freference\u002Fcli\u002F#uv-format",[995,996],[972,3173,3174],{"style":1852},"format"," command:",[1273,3177,3179],{"className":1275,"code":3178,"language":1277,"meta":1278,"style":1278},"uv format\n",[972,3180,3181],{"__ignoreMap":1278},[1230,3182,3183,3185],{"class":1283,"line":1284},[1230,3184,974],{"class":1287},[1230,3186,3187],{"class":1290}," format\n",[1269,3189,3190,3210],{"icon":1312,"label":1003},[1273,3191,3193],{"className":1275,"code":3192,"language":1277,"meta":1278,"style":1278},"hatch fmt \u003Cpath>\n",[972,3194,3195],{"__ignoreMap":1278},[1230,3196,3197,3199,3202,3204,3206,3208],{"class":1283,"line":1284},[1230,3198,1003],{"class":1287},[1230,3200,3201],{"class":1290}," fmt",[1230,3203,1411],{"class":1410},[1230,3205,1558],{"class":1290},[1230,3207,1561],{"class":1417},[1230,3209,1421],{"class":1410},[961,3211,3212,3213,3216,3217,3219,3220,3222,3223,1486],{},"Hatch creates a ",[972,3214,3215],{},"static-analysis"," environment which uses ",[972,3218,988],{}," to lint and format. To learn more about configuring this to use ",[972,3221,1446],{}," linting configuration see the ",[991,3224,1638],{"href":3225,"rel":3226,"target":997},"https:\u002F\u002Fhatch.pypa.io\u002F1.13\u002Fconfig\u002Finternal\u002Fstatic-analysis\u002F#static-analysis-configuration",[995,996],[1269,3228,3229,3237],{"icon":1336,"label":1035},[961,3230,3093,3231,3096,3233,3099,3235,1692],{},[972,3232,988],{},[972,3234,988],{},[972,3236,1446],{},[1273,3238,3240],{"className":1275,"code":3239,"language":1277,"meta":1278,"style":1278},"poetry run ruff format \u003Cpath>\n",[972,3241,3242],{"__ignoreMap":1278},[1230,3243,3244,3246,3248,3250,3252,3254,3256,3258],{"class":1283,"line":1284},[1230,3245,1035],{"class":1287},[1230,3247,1951],{"class":1290},[1230,3249,3119],{"class":1290},[1230,3251,3122],{"class":1290},[1230,3253,1411],{"class":1410},[1230,3255,1558],{"class":1290},[1230,3257,1561],{"class":1417},[1230,3259,1421],{"class":1410},[1362,3261],{},[1261,3263,3265],{"id":3264},"run-tests","Run tests",[1266,3267,3268,3284,3314],{},[1269,3269,3270],{"icon":1271,"label":974},[1273,3271,3273],{"className":1275,"code":3272,"language":1277,"meta":1278,"style":1278},"uv run pytest\n",[972,3274,3275],{"__ignoreMap":1278},[1230,3276,3277,3279,3281],{"class":1283,"line":1284},[1230,3278,974],{"class":1287},[1230,3280,1951],{"class":1290},[1230,3282,3283],{"class":1290}," pytest\n",[1269,3285,3286,3300],{"icon":1312,"label":1003},[1273,3287,3289],{"className":1275,"code":3288,"language":1277,"meta":1278,"style":1278},"hatch test --all\n",[972,3290,3291],{"__ignoreMap":1278},[1230,3292,3293,3295,3298],{"class":1283,"line":1284},[1230,3294,1003],{"class":1287},[1230,3296,3297],{"class":1290}," test",[1230,3299,1749],{"class":1294},[961,3301,3302,3304,3305,1447,3307,3309,3310,1486],{},[972,3303,1003],{},"'s default testing environment allows one to easily configure parallelization and randomization of tests, as well as complex testing matrixes. To learn more about how to configure this behavior in the ",[972,3306,1446],{},[972,3308,1450],{}," files see the ",[991,3311,1638],{"href":3312,"rel":3313,"target":997},"https:\u002F\u002Fhatch.pypa.io\u002F1.13\u002Fconfig\u002Finternal\u002Ftesting\u002F#testing-configuration",[995,996],[1269,3315,3316,3325],{"icon":1336,"label":1035},[961,3317,3093,3318,3096,3321,3099,3323,1692],{},[972,3319,3320],{},"pytest",[972,3322,3320],{},[972,3324,1446],{},[1273,3326,3328],{"className":1275,"code":3327,"language":1277,"meta":1278,"style":1278},"poetry run pytest\n",[972,3329,3330],{"__ignoreMap":1278},[1230,3331,3332,3334,3336],{"class":1283,"line":1284},[1230,3333,1035],{"class":1287},[1230,3335,1951],{"class":1290},[1230,3337,3283],{"class":1290},[3339,3340,3341],"style",{},"html pre.shiki code .sNqAu, html code.shiki .sNqAu{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFA657}html pre.shiki code .sCx38, html code.shiki .sCx38{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#A5D6FF}html pre.shiki code .sOiAX, html code.shiki .sOiAX{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#79C0FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sxkbv, html code.shiki .sxkbv{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF7B72}html pre.shiki code .sc-9e, html code.shiki .sc-9e{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#E6EDF3}",{"title":1278,"searchDepth":1284,"depth":1424,"links":3343},[3344,3345,3346],{"id":967,"depth":1424,"text":968},{"id":1060,"depth":1424,"text":1061},{"id":1258,"depth":1424,"text":1259,"children":3347},[3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359],{"id":1263,"depth":1432,"text":1264},{"id":1366,"depth":1432,"text":1367},{"id":1530,"depth":1432,"text":1531},{"id":1672,"depth":1432,"text":1673},{"id":1754,"depth":1432,"text":1755},{"id":1893,"depth":1432,"text":1894},{"id":1985,"depth":1432,"text":1986},{"id":2362,"depth":1432,"text":2363},{"id":2651,"depth":1432,"text":2652},{"id":2865,"depth":1432,"text":2866},{"id":3085,"depth":1432,"text":3086},{"id":3264,"depth":1432,"text":3265},"A tool comparison.","md",{},true,"\u002Fconnector-development\u002Freference\u002Fpython-environment-management",{"title":952,"description":3360},"howto","TyYSZwwXwcfwVpachXmu88kLZ5Gzi6smwQygJBTXKm4",[3369,6],{"title":948,"description":3370,"path":949},"Every connector best-practice rule in one list, with a stable ID to cite in reviews.",1792656176602]