Skip to content
This repository has been archived by the owner on Jul 14, 2021. It is now read-only.

Which is really a required dependency anyway? #36

Open
2bndy5 opened this issue Sep 23, 2019 · 5 comments
Open

Which is really a required dependency anyway? #36

2bndy5 opened this issue Sep 23, 2019 · 5 comments
Assignees
Labels
apprentice This opportunity is meant for those looking for a challenge chore Maintenance-related requests question Further information is requested

Comments

@2bndy5
Copy link
Member

2bndy5 commented Sep 23, 2019

we should be using a better way to ensure our direct dependencies and their sub-dependencies are cohesive. We can consider this pipenv library as an alternative/option to solve this issue

@2bndy5 2bndy5 added bug Something isn't working enhancement New feature or request question Further information is requested dependencies Pull requests that update a dependency file chore Maintenance-related requests security Security-related issues labels Sep 23, 2019
@2bndy5
Copy link
Member Author

2bndy5 commented Sep 23, 2019

I'm re-posting this from a Slack chat after slimming down the requirements.txt to only include libraries we are actually importing in our code with a special exception to eventlet per flask docs about production servers which are required for using websockets.

Most of the following links lead to the line in the repository's setup.py file that indicates what sub-dependencies they are installing during installation of our direct dependencies. Non-library related links lead to additional information.

  • git+<our-undeployed-repo-url>.git commands require git installed & added to the system's "PATH" environment variable (a commonly default condition on Linux, but not on Windows). Prefixing these items with -e makes importing modules from multi-module packages (like our Drivetrain library) much easier using eggs, but pip has trouble looking for the eggs during install. Most of our custom repository installs require:
    1. adafruit-blinka (see link below)
    2. adafruit-circuitpython-busdevice (for I2C & SPI devices)
    3. Our GPS_Serial requires pyserial (no python sub-dependencies, but can rely on cp2110 and CH340 USB serial drivers)

  • Flask

  • Adafruit-Blinka

  • Jinja2

  • Flask-SocketIO

  • python-socketio

  • eventlet

  • opencv-python

  • pyxtermjs

Fortunately, we are no longer using GPIOzero

As of this writing our requirements file now looks like this:

git+https://github.com/2bndy5/Adafruit_CircuitPython_LSM9DS1.git
git+https://github.com/2bndy5/CircuitPython_MPU6050.git
git+https://github.com/DVC-Viking-Robotics/Drivetrain.git
git+https://github.com/DVC-Viking-Robotics/GPS_Serial.git
circuitpython-nrf24l01==1.1.0
opencv-python==3.4.3.18
pyserial==3.4
Flask==1.0.2
Flask-CacheBuster==1.0.0
Flask-Compress==1.4.0
Flask-Login==0.4.1
Flask-SocketIO==3.3.2
eventlet==0.24.1
pyxtermjs==0.4.0.1

As a reminder, you can use pip list to have pip spit out a list of all packages installed in your current environments site-packages folder and elsewhere if you added to python's "PATH" environment variable.

@2bndy5 2bndy5 added the apprentice This opportunity is meant for those looking for a challenge label Sep 26, 2019
@tejashah88 tejashah88 removed dependencies Pull requests that update a dependency file enhancement New feature or request security Security-related issues bug Something isn't working labels Sep 27, 2019
@tejashah88
Copy link
Member

After doing some investigating with the Pipenv project, here's what I found:

  • Pipenv uses the concept of lock files, which are comprehensive documents that specify exactly what dependency versions and sub-dependency versions should be installed, right down to the sha256 values. This also has the added benefit of security, should the network be compromised.
  • The requirements.txt would be replaced by the new Pipfile, which not only specifies the dependency versions but allows you to specify developer dependencies and the python version needed for the project. This is similar to how npm works, with their corresponding package.json and package-lock.json.
  • Upon running pipenv install, it will automatically create a virtual environment that sits outside of the project folder (for the case of Ubuntu: ~/.local/share/virtualenvs/) as well as install the dependencies from the Pipfile and Pipfile.lock files.
  • The installations via pipenv are designed to be deterministic (meaning we always get the same version for every single library), which is exactly what we want to solve this problem. This also means that the way of installing dependencies will be different from the native python way.

