raspidevkit


Nameraspidevkit JSON
Version 0.0.6.1 PyPI version JSON
download
home_pagehttps://github.com/raspidevkit/raspidevkit
SummaryEasily control devices with Raspberry Pi
upload_time2024-10-20 08:32:08
maintainerNone
docs_urlNone
authorDailyLollipops
requires_python>=3.9
licenseMIT License Copyright (c) 2024 Raspidevkit Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords python raspberry-pi iot arduino
VCS
bugtrack_url
requirements alabaster babel certifi charset-normalizer colorama docutils fake-rpi idna imagesize iniconfig jinja2 markupsafe numpy packaging pluggy pygments pyserial pytest requests smbus2 snowballstemmer sphinx sphinx-rtd-theme sphinxcontrib-applehelp sphinxcontrib-devhelp sphinxcontrib-htmlhelp sphinxcontrib-jquery sphinxcontrib-jsmath sphinxcontrib-qthelp sphinxcontrib-serializinghtml urllib3 wheel
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Raspidevkit
Easily control devices with Raspberry Pi

## Building
### Using setuptools
First, ensure that the `setuptools` and `wheel` packages as installed with

```bash
pip install setuptools 
pip install wheel
```

Navigate to root directory and create the distribution package by running 

```bash
python setup.py sdist bdist_wheel
```

After creating the package, we can now install the package with `pip install dist/raspidevkit-{version}.tar.gz`

### Using build (project.toml)
```bash
pip install piptools build
pip-compile --extra dev pyproject.toml
python -m build
```

After creating the package, we can now install the package with `pip install dist/raspidevkit-{version}.tar.gz`

## Running Test
First ensure that `pytest` is installed on your machine by running

```bash
pip install pytest
```

#### Run all test

```bash
pytest
```

#### Run single test file

```bash
pytest tests/test_gpio_devices.py
```

#### Run single test case

```bash
pytest test/test_gpio_devices.py::TestGpioDevice::test_button
```

## Generating Documentation

To generate documentation, ensure that sphinx, as well as the theme by doing

```bash
pip install sphinx
pip install sphinx_rtd_theme
```

After installing the documentation dependencies navigate to the `docs` folder. Inside the docs folder, run:

```bash
sphinx-build -M html source/ build/
```

## Uploading to PyPi
Install dependencies

```bash
pip install twine
```

Then build the projevt either by using setuptools or by build. After generating the wheel and source file, test it with twine

```bash
twine check dist/*
```

To upload to testpypi use:

```bash
twine upload-r testpypi dist/*
```

To upload to PyPi use:

```bash
twine upload dist/*
```

Enter your API key which should be in the .env file. 

Install it with `pip install raspidevkit`

## Usage

