[{"element_type":"alert","content":"Released as version 1.6.0: [Last updated 2024-03-05] https://github.com/adafruit/circup/releases/latest\n-- Added: free space checking before installs, log file roll-over, win/mac/linux support and HTTP timeouts","metadata":{"class":"element row-fluid alert-element build-alert alert-primary ui-sortable-handle","alert_type":"primary"}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eThanks to some hard work by Vladimir Kotal (\u003ca href=\"https://github.com/vladak\" target=\"_blank\"\u003e@vladak\u003c/a\u003e)❤️, an open-source community contributor on GitHub who added \u003ca href=\"https://github.com/adafruit/circup/pull/163\" target=\"_blank\"\u003ethis pull request\u003c/a\u003e, and thanks to our own CircuitPython wizard Tim (\u003ca href=\"https://github.com/foamyGuy/\" target=\"_blank\"\u003e@foamyguy\u003c/a\u003e), there is now\u0026nbsp;the ability to use \u003ccode\u003ecircup\u003c/code\u003e with the web-workflow.\u003c/p\u003e\n\u003cp\u003eI had a play by pulling from github last month as I was desperate. I had a device that was going to be left plugged into the mains, which was running out-of-date code and libraries (but otherwise functional), and so along the way fixed a couple of issues for Windows users or anyone needing libraries with nested folders.\u0026nbsp;\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"alert","content":"This set of instructions previously installed a custom github release of circup, you'll want to uninstall that and install the normal one again. You can do that with:\npip uninstall circup -y\npip install circup","metadata":{"class":"element row-fluid alert-element build-alert alert-danger ui-sortable-handle","alert_type":"danger"}},{"element_type":"text","content":"\n  \n  \n        \u003ch1\u003eInstall \u003ccode\u003ecircup\u003c/code\u003e, at least version 1.6.1:\u003c/h1\u003e\n\u003cp\u003eTo begin with we'll explore how install and to use it, then I'll take you through my specific example...\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInstall latest CIRCUP:\u003c/strong\u003e\u003cbr\u003e\u003ccode\u003epip install circup --force\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003csup\u003e[ \u003cem\u003e--force\u003c/em\u003e forcefully overwrites / upgrades]\u003c/sup\u003e\u003c/p\u003e\n      \n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch1\u003eHow to use it:\u003c/h1\u003e\n      \n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n        \u003ch3\u003e\u003cstrong\u003eRead help and test CIRCUP has new --host command line argument:\u003c/strong\u003e\u003c/h3\u003e\n\u003cp\u003eEnter the circup command followed by the --help argument. Most commands support --help or --usage:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecircup --help\u003c/code\u003e\u003cstrong\u003e\u003cbr\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eYou should then see the following output, which mentions the \u003ccode\u003e--host\u003c/code\u003e, \u003ccode\u003e--password\u003c/code\u003e, \u003ccode\u003e--path\u003c/code\u003e, and \u003ccode\u003e--verbose\u003c/code\u003e, all of which can be very useful, but only the first two are required.\u003c/p\u003e\n\u003cp\u003eThe other one I read about in the pull-request was\u0026nbsp;\u003ccode\u003e--auto-file\u003c/code\u003e which is where circup searches when automatically installing required libraries using the \u003ccode\u003e--auto\u003c/code\u003e install option.\u003c/p\u003e\n\u003cp\u003eLastly it doesn't mention my favourite install option \u003ccode\u003e--py\u003c/code\u003e which installs the source python files for libraries rather than the compressed .mpy files, thereby allowing library modifications or just easy reference.\u003c/p\u003e\n      \n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/685/original/Screenshot_2024-02-11_190139.png?1707678131","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003ePrecursor: Get devices IP address - test web workflow\u003c/h2\u003e\n      \n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n        \u003cp\u003eBefore you can connect to your device over web workflow, it needs to be configured for wifi... You'll see accessing via the IP address, but a future update should allow you to connect using the generic hostname\u0026nbsp;\u003cstrong\u003ecircuitpython.local\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eFor now read on, the guide will be updated once that's a seamless process (currently you get told not authenticated and it reports the devices .local name instead, which you can directly connect to as the host argument).\u003c/p\u003e\n      \n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n        \u003cp\u003eWe start by assuming you've got a \u003ccode\u003esettings.toml\u003c/code\u003e file setup \u003ca href=\"https://docs.circuitpython.org/en/latest/docs/workflows.html#web\" target=\"_blank\"\u003ewith the normal things\u003c/a\u003e and the web api password key, \u003ccode\u003eCIRCUITPY_WEB_API_PASSWORD\u003c/code\u003e, something like this:\u003c/p\u003e\n\u003cpre\u003eCIRCUITPY_WIFI_SSID=\"free4all\"\u003cbr\u003eCIRCUITPY_WIFI_PASSWORD=\"password\"\u003cbr\u003eCIRCUITPY_WEB_API_PASSWORD=\"good-enough\"\u003cbr\u003eCIRCUITPY_WEB_INSTANCE_NAME=\"good enough Air Quality (CO2/VOC/PPM)\"\u003c/pre\u003e\n      \n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eThen we can try to connect to the device. This means using the web workflow, which can be accessed via IP address or using multicast-DNS (mDNS), but IP based communication is most reliable so we'll go for that option, and only rely on mDNS to find the IP of our device if necessary.\u003cbr\u003e\u003cbr\u003eYou'll want to find your devices IP, it shows up in the CircuitPython REPL, and my device has a screen so it tells me the IP, but you can usually find it on your wireless router web control page (URL = ip of your wifi router - sometimes port 8080 search google) e.g. mine is at http://192.168.0.1/\u003c/p\u003e\n\u003cp\u003eLastly CircuitPython includes mDNS, so if your PC + network allow it then you can connect to the CircuitPython's web workflow page using the address \u003ccode\u003ecircuitpython.local\u003c/code\u003e, e.g. \u003ca href=\"http://circuitpython.local/\" target=\"_blank\"\u003ehttp://circuitpython.local/\u003c/a\u003e, and from there it should list other CircuitPython devices and give clickable links to their respective web workflows. That's the same technology that allows \u003ca href=\"https://code.circuitpython.org/\" target=\"_blank\"\u003ehttps://code.circuitpython.org/\u003c/a\u003e to work (it becomes circuitpython.local/code)\u0026nbsp;\u003c/p\u003e\n\u003cp\u003eOnce on a devices web workflow page then it says the devices IP along with name etc.\u003cbr\u003eFrom here you can goto the file browser and confirm the password is working as expected, along with check the library modules and files on the device.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/686/original/Screenshot_2024-02-11_192351.png?1707679554","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003e\n\u003cbr\u003eStumbling blocks: Potential Issues with \u003ccode\u003ecircup\u003c/code\u003e or device:\u003c/h2\u003e\n\u003cp\u003e1️⃣ Device not found\u003cstrong\u003e\u003cspan\u003e\u0026nbsp;\u003c/span\u003e\u003c/strong\u003e-\u003cstrong\u003e \"Could not find a connected CircuitPython device.\"\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eThis occurs when the usb cable is no good for data, or most likely when the device has a drive/disk label that doesn't match CIRCUITPY. You can fix that on windows with the \u003ccode\u003elabel\u003c/code\u003e command followed by the drive location.\u003cbr\u003ee.g.\u0026nbsp;\u003ccode\u003elabel d:\u003c/code\u003e for the D:\\ drive, then type CIRCUITPY and press enter/return when asked for the new label.\u003c/em\u003e\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/714/original/Screenshot_2024-02-18_164942.png?1708275035","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e\u003cstrong\u003e\u003cbr\u003e2️⃣\u003c/strong\u003e\u0026nbsp;Can't automatically detect and install libraries to install -\u0026nbsp;\u003cstrong\u003e\"Auto file not found: code.py\"\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eYou'll need to specify the auto-file location, using the \u003ccode\u003e--auto-file\u003c/code\u003e command-line argument, discussed later.\u003cbr\u003ee.g.\u0026nbsp;\u003ccode\u003ecircup install --auto --py --auto-file=D:\\code.py\u003c/code\u003e\u003c/em\u003e\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/716/original/Screenshot_2024-02-18_165608.png?1708275380","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003e\u003cbr\u003e3️⃣ Something else:\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCheck the official circup help/documentation: \u003ca href=\"https://github.com/adafruit/circup?tab=readme-ov-file#circup\" target=\"_blank\"\u003ehttps://github.com/adafruit/circup?tab=readme-ov-file#circup\u003c/a\u003e\u003cbr\u003eRead the learn guide \u003ca href=\"https://learn.adafruit.com/keep-your-circuitpython-libraries-on-devices-up-to-date-with-circup\" target=\"_blank\"\u003ehttps://learn.adafruit.com/keep-your-circuitpython-libraries-on-devices-up-to-date-with-circup\u003c/a\u003e.\u003cbr\u003eAsk for help in the \u003cstrong\u003e#help-with-circuitpython\u003c/strong\u003e Discord channel (\u003ca href=\"https://adafru.it/discord\" target=\"_blank\"\u003eadafru.it/discord\u003c/a\u003e) or the \u003ca href=\"https://forums.adafruit.com\" target=\"_blank\"\u003eAdafruit forums\u003c/a\u003e.\u003cbr\u003e\u003c/em\u003e\u003cem\u003eIt could equally be a bug rather than user error, if you believe so then leave the bug report along with a minimum recreation code example in a github issue on the circup repository. Last resort, reset your bootloader and board using the section at the end of the \u003ca href=\"https://circuitpython.org/downloads\" target=\"_blank\"\u003eCircuitPython downloads page\u003c/a\u003e for your board.\u003c/em\u003e\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"alert","content":"⇮ If you get any problems using circup then scroll back up to the troubleshooting section above! ⇮","metadata":{"class":"element row-fluid alert-element build-alert alert-warning ui-sortable-handle","alert_type":"warning"}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eChecking for outdated modules on device:\u003c/h2\u003e\n\u003cp\u003eAs we saw when we got the help output from \u003cstrong\u003ecircup\u003c/strong\u003e, it showed at the bottom the list of sub-commands. The first we'll look at is \u003ccode\u003elist\u003c/code\u003e, which is the subcommand that lists the modules on the device, and shows if they are outdated.\u003cbr\u003e\u003cbr\u003eSometimes it wont be able to detect if the version is outdated and will assume it is. Probably the safer option for new users, but dangerous if you modify library files manually so take note, the default option for update is 'No' though so don't fear!\u0026nbsp;\u003c/p\u003e\n\u003cp\u003eSo with the knowledge that my devices IP address is 192.168.0.150, and the password is good-enough then I run this:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecircup --host 192.168.0.150 --password good-enough list\u003c/code\u003e\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/687/original/Screenshot_2024-02-11_192751.png?1707679706","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eUpdating outdated modules\u003c/h2\u003e\n\u003cp\u003eIf you use the\u0026nbsp;\u003ccode\u003eupdate\u003c/code\u003e subcommand, then it asks you whether to update each outdated module, defaulting to N for no to updating that specific module. If you add the \u003ccode\u003e-y\u003c/code\u003e argument then it will upgrade all outdated modules.\u003c/p\u003e\n\u003cp\u003eI ran it without -y and then answered yes to the update question (by typing \u003ccode\u003ey\u003c/code\u003e then pressing Enter/Return) like this:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecircup --host 192.168.0.150 --password good-enough update\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eWhich looked like this in my powershell terminal window:\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/688/original/Screenshot_2024-02-11_193300.png?1707680638","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n        \u003ch2\u003eUninstall a module, or many...\u003c/h2\u003e\n\u003cp\u003eYou may find the installed copy of a library is not working correctly, or you wish to replace it with an updated version or the raw python files. In this case you'll want to uninstall a library from your device.\u003c/p\u003e\n\u003cp\u003eSimply use the \u003ccode\u003euninstall\u003c/code\u003e subcommand and pass along the names of the libraries to uninstall, for example here I attempt to uninstall two libraries:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e\u003cspan\u003ecircup --host 192.168.0.150 --password good-enough uninstall sensirion_i2c_sen5x sensirion_i2c_driver\u003c/span\u003e\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIf you ever have any problems here just delete the folders using the web workflow page instead.\u003c/p\u003e\n\u003cp\u003eYou'll receive something like this if they have already been deleted \u003cem\u003e\u003cspan style=\"text-decoration: underline;\"\u003e\u003cstrong\u003eor if the folders are empty\u003c/strong\u003e\u003c/span\u003e\u003c/em\u003e:\u003c/p\u003e\n      \n\n\n\n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/000/689/original/Screenshot_2024-02-11_200356.png?1707681857","metadata":{"caption":""}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eInstall Modules:\u003c/h2\u003e\n\u003cp\u003eAs expected the\u0026nbsp;\u003ccode\u003einstall\u003c/code\u003e subcommand is your best friend.\u003c/p\u003e\n\u003cp\u003eIt has the additional arguments \u003ccode\u003e--auto\u003c/code\u003e which will look at the auto-file (code.py by default) and find all import statements, then install those as dependencies.\u003c/p\u003e\n\u003cp\u003eBy default to save space, all library modules are installed as compressed .mpy files, which is really handy, but occasionally you'll want to have the source code copy of the library installed. In that event uninstall the .mpy version first if required, then use the \u003ccode\u003e--py\u003c/code\u003e argument to ask for source versions of the installed libraries. It combines with --auto well, for example on a local device:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecircup install --auto --py\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eor with the additional web workflow arguments:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecircup --host 192.168.0.150 --password good-enough install --auto --py\u003c/code\u003e\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eFinal Useful Arguments\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003e--timeout\u003c/code\u003e\u0026nbsp;The --timeout argument which allows you to specify the HTTP timeout value in seconds, stopping circup from waiting forever for your device to respond. The timeout argument defaults to 30seconds.\u003cbr\u003e\u003cbr\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e--verbose\u003c/code\u003e This gives extra logging information which shows what circup is doing during it's normal processes.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch1\u003eMy Use-Case - Installing nested files and folders with dependencies\u003c/h1\u003e\n\u003cp\u003eSo for my example (an Air Quality device) I wanted to install a \u003ca href=\"https://adafruit-playground.com/u/tyeth/pages/creating-a-circuitpython-library-bundle-for-circup\" target=\"_blank\"\u003ecustom circuitpython bundle\u003c/a\u003e first, to allow access to the CircuitPython library for the Sensirion SEN55/SEN54/SEN50 (SEN5x) series of particle sensors. The complication was the sen5x driver has a commands folder with more source files inside, which tripped up \u003cstrong\u003ecircup \u003c/strong\u003euntil I fixed it.\u003c/p\u003e\n\u003cp\u003eI also was \u003cem\u003euninstalling the existing \u003cstrong\u003ecircup \u003c/strong\u003ecopy\u003c/em\u003e, to ensure my git version is the only one active.\u003c/p\u003e\n\u003cp\u003eLastly I wanted to uninstall the existing copies of the libraries and install new ones in python format using the --py command line argument.\u003c/p\u003e\n\u003cp\u003eThis string of commands (5 lines/sets of commands) will execute safely in most terminals (tested in powershell).\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"markdown","content":"\u003ccode class=\"powershell\"\u003e\u003cpre\u003epip install circup --force\ncircup --host 192.168.0.150 --password password bundle-add good-enough-technology/circuitpython_goodenough_bundle\ncircup --host 192.168.0.150 --password password uninstall sensirion_i2c_driver sensirion_i2c_sen5x\ncircup --host 192.168.0.150 --password password install --auto --py\n\u003c/pre\u003e\u003c/code\u003e","metadata":{"markdown":"```powershell\npip install circup --force\ncircup --host 192.168.0.150 --password password bundle-add good-enough-technology/circuitpython_goodenough_bundle\ncircup --host 192.168.0.150 --password password uninstall sensirion_i2c_driver sensirion_i2c_sen5x\ncircup --host 192.168.0.150 --password password install --auto --py\n```"}}]