@tejashah88
Copy link
Member

Here's a list of commands for using pipenv, which is mostly coming from this website:

Installing pipenv

pip install --user pipenv

Setup

Create a new virtual environment:

pipenv --python 3.6  # Any *installed* python version works

Removing said virtual environment:

pipenv --rm

You can install the dependencies if there is an existing Pipfile:

pipenv install  # you can also add the '--dev' flag to install the dev dependencies

If you want to ensure that the dependencies are installed exactly from Pipfile.lock, you can run the following:

pipenv sync

In the case that a Pipfile doesn't exist, you can create one after installing at least one package:

pipenv install <package>

You can also import a requirements.txt file to create your Pipenv file from there:

pipenv install -r path/to/requirements.txt

Generating a Pipenv.lock lock file is as follows:

pipenv lock # you can include pre-released with the '--pre' flag

Installing/Uninstalling

You can install or uninstall any package with the following commands (similar to pip):

pipenv install <package>
pipenv uninstall <package>

You can also install specific or semi-specific versions with the following modification:

pipenv install "requests~=1.2"
pipenv install "requests>=1.4"

You can find more info about this here.

If you need to nuke your virtual environment and start from scratch, you can run the following command. NOTE: THIS IS A DESTRUCTIVE ACTION

pipenv uninstall --all

Checking dependencies

You can check your dependencies for security vulnerabilities:

pipenv check

You can also see a dependency tree of your project:

pipenv graph

Running the project

Since we don't have easy access to the virtual environment folder, the procedure to running the project has changed slightly. There's two ways to do so:

  1. Activate the virtual environment and then run the project normally:
pipenv shell
python -m webapp.app
  1. Run a command directly in the virtual environment without explicitly activating the env itself:
pipenv run python -m webapp.app

Note: You can run any command in the virtual environment via pipenv run [command]

@tejashah88
Copy link
Member

Here's the output of the Pipenv file (as of 10/5/2019):

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
adafruit-circuitpython-lsm9ds1 = {git = "https://github.com/2bndy5/Adafruit_CircuitPython_LSM9DS1.git"}
circuitpython-mpu6050 = {git = "https://github.com/2bndy5/CircuitPython_MPU6050.git"}
drivetrain = {git = "https://github.com/DVC-Viking-Robotics/Drivetrain.git"}
gps-serial = {git = "https://github.com/DVC-Viking-Robotics/GPS_Serial.git"}
circuitpython-nrf24l01 = "==1.1.0"
opencv-python = "==3.4.3.18"
pyserial = "==3.4"
eventlet = "==0.24.1"
pyxtermjs = "==0.4.0.1"
Flask = "==1.0.2"
Flask-CacheBuster = "==1.0.0"
Flask-Compress = "==1.4.0"
Flask-Login = "==0.4.1"
Flask-SocketIO = "==3.3.2"

[requires]
python_version = "3.6"

@tejashah88
Copy link
Member

Here's the output of the Pipenv lock file (as of 10/5/2019):