For all devices coverage, you can read the documentation [here](https://raspidevkit.readthedocs.io/en/latest/)

### Blinking an LED
```python
import raspidevkit
import time

machine = raspidevkit.Machine()
led = machine.attach_led(14)
led.turn_on()
time.sleep(3)
led.turn_off()
```
In this example, first we need to create a `Machine` object which represents our Raspberry Pi machine and by calling `attach_{device}` we can spawn a device which we can use to do various things such as for this led, turning on and off.

### Specifying Board Layout
By default, the board layout is set to `BCM`, if you want to set it to `BOARD` layout you can specify the `gpio_mode` for the `Machine`
```python
import raspidevkit
import time

machine = raspidevkit.Machine(gpio_mode=raspidevkit.BOARD)
```

### Logging
The `Machine` class has also a logger which can be enabled on `enable_logging` and `debug` arguments of the Machine class. When `debug` is `True` the logger object will be set to debug level regardless of the logger configuration given. Below is a sample configuration for logger, though this is just option
```python
'logging': {
    'format': '%(asctime)s [%(levelname)s] - %(message)s.',
    'file': 'machine.log',
    'level': logging.INFO
}
```

### Motors, Drivers and Etc.
#### Motors and other devices that may require external drivers that may not be directly connected to the Raspiberry Pi
Devices such as this requires their respective drivers to be first attach to the Raspiberry Pi then from that driver will spawn the Motor or other device object. Below is a sample snippet for L298N motor driver.
```python
import raspidevkit
import time

machine = raspidevkit.Machine()
pins = (12, 13, 14)
l298n = machine.attach_l298n(pins)
motor = l298n.attach_motor()
motor.run()
time.sleep(5)
motor.stop()
```
You can also set the speed of the motor by enabling the PWM mode of the motor by setting `is_pwm` to `True` when attaching motor to the drive
```python
motor = l298n.attach_motor(is_pwm=True)
```

### I2C Communication
The library will also support devices that uses I2C Protocol for communications. By default, when initializing the `Machine` object, the I2C interface is not enabled yet. You can enable it by setting the `i2cbus` to the bus you want to use. For Raspi4 and above it is `1`. 
```python
import raspidevkit
import time

machine = raspidevkit.Machine(i2cbus=1)
```
As of this writing, the I2C communication is still in testing mode and currently no devices has been implemented yet :(

### Arduino Boards
Raspidevkit also supports controlling devices that are attached to an Arduino in which the Arduino is attached to the Arduino. As of now, the currenly supported communication mode is just for serial. This also features auto code generation, compilation and upload to the Arduino Board. 

#### Auto Code Generation and Upload
If you plan to use the auto upload feature, you must first install the `arduino-cli` in your system. Below is a sample snippet with auto upload feature.
```python
import raspidevkit
import time

machine = raspidevkit.Machine(arduino_cli_path=r'/path/to/arduino-cli')
arduino = machine.attach_arduino('/tty/USB0', timeout=5)
led = arduino.attach_led(13)
arduino.compile()
led.turn_on()
time.sleep(3)
led.turn_off()
```
The principle of drivers mentioned above is also true for the arduino board wherein we attached first the arduino object on the machine then spawning the LED object from the arduino. The `Arduino` object is also just a subclass of `serial.Serial` object so any other arguments such as baudrate can also be applied when initializing the object. I also recommend putting a timeout of higher than 3 especially when dealing with devices that needs to send higher size of data to the Arduino.

When working with the Arduino, it is required to call the `compile` method which would handle the code generation and auto upload of the code to the Arduino board. So, before you call this method make sure that all devices you want to use in your Arduino Board are declared as this will only include devices attached up until the `compile` method was called.

#### Without Arduino-cli
If you have not installed the arduino-cli in your system or the library could not find the arduino-cli in the path you have provided. Then it will throw an exception when the compile method was called. You can however generate the code and have it manually uploaded to the Arduino. Here's how:
```python
import raspidevkit
import time

machine = raspidevkit.Machine()
arduino = machine.attach_arduino('/tty/USB0', timeout=5)
led = arduino.attach_led(13)
arduino.generate_code('test.ino')
### Have it uploaded then run the script again ###
led.turn_on()
time.sleep(3)
led.turn_off()
```
Here, we first generate the code to the file `test.ino` and manually uploaded the sketch file to the Arduino. after the sketch is uploaded we can then skip the code generation part and control our LED. However, this may be too much time-consuming in the long run

## Contribution
Thank you for considering contributing to our project! We welcome contributions from everyone. Please take a moment to review this document in order to make the contribution process straightforward and effective for everyone involved.

### Ways to Contribute
There are many ways to contribute to this project:

- Reporting bugs
- Suggesting enhancements
- Writing documentation
- Fixing bugs
- Implementing new features
- Providing feedback on issues

### Getting Started
If you're new to contributing to open source projects, check out the following resources to get started:

- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/)
- [First Timers Only](https://www.firsttimersonly.com/)

### Issues
Issues are tracked in our [GitHub issue tracker](https://github.com/yourusername/your_project_name/issues). Please search the existing issues before filing a new one to avoid duplicates. If you find your issue already exists, you can contribute to the discussion or provide additional information.

### Pull Requests
We use Pull Requests (PRs) to review and merge changes into the main codebase. If you're not familiar with Pull Requests, please refer to GitHub's documentation on [Creating a Pull Request](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request).

## License
This project is licensed under the MIT License - see the [LICENSE](https://github.com/raspidevkit/raspidevkit/blob/development/LICENSE) file for details.

## Third-Party Libraries
We would like to thank the developers of the following third-party libraries, which were used in the development of this project:

- [RPi.GPIO](https://pypi.org/project/RPi.GPIO/): Fundamental package for the GPIO interface of the library.
- [fake-rpi](https://pypi.org/project/fake-rpi/): Used for development on other platforms without using Raspberry Pi.
- [smbus2](https://pypi.org/project/smbus2/): Fundamental package for the I2C interface of the library.
- [pyserial](https://pypi.org/project/pyserial/): Fundamental package for the serial interface of the library.
- [arduino-cli](https://arduino.github.io/arduino-cli/latest/): For the great solutions for automating development with Arduino Boards.
- and others...

These libraries have been instrumental in achieving various functionalities within our project. We express our gratitude to the developers for their hard work and dedication in creating and maintaining these essential tools.

## TODO
- [x] Launch to PyPi
- [x] Create documentation
- [ ] Add support for SPI devices
- [ ] Add more supported devices

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/raspidevkit/raspidevkit",
    "name": "raspidevkit",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "python, raspberry-pi, iot, arduino",
    "author": "DailyLollipops",
    "author_email": "DailyLollipops <clarencemadrigal84@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/76/91/b4535db696663c23b2d22141eacd8905b767c4b6824a52103ccee2fb0446/raspidevkit-0.0.6.1.tar.gz",
    "platform": null,
    "description": "# Raspidevkit\r\nEasily control devices with Raspberry Pi\r\n\r\n## Building\r\n### Using setuptools\r\nFirst, ensure that the `setuptools` and `wheel` packages as installed with\r\n\r\n```bash\r\npip install setuptools \r\npip install wheel\r\n```\r\n\r\nNavigate to root directory and create the distribution package by running \r\n\r\n```bash\r\npython setup.py sdist bdist_wheel\r\n```\r\n\r\nAfter creating the package, we can now install the package with `pip install dist/raspidevkit-{version}.tar.gz`\r\n\r\n### Using build (project.toml)\r\n```bash\r\npip install piptools build\r\npip-compile --extra dev pyproject.toml\r\npython -m build\r\n```\r\n\r\nAfter creating the package, we can now install the package with `pip install dist/raspidevkit-{version}.tar.gz`\r\n\r\n## Running Test\r\nFirst ensure that `pytest` is installed on your machine by running\r\n\r\n```bash\r\npip install pytest\r\n```\r\n\r\n#### Run all test\r\n\r\n```bash\r\npytest\r\n```\r\n\r\n#### Run single test file\r\n\r\n```bash\r\npytest tests/test_gpio_devices.py\r\n```\r\n\r\n#### Run single test case\r\n\r\n```bash\r\npytest test/test_gpio_devices.py::TestGpioDevice::test_button\r\n```\r\n\r\n## Generating Documentation\r\n\r\nTo generate documentation, ensure that sphinx, as well as the theme by doing\r\n\r\n```bash\r\npip install sphinx\r\npip install sphinx_rtd_theme\r\n```\r\n\r\nAfter installing the documentation dependencies navigate to the `docs` folder. Inside the docs folder, run:\r\n\r\n```bash\r\nsphinx-build -M html source/ build/\r\n```\r\n\r\n## Uploading to PyPi\r\nInstall dependencies\r\n\r\n```bash\r\npip install twine\r\n```\r\n\r\nThen build the projevt either by using setuptools or by build. After generating the wheel and source file, test it with twine\r\n\r\n```bash\r\ntwine check dist/*\r\n```\r\n\r\nTo upload to testpypi use:\r\n\r\n```bash\r\ntwine upload-r testpypi dist/*\r\n```\r\n\r\nTo upload to PyPi use:\r\n\r\n```bash\r\ntwine upload dist/*\r\n```\r\n\r\nEnter your API key which should be in the .env file. \r\n\r\nInstall it with `pip install raspidevkit`\r\n\r\n## Usage\r\n\r\nFor all devices coverage, you can read the documentation [here](https://raspidevkit.readthedocs.io/en/latest/)\r\n\r\n### Blinking an LED\r\n```python\r\nimport raspidevkit\r\nimport time\r\n\r\nmachine = raspidevkit.Machine()\r\nled = machine.attach_led(14)\r\nled.turn_on()\r\ntime.sleep(3)\r\nled.turn_off()\r\n```\r\nIn this example, first we need to create a `Machine` object which represents our Raspberry Pi machine and by calling `attach_{device}` we can spawn a device which we can use to do various things such as for this led, turning on and off.\r\n\r\n### Specifying Board Layout\r\nBy default, the board layout is set to `BCM`, if you want to set it to `BOARD` layout you can specify the `gpio_mode` for the `Machine`\r\n```python\r\nimport raspidevkit\r\nimport time\r\n\r\nmachine = raspidevkit.Machine(gpio_mode=raspidevkit.BOARD)\r\n```\r\n\r\n### Logging\r\nThe `Machine` class has also a logger which can be enabled on `enable_logging` and `debug` arguments of the Machine class. When `debug` is `True` the logger object will be set to debug level regardless of the logger configuration given. Below is a sample configuration for logger, though this is just option\r\n```python\r\n'logging': {\r\n    'format': '%(asctime)s [%(levelname)s] - %(message)s.',\r\n    'file': 'machine.log',\r\n    'level': logging.INFO\r\n}\r\n```\r\n\r\n### Motors, Drivers and Etc.\r\n#### Motors and other devices that may require external drivers that may not be directly connected to the Raspiberry Pi\r\nDevices such as this requires their respective drivers to be first attach to the Raspiberry Pi then from that driver will spawn the Motor or other device object. Below is a sample snippet for L298N motor driver.\r\n```python\r\nimport raspidevkit\r\nimport time\r\n\r\nmachine = raspidevkit.Machine()\r\npins = (12, 13, 14)\r\nl298n = machine.attach_l298n(pins)\r\nmotor = l298n.attach_motor()\r\nmotor.run()\r\ntime.sleep(5)\r\nmotor.stop()\r\n```\r\nYou can also set the speed of the motor by enabling the PWM mode of the motor by setting `is_pwm` to `True` when attaching motor to the drive\r\n```python\r\nmotor = l298n.attach_motor(is_pwm=True)\r\n```\r\n\r\n### I2C Communication\r\nThe library will also support devices that uses I2C Protocol for communications. By default, when initializing the `Machine` object, the I2C interface is not enabled yet. You can enable it by setting the `i2cbus` to the bus you want to use. For Raspi4 and above it is `1`. \r\n```python\r\nimport raspidevkit\r\nimport time\r\n\r\nmachine = raspidevkit.Machine(i2cbus=1)\r\n```\r\nAs of this writing, the I2C communication is still in testing mode and currently no devices has been implemented yet :(\r\n\r\n### Arduino Boards\r\nRaspidevkit also supports controlling devices that are attached to an Arduino in which the Arduino is attached to the Arduino. As of now, the currenly supported communication mode is just for serial. This also features auto code generation, compilation and upload to the Arduino Board. \r\n\r\n#### Auto Code Generation and Upload\r\nIf you plan to use the auto upload feature, you must first install the `arduino-cli` in your system. Below is a sample snippet with auto upload feature.\r\n```python\r\nimport raspidevkit\r\nimport time\r\n\r\nmachine = raspidevkit.Machine(arduino_cli_path=r'/path/to/arduino-cli')\r\narduino = machine.attach_arduino('/tty/USB0', timeout=5)\r\nled = arduino.attach_led(13)\r\narduino.compile()\r\nled.turn_on()\r\ntime.sleep(3)\r\nled.turn_off()\r\n```\r\nThe principle of drivers mentioned above is also true for the arduino board wherein we attached first the arduino object on the machine then spawning the LED object from the arduino. The `Arduino` object is also just a subclass of `serial.Serial` object so any other arguments such as baudrate can also be applied when initializing the object. I also recommend putting a timeout of higher than 3 especially when dealing with devices that needs to send higher size of data to the Arduino.\r\n\r\nWhen working with the Arduino, it is required to call the `compile` method which would handle the code generation and auto upload of the code to the Arduino board. So, before you call this method make sure that all devices you want to use in your Arduino Board are declared as this will only include devices attached up until the `compile` method was called.\r\n\r\n#### Without Arduino-cli\r\nIf you have not installed the arduino-cli in your system or the library could not find the arduino-cli in the path you have provided. Then it will throw an exception when the compile method was called. You can however generate the code and have it manually uploaded to the Arduino. Here's how:\r\n```python\r\nimport raspidevkit\r\nimport time\r\n\r\nmachine = raspidevkit.Machine()\r\narduino = machine.attach_arduino('/tty/USB0', timeout=5)\r\nled = arduino.attach_led(13)\r\narduino.generate_code('test.ino')\r\n### Have it uploaded then run the script again ###\r\nled.turn_on()\r\ntime.sleep(3)\r\nled.turn_off()\r\n```\r\nHere, we first generate the code to the file `test.ino` and manually uploaded the sketch file to the Arduino. after the sketch is uploaded we can then skip the code generation part and control our LED. However, this may be too much time-consuming in the long run\r\n\r\n## Contribution\r\nThank you for considering contributing to our project! We welcome contributions from everyone. Please take a moment to review this document in order to make the contribution process straightforward and effective for everyone involved.\r\n\r\n### Ways to Contribute\r\nThere are many ways to contribute to this project:\r\n\r\n- Reporting bugs\r\n- Suggesting enhancements\r\n- Writing documentation\r\n- Fixing bugs\r\n- Implementing new features\r\n- Providing feedback on issues\r\n\r\n### Getting Started\r\nIf you're new to contributing to open source projects, check out the following resources to get started:\r\n\r\n- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/)\r\n- [First Timers Only](https://www.firsttimersonly.com/)\r\n\r\n### Issues\r\nIssues are tracked in our [GitHub issue tracker](https://github.com/yourusername/your_project_name/issues). Please search the existing issues before filing a new one to avoid duplicates. If you find your issue already exists, you can contribute to the discussion or provide additional information.\r\n\r\n### Pull Requests\r\nWe use Pull Requests (PRs) to review and merge changes into the main codebase. If you're not familiar with Pull Requests, please refer to GitHub's documentation on [Creating a Pull Request](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request).\r\n\r\n## License\r\nThis project is licensed under the MIT License - see the [LICENSE](https://github.com/raspidevkit/raspidevkit/blob/development/LICENSE) file for details.\r\n\r\n## Third-Party Libraries\r\nWe would like to thank the developers of the following third-party libraries, which were used in the development of this project:\r\n\r\n- [RPi.GPIO](https://pypi.org/project/RPi.GPIO/): Fundamental package for the GPIO interface of the library.\r\n- [fake-rpi](https://pypi.org/project/fake-rpi/): Used for development on other platforms without using Raspberry Pi.\r\n- [smbus2](https://pypi.org/project/smbus2/): Fundamental package for the I2C interface of the library.\r\n- [pyserial](https://pypi.org/project/pyserial/): Fundamental package for the serial interface of the library.\r\n- [arduino-cli](https://arduino.github.io/arduino-cli/latest/): For the great solutions for automating development with Arduino Boards.\r\n- and others...\r\n\r\nThese libraries have been instrumental in achieving various functionalities within our project. We express our gratitude to the developers for their hard work and dedication in creating and maintaining these essential tools.\r\n\r\n## TODO\r\n- [x] Launch to PyPi\r\n- [x] Create documentation\r\n- [ ] Add support for SPI devices\r\n- [ ] Add more supported devices\r\n",
    "bugtrack_url": null,
    "license": "MIT License  Copyright (c) 2024 Raspidevkit  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
    "summary": "Easily control devices with Raspberry Pi",
    "version": "0.0.6.1",
    "project_urls": {
        "Homepage": "https://github.com/raspidevkit/raspidevkit"
    },
    "split_keywords": [
        "python",
        " raspberry-pi",
        " iot",
        " arduino"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7029985d3576b1ec543928329f6ae745ad2dc8277d592910d0d2dd3a7b2af726",
                "md5": "d347c7d8c93a6618250d2abac718c4f0",
                "sha256": "00f9ca108f3ab71334f9737539b42bb049345de4cb610ec02678c10d02a75921"
            },
            "downloads": -1,
            "filename": "raspidevkit-0.0.6.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d347c7d8c93a6618250d2abac718c4f0",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 48292,
            "upload_time": "2024-10-20T08:32:07",
            "upload_time_iso_8601": "2024-10-20T08:32:07.354917Z",
            "url": "https://files.pythonhosted.org/packages/70/29/985d3576b1ec543928329f6ae745ad2dc8277d592910d0d2dd3a7b2af726/raspidevkit-0.0.6.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7691b4535db696663c23b2d22141eacd8905b767c4b6824a52103ccee2fb0446",
                "md5": "5b83603a8ac739f3c44d88a01d6e39f8",
                "sha256": "a57ecdb25447552cc974608c5f7ec55675d070b8c773fd896a42616d3effabab"
            },
            "downloads": -1,
            "filename": "raspidevkit-0.0.6.1.tar.gz",
            "has_sig": false,
            "md5_digest": "5b83603a8ac739f3c44d88a01d6e39f8",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 36657,
            "upload_time": "2024-10-20T08:32:08",
            "upload_time_iso_8601": "2024-10-20T08:32:08.820766Z",
            "url": "https://files.pythonhosted.org/packages/76/91/b4535db696663c23b2d22141eacd8905b767c4b6824a52103ccee2fb0446/raspidevkit-0.0.6.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-20 08:32:08",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "raspidevkit",
    "github_project": "raspidevkit",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "alabaster",
            "specs": [
                [
                    "==",
                    "0.7.16"
                ]
            ]
        },
        {
            "name": "babel",
            "specs": [
                [
                    "==",
                    "2.14.0"
                ]
            ]
        },
        {
            "name": "certifi",
            "specs": [
                [
                    "==",
                    "2024.2.2"
                ]
            ]
        },
        {
            "name": "charset-normalizer",
            "specs": [
                [
                    "==",
                    "3.3.2"
                ]
            ]
        },
        {
            "name": "colorama",
            "specs": [
                [
                    "==",
                    "0.4.6"
                ]
            ]
        },
        {
            "name": "docutils",
            "specs": [
                [
                    "==",
                    "0.20.1"
                ]
            ]
        },
        {
            "name": "fake-rpi",
            "specs": [
                [
                    "==",
                    "0.7.1"
                ]
            ]
        },
        {
            "name": "idna",
            "specs": [
                [
                    "==",
                    "3.7"
                ]
            ]
        },
        {
            "name": "imagesize",
            "specs": [
                [
                    "==",
                    "1.4.1"
                ]
            ]
        },
        {
            "name": "iniconfig",
            "specs": [
                [
                    "==",
                    "2.0.0"
                ]
            ]
        },
        {
            "name": "jinja2",
            "specs": [
                [
                    "==",
                    "3.1.3"
                ]
            ]
        },
        {
            "name": "markupsafe",
            "specs": [
                [
                    "==",
                    "2.1.5"
                ]
            ]
        },
        {
            "name": "numpy",
            "specs": [
                [
                    "==",
                    "1.26.4"
                ]
            ]
        },
        {
            "name": "packaging",
            "specs": [
                [
                    "==",
                    "24.0"
                ]
            ]
        },
        {
            "name": "pluggy",
            "specs": [
                [
                    "==",
                    "1.4.0"
                ]
            ]
        },
        {
            "name": "pygments",
            "specs": [
                [
                    "==",
                    "2.17.2"
                ]
            ]
        },
        {
            "name": "pyserial",
            "specs": [
                [
                    "==",
                    "3.5"
                ]
            ]
        },
        {
            "name": "pytest",
            "specs": [
                [
                    "==",
                    "8.1.1"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.31.0"
                ]
            ]
        },
        {
            "name": "smbus2",
            "specs": [
                [
                    "==",
                    "0.4.3"
                ]
            ]
        },
        {
            "name": "snowballstemmer",
            "specs": [
                [
                    "==",
                    "2.2.0"
                ]
            ]
        },
        {
            "name": "sphinx",
            "specs": [
                [
                    "==",
                    "7.2.6"
                ]
            ]
        },
        {
            "name": "sphinx-rtd-theme",
            "specs": [
                [
                    "==",
                    "2.0.0"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-applehelp",
            "specs": [
                [
                    "==",
                    "1.0.8"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-devhelp",
            "specs": [
                [
                    "==",
                    "1.0.6"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-htmlhelp",
            "specs": [
                [
                    "==",
                    "2.0.5"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-jquery",
            "specs": [
                [
                    "==",
                    "4.1"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-jsmath",
            "specs": [
                [
                    "==",
                    "1.0.1"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-qthelp",
            "specs": [
                [
                    "==",
                    "1.0.7"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-serializinghtml",
            "specs": [
                [
                    "==",
                    "1.1.10"
                ]
            ]
        },
        {
            "name": "urllib3",
            "specs": [
                [
                    "==",
                    "2.2.1"
                ]
            ]
        },
        {
            "name": "wheel",
            "specs": [
                [
                    "==",
                    "0.43.0"
                ]
            ]
        }
    ],
    "lcname": "raspidevkit"
}
        
Elapsed time: 0.38047s