{
    "_meta": {
        "hash": {
            "sha256": "1406952e0b7101ee80fe107c40426acd64aef701ac6ed6fbce506303eb2afc70"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "adafruit-blinka": {
            "hashes": [
                "sha256:805dfa44ee486ee4903233f4c40a41605cd63cc86190de47cbdb45e4c4207961"
            ],
            "version": "==2.5.3"
        },
        "adafruit-circuitpython-busdevice": {
            "hashes": [
                "sha256:07a1430946b73925f98c6251b972bdf52c620d880150b1b4f5c7eff85b05fae7"
            ],
            "version": "==4.0.0"
        },
        "adafruit-circuitpython-lsm9ds1": {
            "git": "https://github.com/2bndy5/Adafruit_CircuitPython_LSM9DS1.git",
            "ref": "96282bba8809cf08a3c4fd85f89146bc471f2a0a"
        },
        "adafruit-platformdetect": {
            "hashes": [
                "sha256:3ea62dad76efb1fee9004fefbe392274c8e86b565cef72ca5fbf768459ee0637"
            ],
            "version": "==1.3.4"
        },
        "adafruit-pureio": {
            "hashes": [
                "sha256:e65cd929f1d8e109513ed1e457c2742bf4f15349c1a9b7f5b1e04191624d7488"
            ],
            "version": "==0.2.3"
        },
        "circuitpython-mpu6050": {
            "git": "https://github.com/2bndy5/CircuitPython_MPU6050.git",
            "ref": "708ace623887e70071b55fe49697c9745c89e5ae"
        },
        "circuitpython-nrf24l01": {
            "hashes": [
                "sha256:91d65464b99ab09c64b1de3de3a6226c256af199e5ae9216ecbff24844a46b38"
            ],
            "index": "pypi",
            "version": "==1.1.0"
        },
        "click": {
            "hashes": [
                "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13",
                "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
            ],
            "version": "==7.0"
        },
        "dnspython": {
            "hashes": [
                "sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01",
                "sha256:f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d"
            ],
            "version": "==1.16.0"
        },
        "drivetrain": {
            "git": "https://github.com/DVC-Viking-Robotics/Drivetrain.git",
            "ref": "4867155811cf1d50a959fbd83c125a6cafa768dd"
        },
        "eventlet": {
            "hashes": [
                "sha256:c584163e006e613707e224552fafc63e4e0aa31d7de0ab18b481ac0b385254c8",
                "sha256:d9d31a3c8dbcedbcce5859a919956d934685b17323fc80e1077cb344a2ffa68d"
            ],
            "index": "pypi",
            "version": "==0.24.1"
        },
        "flask": {
            "hashes": [
                "sha256:2271c0070dbcb5275fad4a82e29f23ab92682dc45f9dfbc22c02ba9b9322ce48",
                "sha256:a080b744b7e345ccfcbc77954861cb05b3c63786e93f2b3875e0913d44b43f05"
            ],
            "index": "pypi",
            "version": "==1.0.2"
        },
        "flask-cachebuster": {
            "hashes": [
                "sha256:0c8d7b57db8953f5c5875153f16cb970c2ed5a681b39326613c822f0c9764ec8"
            ],
            "index": "pypi",
            "version": "==1.0.0"
        },
        "flask-compress": {
            "hashes": [
                "sha256:468693f4ddd11ac6a41bca4eb5f94b071b763256d54136f77957cfee635badb3"
            ],
            "index": "pypi",
            "version": "==1.4.0"
        },
        "flask-login": {
            "hashes": [
                "sha256:c815c1ac7b3e35e2081685e389a665f2c74d7e077cb93cecabaea352da4752ec"
            ],
            "index": "pypi",
            "version": "==0.4.1"
        },
        "flask-socketio": {
            "hashes": [
                "sha256:8d8f9f104db5ddff1b06ba322d8e158881d590144199c993fe26cf53218c7edd",
                "sha256:f9b9c95c82b62381862fd3bc55cea7fcc08e787f6bb63fdc79a2f258df2bdc9a"
            ],
            "index": "pypi",
            "version": "==3.3.2"
        },
        "gps-serial": {
            "git": "https://github.com/DVC-Viking-Robotics/GPS_Serial.git",
            "ref": "775672d05266ab0959c0c853f8d7543ac4a7fec8"
        },
        "greenlet": {
            "hashes": [
                "sha256:000546ad01e6389e98626c1367be58efa613fa82a1be98b0c6fc24b563acc6d0",
                "sha256:0d48200bc50cbf498716712129eef819b1729339e34c3ae71656964dac907c28",
                "sha256:23d12eacffa9d0f290c0fe0c4e81ba6d5f3a5b7ac3c30a5eaf0126bf4deda5c8",
                "sha256:37c9ba82bd82eb6a23c2e5acc03055c0e45697253b2393c9a50cef76a3985304",
                "sha256:51503524dd6f152ab4ad1fbd168fc6c30b5795e8c70be4410a64940b3abb55c0",
                "sha256:8041e2de00e745c0e05a502d6e6db310db7faa7c979b3a5877123548a4c0b214",
                "sha256:81fcd96a275209ef117e9ec91f75c731fa18dcfd9ffaa1c0adbdaa3616a86043",
                "sha256:853da4f9563d982e4121fed8c92eea1a4594a2299037b3034c3c898cb8e933d6",
                "sha256:8b4572c334593d449113f9dc8d19b93b7b271bdbe90ba7509eb178923327b625",
                "sha256:9416443e219356e3c31f1f918a91badf2e37acf297e2fa13d24d1cc2380f8fbc",
                "sha256:9854f612e1b59ec66804931df5add3b2d5ef0067748ea29dc60f0efdcda9a638",
                "sha256:99a26afdb82ea83a265137a398f570402aa1f2b5dfb4ac3300c026931817b163",
                "sha256:a19bf883b3384957e4a4a13e6bd1ae3d85ae87f4beb5957e35b0be287f12f4e4",
                "sha256:a9f145660588187ff835c55a7d2ddf6abfc570c2651c276d3d4be8a2766db490",
                "sha256:ac57fcdcfb0b73bb3203b58a14501abb7e5ff9ea5e2edfa06bb03035f0cff248",
                "sha256:bcb530089ff24f6458a81ac3fa699e8c00194208a724b644ecc68422e1111939",
                "sha256:beeabe25c3b704f7d56b573f7d2ff88fc99f0138e43480cecdfcaa3b87fe4f87",
                "sha256:d634a7ea1fc3380ff96f9e44d8d22f38418c1c381d5fac680b272d7d90883720",
                "sha256:d97b0661e1aead761f0ded3b769044bb00ed5d33e1ec865e891a8b128bf7c656"
            ],
            "version": "==0.4.15"
        },
        "itsdangerous": {
            "hashes": [
                "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
                "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
            ],
            "version": "==1.1.0"
        },
        "jinja2": {
            "hashes": [
                "sha256:74320bb91f31270f9551d46522e33af46a80c3d619f4a4bf42b3164d30b5911f",
                "sha256:9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de"
            ],
            "version": "==2.10.3"
        },
        "markupsafe": {
            "hashes": [
                "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
                "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
                "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
                "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
                "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
                "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
                "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
                "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
                "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
                "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
                "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
                "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
                "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
                "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
                "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
                "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
                "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
                "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
                "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
                "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
                "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
                "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
                "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
                "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
                "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
                "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
                "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
                "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"
            ],
            "version": "==1.1.1"
        },
        "monotonic": {
            "hashes": [
                "sha256:23953d55076df038541e648a53676fb24980f7a1be290cdda21300b3bc21dfb0",
                "sha256:552a91f381532e33cbd07c6a2655a21908088962bb8fa7239ecbcc6ad1140cc7"
            ],
            "version": "==1.5"
        },
        "numpy": {
            "hashes": [
                "sha256:05dbfe72684cc14b92568de1bc1f41e5f62b00f714afc9adee42f6311738091f",
                "sha256:0d82cb7271a577529d07bbb05cb58675f2deb09772175fab96dc8de025d8ac05",
                "sha256:10132aa1fef99adc85a905d82e8497a580f83739837d7cbd234649f2e9b9dc58",
                "sha256:12322df2e21f033a60c80319c25011194cd2a21294cc66fee0908aeae2c27832",
                "sha256:16f19b3aa775dddc9814e02a46b8e6ae6a54ed8cf143962b4e53f0471dbd7b16",
                "sha256:3d0b0989dd2d066db006158de7220802899a1e5c8cf622abe2d0bd158fd01c2c",
                "sha256:438a3f0e7b681642898fd7993d38e2bf140a2d1eafaf3e89bb626db7f50db355",
                "sha256:5fd214f482ab53f2cea57414c5fb3e58895b17df6e6f5bca5be6a0bb6aea23bb",
                "sha256:73615d3edc84dd7c4aeb212fa3748fb83217e00d201875a47327f55363cef2df",
                "sha256:7bd355ad7496f4ce1d235e9814ec81ee3d28308d591c067ce92e49f745ba2c2f",
                "sha256:7d077f2976b8f3de08a0dcf5d72083f4af5411e8fddacd662aae27baa2601196",
                "sha256:a4092682778dc48093e8bda8d26ee8360153e2047826f95a3f5eae09f0ae3abf",
                "sha256:b458de8624c9f6034af492372eb2fee41a8e605f03f4732f43fc099e227858b2",
                "sha256:e70fc8ff03a961f13363c2c95ef8285e0cf6a720f8271836f852cc0fa64e97c8",
                "sha256:ee8e9d7cad5fe6dde50ede0d2e978d81eafeaa6233fb0b8719f60214cf226578",
                "sha256:f4a4f6aba148858a5a5d546a99280f71f5ee6ec8182a7d195af1a914195b21a2"
            ],
            "version": "==1.17.2"
        },
        "opencv-python": {
            "hashes": [
                "sha256:03d4b5ebc2414965a51ff937e2bebfb14a046e5653443f2f1620e76cfa1834a3",
                "sha256:1c45c5dd335faab7c8f84d45fe35c43c17f67237b067fb4e570cc858c904cf17",
                "sha256:1d433cc5c0ddb679fdd92e5c510487476894496c4cf8a565882d7455df29d658",
                "sha256:1d860995d4510c86c5e9ee2c9b2026cf8681c52e0b7bbbcf3eb91030e320c0a3",
                "sha256:1de2ffdb04c3a5161f6a9a6adc6a63d5e3bd22bfc661e4631bbc9dc780471002",
                "sha256:2f38155daad6a2f8a9f33fbfa2ac683a8eaf20cb24e0723dacc9cef7ed6d3420",
                "sha256:496a3b7228fc8c3f6fc1f5dc71ca61e0a5168caa270e475d23901e81754626d6",
                "sha256:514d88f34512df951b66b42d29a513e3f1878bd28afd1b8645db6afba5eb1996",
                "sha256:5880eba246498d999cf4adec24521ad169f9c547a2a5ecbcda5b44fab5511a62",
                "sha256:5916a130912519aaa77b70486eb57ae53cb181cbc9a09abb0a12f97a55c9bbb1",
                "sha256:63593ef7f11e97b65a368f45ec6c565d1b3ff1b5600df233b8e56eed1384017d",
                "sha256:699c0f9648f7d694b7a17eff241b0de93083901993bb4754fab3af3531d0450a",
                "sha256:7b84a069da8a826d5de0950227726e8d9dbeaa19628c039ae7a0e195ebb33231",
                "sha256:86d2e8f003b0106e44d564230ecae1ee98f5020f4136821dfeeadfb688a21fc5",
                "sha256:9d8da6fec400d764fd6c220be9bf14d4efc725880ea453338c2ef89759086ee2",
                "sha256:a2803dc25288523c7a777c4e299075cf4e1bf608259c24bdbbfdd3b5901e93cb",
                "sha256:a4e7850ba96985ace46233779c719354b1d0885e2163aebb574c18193c1fb496",
                "sha256:c3a8b33be85bf60d7a75d6ddaf118bc51475ced656a2b289b3eaf07ce02ed0f2",
                "sha256:c4665715a1e04acd65554e60e92e5927d35db3cb9dc0d2c318fd75d94a7faa39",
                "sha256:cd9cacf436350c2713069125dd6d8e839ada8ac8009d8f91b791f3119cd7f55c",
                "sha256:ce1bb1d392f1eb454fa5ad48034cecd000d77c5c7cafb9d7fb9e5e4b609d072e",
                "sha256:d0b55ffc95a5b82488cc8e87821b6a69c107e0d048c0149a1532792783a8c056",
                "sha256:d9e05843f06b324fceb717bb2d9ab388099e784fadf0c4424e446e4166c4a2ff",
                "sha256:dad5f1d54395a0bd997dc61f51a037ee65055e90a0af6a0604264cfdebd7dbc4",
                "sha256:e1a4e2cce210577dc37b2464978735c9e6400854e0b47e0bdfe708e40a8455a8",
                "sha256:f67b7952ce6d6947dcd486000da4fee101e31d9b9980ecb0c03378ffe995c10d",
                "sha256:fe5e21e60a95cf46917beab04baf43a747272acfe3bbb65aa224b930b6e1bcc0"
            ],
            "index": "pypi",
            "version": "==3.4.3.18"
        },
        "pyserial": {
            "hashes": [
                "sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627",
                "sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8"
            ],
            "index": "pypi",
            "version": "==3.4"
        },
        "python-engineio": {
            "hashes": [
                "sha256:2a4c874aea686e79f8ea9efc30748110df581df6d577d18bb5eaa1a8f2199d12",
                "sha256:eae09ef72bbb13e66ad0bbe2fbb87271e0ba5e2ec8c6693c6be1e14239564e32"
            ],
            "version": "==3.9.3"
        },
        "python-socketio": {
            "hashes": [
                "sha256:aa702157694d55a743fb6f1cc0bd1af58fbfda8a7d71d747d4b12d6dac29cab3",
                "sha256:cd225eb0bb3b348665727cfaafad1e455ee13b8fd9ea9ff2691082b88b9a9444"
            ],
            "version": "==3.1.2"
        },
        "pyxtermjs": {
            "hashes": [
                "sha256:02e426af145e7f28212eaf426dd089d4f6bc1e13f7f6319a8d5e10a27fa195d0",
                "sha256:cbb05c5821b67890b255b54b81f742ea30045d45b5601683d7bf4e14c8096d2c"
            ],
            "index": "pypi",
            "version": "==0.4.0.1"
        },
        "six": {
            "hashes": [
                "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",
                "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"
            ],
            "version": "==1.12.0"
        },
        "spidev": {
            "hashes": [
                "sha256:4314e52f573d95233c907f307558893313a8a606e197e77bb711526b0e179e80"
            ],
            "version": "==3.4"
        },
        "sysv-ipc": {
            "hashes": [
                "sha256:b284e961274c67ed3debfdd8a43f197451c5f100955142bbed380258c6c73e06",
                "sha256:b59fbd42c9de27b42fdda69c4aa7556312112dc6ac7246e44cd875cf049e4273",
                "sha256:cd70548a92218ede2da499080b31e52f1d7cf60716c5cc7d468ec89e8b73c530"
            ],
            "version": "==1.0.0"
        },
        "werkzeug": {
            "hashes": [
                "sha256:7280924747b5733b246fe23972186c6b348f9ae29724135a6dfc1e53cea433e7",
                "sha256:e5f4a1f98b52b18a93da705a7458e55afb26f32bff83ff5d19189f92462d65c4"
            ],
            "version": "==0.16.0"
        }
    },
    "develop": {}
}

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
apprentice This opportunity is meant for those looking for a challenge chore Maintenance-related requests question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants