From 6f120b1e4a123cd2df58898740fd71fb7d72be0f Mon Sep 17 00:00:00 2001 From: dherrada Date: Tue, 9 Nov 2021 13:31:14 -0500 Subject: [PATCH 01/65] Updated readthedocs file Signed-off-by: dherrada --- .readthedocs.yaml | 15 +++++++++++++++ .readthedocs.yml | 7 ------- 2 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 .readthedocs.yaml delete mode 100644 .readthedocs.yml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..95ec218 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +python: + version: "3.6" + install: + - requirements: docs/requirements.txt + - requirements: requirements.txt diff --git a/.readthedocs.yml b/.readthedocs.yml deleted file mode 100644 index 49dcab3..0000000 --- a/.readthedocs.yml +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries -# -# SPDX-License-Identifier: Unlicense - -python: - version: 3 -requirements_file: docs/requirements.txt From 13a8e9590de88fe863c59eba8ee354c48def9e9e Mon Sep 17 00:00:00 2001 From: foamyguy Date: Tue, 23 Nov 2021 13:12:47 -0600 Subject: [PATCH 02/65] update rtd py version --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 95ec218..1335112 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -9,7 +9,7 @@ version: 2 python: - version: "3.6" + version: "3.7" install: - requirements: docs/requirements.txt - requirements: requirements.txt From c24bc0562bd869df14ab8b983957209d4ddff4b1 Mon Sep 17 00:00:00 2001 From: th1395 Tony Hansen Date: Tue, 30 Nov 2021 13:57:50 -0500 Subject: [PATCH 03/65] Add support for a TextPacket, as sent using the UART module in the AdaFruit BlueTooth app --- adafruit_bluefruit_connect/text_packet.py | 47 +++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 adafruit_bluefruit_connect/text_packet.py diff --git a/adafruit_bluefruit_connect/text_packet.py b/adafruit_bluefruit_connect/text_packet.py new file mode 100644 index 0000000..58d3274 --- /dev/null +++ b/adafruit_bluefruit_connect/text_packet.py @@ -0,0 +1,47 @@ +# SPDX-FileCopyrightText: 2021 Tony Hansen +# +# SPDX-License-Identifier: MIT + +""" +`adafruit_bluefruit_connect.text_packet` +==================================================== + +Bluefruit Connect App text data packet. + +Note that the text data packet is different from those used by the +Controller module (e.g. Accelerometer, Control Pad, and Color Picker). +Those use the bytes "!x" (where x is specific to the type of packet), +followed by data specific to the packet, followed by a checksum. +The UART text sender instead sends the bytes followed by a newline. +There is no length indicator, no checksum, etc. + +Consequently, this packet type is MUCH simpler than the other packet types. + +* Author(s): Tony Hansen + +""" + +import struct + +from .packet import Packet + + +class TextPacket(Packet): + """A packet containing a text string.""" + + _TYPE_HEADER = b"TX" + + def __init__(self, text): + """Construct a TextPacket from a binary string.""" + if isinstance(text, bytes): + self._text = text.strip() + else: + raise ValueError("Text must be a bytes string") + + @property + def text(self): + """Return the text associated with the object.""" + return self._text + +# Register this class with the superclass. This allows the user to import only what is needed. +TextPacket.register_packet_type() From c9eca4b714fe95fdc5bcfeaafbb85a861207063e Mon Sep 17 00:00:00 2001 From: th1395 Tony Hansen Date: Tue, 30 Nov 2021 14:08:26 -0500 Subject: [PATCH 04/65] Add support for a TextPacket, as sent using the UART module in the AdaFruit BlueTooth app --- adafruit_bluefruit_connect/packet.py | 12 +++++++++++- adafruit_bluefruit_connect/text_packet.py | 2 -- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index 5e8ead7..0bb481f 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -101,7 +101,17 @@ def from_stream(cls, stream): # Timeout: nothing more read. return None break - # Didn't find a packet start. Loop and try again. + # Didn't find a packet start. + else: + text_packet_cls = cls._type_to_class.get(b"TX", None) + # Is TextPacket registered? + # If so, read an entire line and pass that to TextPacket. + if text_packet_cls: + ln = stream.readline() + packet = bytes(start + ln) + return text_packet_cls(packet) + + # else loop and try again. header = bytes(start + packet_type) packet_class = cls._type_to_class.get(header, None) diff --git a/adafruit_bluefruit_connect/text_packet.py b/adafruit_bluefruit_connect/text_packet.py index 58d3274..16254ac 100644 --- a/adafruit_bluefruit_connect/text_packet.py +++ b/adafruit_bluefruit_connect/text_packet.py @@ -21,8 +21,6 @@ """ -import struct - from .packet import Packet From c9d2b4d2837dc6241de1219fea77a963cad42c41 Mon Sep 17 00:00:00 2001 From: th1395 Tony Hansen Date: Tue, 30 Nov 2021 14:19:22 -0500 Subject: [PATCH 05/65] Add support for a TextPacket, as sent using the UART module in the AdaFruit BlueTooth app --- adafruit_bluefruit_connect/packet.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index 0bb481f..b25b0c0 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -94,6 +94,7 @@ def from_stream(cls, stream): if not start: # Timeout: nothing read. return None + if start == b"!": # Found start of packet. packet_type = stream.read(1) @@ -101,17 +102,16 @@ def from_stream(cls, stream): # Timeout: nothing more read. return None break + # Didn't find a packet start. - else: - text_packet_cls = cls._type_to_class.get(b"TX", None) - # Is TextPacket registered? - # If so, read an entire line and pass that to TextPacket. - if text_packet_cls: - ln = stream.readline() - packet = bytes(start + ln) - return text_packet_cls(packet) - - # else loop and try again. + text_packet_cls = cls._type_to_class.get(b"TX", None) + # Is TextPacket registered? + # If so, read an entire line and pass that to TextPacket. + if text_packet_cls: + packet = bytes(start + stream.readline()) + return text_packet_cls(packet) + + # else loop and try again. header = bytes(start + packet_type) packet_class = cls._type_to_class.get(header, None) From a4625c2e6c27359630ae41c6e898ab8d376f1df3 Mon Sep 17 00:00:00 2001 From: th1395 Tony Hansen Date: Tue, 30 Nov 2021 14:23:26 -0500 Subject: [PATCH 06/65] Add support for a TextPacket, as sent using the UART module in the AdaFruit BlueTooth app --- adafruit_bluefruit_connect/packet.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index b25b0c0..3ca7ac9 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -104,14 +104,14 @@ def from_stream(cls, stream): break # Didn't find a packet start. - text_packet_cls = cls._type_to_class.get(b"TX", None) - # Is TextPacket registered? - # If so, read an entire line and pass that to TextPacket. - if text_packet_cls: - packet = bytes(start + stream.readline()) - return text_packet_cls(packet) - - # else loop and try again. + text_packet_cls = cls._type_to_class.get(b"TX", None) + # Is TextPacket registered? + # If so, read an entire line and pass that to TextPacket. + if text_packet_cls: + packet = bytes(start + stream.readline()) + return text_packet_cls(packet) + + # else loop and try again. header = bytes(start + packet_type) packet_class = cls._type_to_class.get(header, None) From fc85f4f28cef0b20608b6e835a138e593989363b Mon Sep 17 00:00:00 2001 From: th1395 Tony Hansen Date: Tue, 30 Nov 2021 14:31:04 -0500 Subject: [PATCH 07/65] Add support for a TextPacket, as sent using the UART module in the AdaFruit BlueTooth app --- adafruit_bluefruit_connect/text_packet.py | 1 + 1 file changed, 1 insertion(+) diff --git a/adafruit_bluefruit_connect/text_packet.py b/adafruit_bluefruit_connect/text_packet.py index 16254ac..87f781b 100644 --- a/adafruit_bluefruit_connect/text_packet.py +++ b/adafruit_bluefruit_connect/text_packet.py @@ -41,5 +41,6 @@ def text(self): """Return the text associated with the object.""" return self._text + # Register this class with the superclass. This allows the user to import only what is needed. TextPacket.register_packet_type() From 8b3570ec5d8f77edc732464681ef3dccf1cd7458 Mon Sep 17 00:00:00 2001 From: th1395 Tony Hansen Date: Mon, 13 Dec 2021 09:07:56 -0500 Subject: [PATCH 08/65] [20211213] as requested by @FoamyGuy, add example code using TextPacket --- examples/bluefruitconnect_simpletest2.py | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 examples/bluefruitconnect_simpletest2.py diff --git a/examples/bluefruitconnect_simpletest2.py b/examples/bluefruitconnect_simpletest2.py new file mode 100644 index 0000000..19ba476 --- /dev/null +++ b/examples/bluefruitconnect_simpletest2.py @@ -0,0 +1,36 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-License-Identifier: MIT + +# Print out the color data from ColorPackets and text data from TextPackets. +# To use, start this program, and start the Adafruit Bluefruit LE Connect app. +# Connect, and then select colors on the Controller->Color Picker screen. +# Select text by entering the UART screen and sending in in a string. +# (Do NOT use a "!" as part of your string.) + +from adafruit_ble import BLERadio +from adafruit_ble.advertising.standard import ProvideServicesAdvertisement +from adafruit_ble.services.nordic import UARTService +from adafruit_bluefruit_connect.packet import Packet + +# Only the packet classes that are imported will be known to Packet. +from adafruit_bluefruit_connect.color_packet import ColorPacket +from adafruit_bluefruit_connect.text_packet import TextPacket + +ble = BLERadio() +uart_server = UARTService() +advertisement = ProvideServicesAdvertisement(uart_server) + +while True: + # Advertise when not connected. + ble.start_advertising(advertisement) + while not ble.connected: + pass + + while ble.connected: + packet = Packet.from_stream(uart_server) + if isinstance(packet, ColorPacket): + print(packet.color) + elif isinstance(packet, TextPacket): + print("Received Text Packet:") + print(packet.text) + From eb6072446459eb16ffea500084ca5d690f0cacf1 Mon Sep 17 00:00:00 2001 From: th1395 Tony Hansen Date: Mon, 13 Dec 2021 09:15:15 -0500 Subject: [PATCH 09/65] [20211213] as requested by @FoamyGuy, add example code using TextPacket --- examples/bluefruitconnect_simpletest2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/bluefruitconnect_simpletest2.py b/examples/bluefruitconnect_simpletest2.py index 19ba476..f6b4cf7 100644 --- a/examples/bluefruitconnect_simpletest2.py +++ b/examples/bluefruitconnect_simpletest2.py @@ -33,4 +33,3 @@ elif isinstance(packet, TextPacket): print("Received Text Packet:") print(packet.text) - From f454e413b8c8fd95bb13fbc387b6a9eb9efe585d Mon Sep 17 00:00:00 2001 From: th1395 Tony Hansen Date: Mon, 13 Dec 2021 18:09:14 -0500 Subject: [PATCH 10/65] [20211213] as requested by @dhalbert, rename TextPacket to RawTextpacket --- adafruit_bluefruit_connect/packet.py | 10 +++++----- .../{text_packet.py => raw_text_packet.py} | 17 +++++++++-------- docs/examples.rst | 8 ++++++++ examples/bluefruitconnect_simpletest2.py | 12 ++++++------ 4 files changed, 28 insertions(+), 19 deletions(-) rename adafruit_bluefruit_connect/{text_packet.py => raw_text_packet.py} (69%) diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index 3ca7ac9..b3b8d3c 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -104,12 +104,12 @@ def from_stream(cls, stream): break # Didn't find a packet start. - text_packet_cls = cls._type_to_class.get(b"TX", None) - # Is TextPacket registered? - # If so, read an entire line and pass that to TextPacket. - if text_packet_cls: + raw_text_packet_cls = cls._type_to_class.get(b"RT", None) + # Is RawTextPacket registered? + # If so, read an entire line and pass that to RawTextPacket. + if raw_text_packet_cls: packet = bytes(start + stream.readline()) - return text_packet_cls(packet) + return raw_text_packet_cls(packet) # else loop and try again. diff --git a/adafruit_bluefruit_connect/text_packet.py b/adafruit_bluefruit_connect/raw_text_packet.py similarity index 69% rename from adafruit_bluefruit_connect/text_packet.py rename to adafruit_bluefruit_connect/raw_text_packet.py index 87f781b..729eea0 100644 --- a/adafruit_bluefruit_connect/text_packet.py +++ b/adafruit_bluefruit_connect/raw_text_packet.py @@ -3,17 +3,18 @@ # SPDX-License-Identifier: MIT """ -`adafruit_bluefruit_connect.text_packet` +`adafruit_bluefruit_connect.raw_text_packet` ==================================================== -Bluefruit Connect App text data packet. +Bluefruit Connect App raw text data packet. -Note that the text data packet is different from those used by the +Note that the raw text data packet is different from those used by the Controller module (e.g. Accelerometer, Control Pad, and Color Picker). Those use the bytes "!x" (where x is specific to the type of packet), followed by data specific to the packet, followed by a checksum. The UART text sender instead sends the bytes followed by a newline. -There is no length indicator, no checksum, etc. +There is no length indicator, no checksum, etc. Of course, that also +precludes the use of an "!" at the beginning of the string. Consequently, this packet type is MUCH simpler than the other packet types. @@ -24,13 +25,13 @@ from .packet import Packet -class TextPacket(Packet): +class RawTextPacket(Packet): """A packet containing a text string.""" - _TYPE_HEADER = b"TX" + _TYPE_HEADER = b"RT" def __init__(self, text): - """Construct a TextPacket from a binary string.""" + """Construct a RawTextPacket from a binary string.""" if isinstance(text, bytes): self._text = text.strip() else: @@ -43,4 +44,4 @@ def text(self): # Register this class with the superclass. This allows the user to import only what is needed. -TextPacket.register_packet_type() +RawTextPacket.register_packet_type() diff --git a/docs/examples.rst b/docs/examples.rst index a672dc8..ca8be09 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -24,3 +24,11 @@ This example demonstrates receiving text from the UART interface. .. literalinclude:: ../examples/bluefruitconnect_uart.py :caption: examples/bluefruitconnect_uart.py :linenos: + +This example demonstrates receiving both a color (as in simpletest above) +and raw text (using RawTextPacket). + +.. literalinclude:: ../examples/bluefruitconnect_simpletest.py + :caption: examples/bluefruitconnect_simpletest.py + :linenos: + diff --git a/examples/bluefruitconnect_simpletest2.py b/examples/bluefruitconnect_simpletest2.py index f6b4cf7..ecb2172 100644 --- a/examples/bluefruitconnect_simpletest2.py +++ b/examples/bluefruitconnect_simpletest2.py @@ -1,11 +1,11 @@ # SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT -# Print out the color data from ColorPackets and text data from TextPackets. +# Print out the color data from ColorPackets and text data from RawTextPackets. # To use, start this program, and start the Adafruit Bluefruit LE Connect app. # Connect, and then select colors on the Controller->Color Picker screen. -# Select text by entering the UART screen and sending in in a string. -# (Do NOT use a "!" as part of your string.) +# Select text by entering the UART screen and sending a string. +# (Do NOT use a "!" at the start of your string.) from adafruit_ble import BLERadio from adafruit_ble.advertising.standard import ProvideServicesAdvertisement @@ -14,7 +14,7 @@ # Only the packet classes that are imported will be known to Packet. from adafruit_bluefruit_connect.color_packet import ColorPacket -from adafruit_bluefruit_connect.text_packet import TextPacket +from adafruit_bluefruit_connect.raw_text_packet import RawTextPacket ble = BLERadio() uart_server = UARTService() @@ -30,6 +30,6 @@ packet = Packet.from_stream(uart_server) if isinstance(packet, ColorPacket): print(packet.color) - elif isinstance(packet, TextPacket): - print("Received Text Packet:") + elif isinstance(packet, RawTextPacket): + print("Received Raw Text Packet:") print(packet.text) From 5f16ad65ac5c14790d358803a6085eae8a7b8155 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Mon, 13 Dec 2021 18:47:57 -0500 Subject: [PATCH 11/65] Remove blank lines at end of file. --- docs/examples.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/examples.rst b/docs/examples.rst index ca8be09..2e58955 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -31,4 +31,3 @@ and raw text (using RawTextPacket). .. literalinclude:: ../examples/bluefruitconnect_simpletest.py :caption: examples/bluefruitconnect_simpletest.py :linenos: - From 3535ca3f844cadc071688fb3b3b0eb55d314b79d Mon Sep 17 00:00:00 2001 From: dherrada Date: Thu, 13 Jan 2022 16:27:30 -0500 Subject: [PATCH 12/65] First part of patch Signed-off-by: dherrada --- .../PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md | 2 +- .github/workflows/build.yml | 6 +++--- .github/workflows/release.yml | 8 ++++---- .readthedocs.yaml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md b/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md index 71ef8f8..8de294e 100644 --- a/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md +++ b/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md @@ -4,7 +4,7 @@ Thank you for contributing! Before you submit a pull request, please read the following. -Make sure any changes you're submitting are in line with the CircuitPython Design Guide, available here: https://circuitpython.readthedocs.io/en/latest/docs/design_guide.html +Make sure any changes you're submitting are in line with the CircuitPython Design Guide, available here: https://docs.circuitpython.org/en/latest/docs/design_guide.html If your changes are to documentation, please verify that the documentation builds locally by following the steps found here: https://adafru.it/build-docs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ca35544..474520d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,10 +22,10 @@ jobs: awk -F '\/' '{ print tolower($2) }' | tr '_' '-' ) - - name: Set up Python 3.7 - uses: actions/setup-python@v1 + - name: Set up Python 3.x + uses: actions/setup-python@v2 with: - python-version: 3.7 + python-version: "3.x" - name: Versions run: | python3 --version diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6d0015a..a65e5de 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,10 +24,10 @@ jobs: awk -F '\/' '{ print tolower($2) }' | tr '_' '-' ) - - name: Set up Python 3.6 - uses: actions/setup-python@v1 + - name: Set up Python 3.x + uses: actions/setup-python@v2 with: - python-version: 3.6 + python-version: "3.x" - name: Versions run: | python3 --version @@ -67,7 +67,7 @@ jobs: echo ::set-output name=setup-py::$( find . -wholename './setup.py' ) - name: Set up Python if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') - uses: actions/setup-python@v1 + uses: actions/setup-python@v2 with: python-version: '3.x' - name: Install dependencies diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 1335112..f8b2891 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -9,7 +9,7 @@ version: 2 python: - version: "3.7" + version: "3.x" install: - requirements: docs/requirements.txt - requirements: requirements.txt From cedef26aaf507075d9af54c936c9697cd416c213 Mon Sep 17 00:00:00 2001 From: dherrada Date: Mon, 24 Jan 2022 16:46:16 -0500 Subject: [PATCH 13/65] Updated docs link, updated python docs link, updated setup.py --- README.rst | 4 ++-- docs/conf.py | 4 ++-- docs/index.rst | 2 +- setup.py | 2 -- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index 82f1151..013c472 100644 --- a/README.rst +++ b/README.rst @@ -2,7 +2,7 @@ Introduction ============ .. image:: https://readthedocs.org/projects/adafruit-circuitpython-bluefruitconnect/badge/?version=latest - :target: https://circuitpython.readthedocs.io/projects/bluefruitconnect/en/latest/ + :target: https://docs.circuitpython.org/projects/bluefruitconnect/en/latest/ :alt: Documentation Status .. image:: https://img.shields.io/discord/327254708534116352.svg @@ -74,7 +74,7 @@ Below is a simple standalone example. Documentation ============= -API documentation for this library can be found on `Read the Docs `_. +API documentation for this library can be found on `Read the Docs `_. Contributing ============ diff --git a/docs/conf.py b/docs/conf.py index 0e1d533..fd8075c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,8 +29,8 @@ intersphinx_mapping = { - "python": ("https://docs.python.org/3.4", None), - "CircuitPython": ("https://circuitpython.readthedocs.io/en/latest/", None), + "python": ("https://docs.python.org/3", None), + "CircuitPython": ("https://docs.circuitpython.org/en/latest/", None), } autoclass_content = "both" diff --git a/docs/index.rst b/docs/index.rst index 442e206..93748cb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,7 +30,7 @@ Table of Contents :caption: Other Links Download - CircuitPython Reference Documentation + CircuitPython Reference Documentation CircuitPython Support Forum Discord Chat Adafruit Learning System diff --git a/setup.py b/setup.py index 75a351e..72df9a1 100644 --- a/setup.py +++ b/setup.py @@ -45,8 +45,6 @@ "Topic :: System :: Hardware", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.4", - "Programming Language :: Python :: 3.5", ], # What does your project relate to? keywords="adafruit ble bluefruit bluetooth micropython circuitpython", From be4c41d4361f661785a6a89dbee709c9264c16ea Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Thu, 10 Feb 2022 09:41:47 -0500 Subject: [PATCH 14/65] Consolidate Documentation sections of README --- README.rst | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 013c472..2869111 100644 --- a/README.rst +++ b/README.rst @@ -76,14 +76,11 @@ Documentation API documentation for this library can be found on `Read the Docs `_. +For information on building library documentation, please check out `this guide `_. + Contributing ============ Contributions are welcome! Please read our `Code of Conduct `_ before contributing to help this project stay welcoming. - -Documentation -============= - -For information on building library documentation, please check out `this guide `_. From ddc6b8ac188125833b49c03dd3db0b48c9210335 Mon Sep 17 00:00:00 2001 From: dherrada Date: Mon, 14 Feb 2022 15:35:02 -0500 Subject: [PATCH 15/65] Fixed readthedocs build Signed-off-by: dherrada --- .readthedocs.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index f8b2891..33c2a61 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -8,8 +8,12 @@ # Required version: 2 +build: + os: ubuntu-20.04 + tools: + python: "3" + python: - version: "3.x" install: - requirements: docs/requirements.txt - requirements: requirements.txt From ccd069d78afdb92eedf76450c62d95e832bb535c Mon Sep 17 00:00:00 2001 From: Kattni Rembor Date: Mon, 28 Mar 2022 15:52:04 -0400 Subject: [PATCH 16/65] Update Black to latest. Signed-off-by: Kattni Rembor --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1b9fadc..7467c1d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: - repo: https://github.com/python/black - rev: 20.8b1 + rev: 22.3.0 hooks: - id: black - repo: https://github.com/fsfe/reuse-tool From 0a84ce16dea2c465ad76f396db8fad9ca1d1cc69 Mon Sep 17 00:00:00 2001 From: Eva Herrada <33632497+evaherrada@users.noreply.github.com> Date: Thu, 21 Apr 2022 18:42:22 -0400 Subject: [PATCH 17/65] Update .gitignore --- .gitignore | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index ced7313..544ec4a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,47 @@ -# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-FileCopyrightText: 2022 Kattni Rembor, written for Adafruit Industries # -# SPDX-License-Identifier: Unlicense +# SPDX-License-Identifier: MIT +# Do not include files and directories created by your personal work environment, such as the IDE +# you use, except for those already listed here. Pull requests including changes to this file will +# not be accepted. + +# This .gitignore file contains rules for files generated by working with CircuitPython libraries, +# including building Sphinx, testing with pip, and creating a virual environment, as well as the +# MacOS and IDE-specific files generated by using MacOS in general, or the PyCharm or VSCode IDEs. + +# If you find that there are files being generated on your machine that should not be included in +# your git commit, you should create a .gitignore_global file on your computer to include the +# files created by your personal setup. To do so, follow the two steps below. + +# First, create a file called .gitignore_global somewhere convenient for you, and add rules for +# the files you want to exclude from git commits. + +# Second, configure Git to use the exclude file for all Git repositories by running the +# following via commandline, replacing "path/to/your/" with the actual path to your newly created +# .gitignore_global file: +# git config --global core.excludesfile path/to/your/.gitignore_global + +# CircuitPython-specific files +*.mpy + +# Python-specific files __pycache__ -_build *.pyc + +# Sphinx build-specific files +_build + +# This file results from running `pip -e install .` in a local repository +*.egg-info + +# Virtual environment-specific files .env -bundles + +# MacOS-specific files +*.DS_Store + +# IDE-specific files +.idea +.vscode +*~ From a9386dfb3730ba7c6d5198095444c391399114d7 Mon Sep 17 00:00:00 2001 From: evaherrada Date: Fri, 22 Apr 2022 15:58:27 -0400 Subject: [PATCH 18/65] Patch: Replaced discord badge image --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 2869111..ebdaef6 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ Introduction :target: https://docs.circuitpython.org/projects/bluefruitconnect/en/latest/ :alt: Documentation Status -.. image:: https://img.shields.io/discord/327254708534116352.svg +.. image:: https://github.com/adafruit/Adafruit_CircuitPython_Bundle/blob/main/badges/adafruit_discord.svg :target: https://adafru.it/discord :alt: Discord From a43172a24c39deb24bede276efa6155ccc2648c3 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Sun, 24 Apr 2022 14:02:33 -0500 Subject: [PATCH 19/65] change discord badge --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index ebdaef6..3e82b42 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ Introduction :target: https://docs.circuitpython.org/projects/bluefruitconnect/en/latest/ :alt: Documentation Status -.. image:: https://github.com/adafruit/Adafruit_CircuitPython_Bundle/blob/main/badges/adafruit_discord.svg +.. image:: https://raw.githubusercontent.com/adafruit/Adafruit_CircuitPython_Bundle/main/badges/adafruit_discord.svg :target: https://adafru.it/discord :alt: Discord From 852998197c005f388c2304da3007ab6c66b7213e Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 15 May 2022 12:48:58 -0400 Subject: [PATCH 20/65] Patch .pre-commit-config.yaml --- .pre-commit-config.yaml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7467c1d..3343606 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,40 +3,40 @@ # SPDX-License-Identifier: Unlicense repos: -- repo: https://github.com/python/black + - repo: https://github.com/python/black rev: 22.3.0 hooks: - - id: black -- repo: https://github.com/fsfe/reuse-tool - rev: v0.12.1 + - id: black + - repo: https://github.com/fsfe/reuse-tool + rev: v0.14.0 hooks: - - id: reuse -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.3.0 + - id: reuse + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.2.0 hooks: - - id: check-yaml - - id: end-of-file-fixer - - id: trailing-whitespace -- repo: https://github.com/pycqa/pylint + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + - repo: https://github.com/pycqa/pylint rev: v2.11.1 hooks: - - id: pylint + - id: pylint name: pylint (library code) types: [python] args: - --disable=consider-using-f-string exclude: "^(docs/|examples/|tests/|setup.py$)" - - id: pylint + - id: pylint name: pylint (example code) description: Run pylint rules on "examples/*.py" files types: [python] files: "^examples/" args: - - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code - - id: pylint + - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code + - id: pylint name: pylint (test code) description: Run pylint rules on "tests/*.py" files types: [python] files: "^tests/" args: - - --disable=missing-docstring,consider-using-f-string,duplicate-code + - --disable=missing-docstring,consider-using-f-string,duplicate-code From 5a60ee43fd1093471b6421840f0bc586a176213a Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 22 May 2022 00:18:55 -0400 Subject: [PATCH 21/65] Increase min lines similarity Signed-off-by: Alec Delaney --- .pylintrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index cfd1c41..f006a4a 100644 --- a/.pylintrc +++ b/.pylintrc @@ -252,7 +252,7 @@ ignore-docstrings=yes ignore-imports=yes # Minimum lines number of a similarity. -min-similarity-lines=4 +min-similarity-lines=12 [BASIC] From ded83e6df1e47f762badf73abe2ab3130cb4d3b5 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 22 May 2022 00:18:23 -0400 Subject: [PATCH 22/65] Switch to inclusive terminology Signed-off-by: Alec Delaney --- .pylintrc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pylintrc b/.pylintrc index f006a4a..f772971 100644 --- a/.pylintrc +++ b/.pylintrc @@ -9,11 +9,11 @@ # run arbitrary code extension-pkg-whitelist= -# Add files or directories to the blacklist. They should be base names, not +# Add files or directories to the ignore-list. They should be base names, not # paths. ignore=CVS -# Add files or directories matching the regex patterns to the blacklist. The +# Add files or directories matching the regex patterns to the ignore-list. The # regex matches against base names, not paths. ignore-patterns= From 24435c221d39bf642e908bf3e5779f7f009ed343 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 30 May 2022 14:25:04 -0400 Subject: [PATCH 23/65] Set language to "en" for documentation Signed-off-by: Alec Delaney --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index fd8075c..1f682cc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -62,7 +62,7 @@ # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = "en" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. From 63389403d69f601e976e80386aded88ed859cd22 Mon Sep 17 00:00:00 2001 From: evaherrada Date: Tue, 7 Jun 2022 15:34:08 -0400 Subject: [PATCH 24/65] Added cp.org link to index.rst --- docs/index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 93748cb..85880ff 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -29,7 +29,8 @@ Table of Contents .. toctree:: :caption: Other Links - Download + Download from GitHub + Download Library Bundle CircuitPython Reference Documentation CircuitPython Support Forum Discord Chat From 4a39bc3f9aff3686400ff72cc4b4bcbe7a2daf77 Mon Sep 17 00:00:00 2001 From: evaherrada Date: Fri, 22 Jul 2022 13:58:35 -0400 Subject: [PATCH 25/65] Changed .env to .venv in README.rst --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 3e82b42..be7507b 100644 --- a/README.rst +++ b/README.rst @@ -46,8 +46,8 @@ To install in a virtual environment in your current project: .. code-block:: shell mkdir project-name && cd project-name - python3 -m venv .env - source .env/bin/activate + python3 -m venv .venv + source .venv/bin/activate pip3 install adafruit-circuitpython-bluefruitconnect Usage Example From 2769074dfaf83a2ecbf564450b983f430b7c3a3c Mon Sep 17 00:00:00 2001 From: evaherrada Date: Tue, 2 Aug 2022 17:00:24 -0400 Subject: [PATCH 26/65] Added Black formatting badge --- README.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.rst b/README.rst index be7507b..2fb107b 100644 --- a/README.rst +++ b/README.rst @@ -13,6 +13,10 @@ Introduction :target: https://github.com/adafruit/Adafruit_CircuitPython_BluefruitConnect/actions/ :alt: Build Status +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/psf/black + :alt: Code Style: Black + This module helps you to communicate with the Adafruit Bluefruit Connect app or use its protocols. Dependencies From 811fd52e00074cbc56ab655882703bd1cb4dcdfc Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 8 Aug 2022 22:05:54 -0400 Subject: [PATCH 27/65] Switched to pyproject.toml --- .github/workflows/build.yml | 18 ++++++------ .github/workflows/release.yml | 17 ++++++----- optional_requirements.txt | 3 ++ pyproject.toml | 44 ++++++++++++++++++++++++++++ requirements.txt | 2 +- setup.py | 54 ----------------------------------- 6 files changed, 68 insertions(+), 70 deletions(-) create mode 100644 optional_requirements.txt create mode 100644 pyproject.toml delete mode 100644 setup.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 474520d..22f6582 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,6 +47,8 @@ jobs: pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit - name: Library version run: git describe --dirty --always --tags + - name: Setup problem matchers + uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1 - name: Pre-commit hooks run: | pre-commit run --all-files @@ -60,16 +62,16 @@ jobs: - name: Build docs working-directory: docs run: sphinx-build -E -W -b html . _build/html - - name: Check For setup.py + - name: Check For pyproject.toml id: need-pypi run: | - echo ::set-output name=setup-py::$( find . -wholename './setup.py' ) + echo ::set-output name=pyproject-toml::$( find . -wholename './pyproject.toml' ) - name: Build Python package - if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') + if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') run: | - pip install --upgrade setuptools wheel twine readme_renderer testresources - python setup.py sdist - python setup.py bdist_wheel --universal + pip install --upgrade build twine + for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do + sed -i -e "s/0.0.0-auto.0/1.2.3/" $file; + done; + python -m build twine check dist/* - - name: Setup problem matchers - uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a65e5de..d1b4f8d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -61,25 +61,28 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - - name: Check For setup.py + - name: Check For pyproject.toml id: need-pypi run: | - echo ::set-output name=setup-py::$( find . -wholename './setup.py' ) + echo ::set-output name=pyproject-toml::$( find . -wholename './pyproject.toml' ) - name: Set up Python - if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') + if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') uses: actions/setup-python@v2 with: python-version: '3.x' - name: Install dependencies - if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') + if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') run: | python -m pip install --upgrade pip - pip install setuptools wheel twine + pip install --upgrade build twine - name: Build and publish - if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') + if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') env: TWINE_USERNAME: ${{ secrets.pypi_username }} TWINE_PASSWORD: ${{ secrets.pypi_password }} run: | - python setup.py sdist + for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do + sed -i -e "s/0.0.0-auto.0/${{github.event.release.tag_name}}/" $file; + done; + python -m build twine upload dist/* diff --git a/optional_requirements.txt b/optional_requirements.txt new file mode 100644 index 0000000..d4e27c4 --- /dev/null +++ b/optional_requirements.txt @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b8b9bb7 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,44 @@ +# SPDX-FileCopyrightText: 2022 Alec Delaney for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +[build-system] +requires = [ + "setuptools", + "wheel", +] + +[project] +name = "adafruit-circuitpython-bluefruitconnect" +description = "CircuitPython library for use with the Adafruit Bluefruit Connect apps." +version = "0.0.0-auto.0" +readme = "README.rst" +authors = [ + {name = "Adafruit Industries", email = "circuitpython@adafruit.com"} +] +urls = {Homepage = "https://github.com/adafruit/Adafruit_CircuitPython_BluefruitConnect"} +keywords = [ + "adafruit", + "ble", + "bluefruit", + "bluetooth", + "micropython", + "circuitpython", +] +license = {text = "MIT"} +classifiers = [ + "Intended Audience :: Developers", + "Topic :: Software Development :: Libraries", + "Topic :: Software Development :: Embedded Systems", + "Topic :: System :: Hardware", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", +] +dynamic = ["dependencies", "optional-dependencies"] + +[tool.setuptools] +packages = ["adafruit_bluefruit_connect"] + +[tool.setuptools.dynamic] +dependencies = {file = ["requirements.txt"]} +optional-dependencies = {optional = {file = ["optional_requirements.txt"]}} diff --git a/requirements.txt b/requirements.txt index 17a850d..7a984a4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries # # SPDX-License-Identifier: Unlicense diff --git a/setup.py b/setup.py deleted file mode 100644 index 72df9a1..0000000 --- a/setup.py +++ /dev/null @@ -1,54 +0,0 @@ -# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries -# -# SPDX-License-Identifier: MIT - -"""A setuptools based setup module. - -See: -https://packaging.python.org/en/latest/distributing.html -https://github.com/pypa/sampleproject -""" - -# Always prefer setuptools over distutils -from setuptools import setup, find_packages - -# To use a consistent encoding -from codecs import open -from os import path - -here = path.abspath(path.dirname(__file__)) - -# Get the long description from the README file -with open(path.join(here, "README.rst"), encoding="utf-8") as f: - long_description = f.read() - -setup( - name="adafruit-circuitpython-bluefruitconnect", - use_scm_version=True, - setup_requires=["setuptools_scm"], - description="CircuitPython library for use with the Adafruit Bluefruit Connect apps.", - long_description=long_description, - long_description_content_type="text/x-rst", - # The project's main homepage. - url="https://github.com/adafruit/Adafruit_CircuitPython_BluefruitConnect", - # Author details - author="Adafruit Industries", - author_email="circuitpython@adafruit.com", - install_requires=["Adafruit-Blinka"], - # Choose your license - license="MIT", - # See https://pypi.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - "Development Status :: 3 - Alpha", - "Intended Audience :: Developers", - "Topic :: Software Development :: Libraries", - "Topic :: System :: Hardware", - "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3", - ], - # What does your project relate to? - keywords="adafruit ble bluefruit bluetooth micropython circuitpython", - # You can just specify the packages manually here if your project is - # simple. Or you can use find_packages(). - packages=["adafruit_bluefruit_connect"], -) From 0750d77a17ee8933b228d8215f64f20bc608aa70 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Tue, 9 Aug 2022 12:03:54 -0400 Subject: [PATCH 28/65] Add setuptools-scm to build system requirements Signed-off-by: Alec Delaney --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index b8b9bb7..b50d63b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,6 +6,7 @@ requires = [ "setuptools", "wheel", + "setuptools-scm", ] [project] From 6ac287b753c42a4249039f65503fcddb739e8445 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Tue, 16 Aug 2022 18:09:15 -0400 Subject: [PATCH 29/65] Update version string --- adafruit_bluefruit_connect/__init__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_bluefruit_connect/__init__.py b/adafruit_bluefruit_connect/__init__.py index 26e614c..c5eba7d 100644 --- a/adafruit_bluefruit_connect/__init__.py +++ b/adafruit_bluefruit_connect/__init__.py @@ -17,5 +17,5 @@ # imports -__version__ = "0.0.0-auto.0" +__version__ = "0.0.0+auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BluefruitConnect.git" diff --git a/pyproject.toml b/pyproject.toml index b50d63b..8684faf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ requires = [ [project] name = "adafruit-circuitpython-bluefruitconnect" description = "CircuitPython library for use with the Adafruit Bluefruit Connect apps." -version = "0.0.0-auto.0" +version = "0.0.0+auto.0" readme = "README.rst" authors = [ {name = "Adafruit Industries", email = "circuitpython@adafruit.com"} From 4e86d35dae6b92e273aecbabc895427756891abc Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Tue, 16 Aug 2022 21:09:15 -0400 Subject: [PATCH 30/65] Fix version strings in workflow files --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 22f6582..cb2f60e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,7 +71,7 @@ jobs: run: | pip install --upgrade build twine for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do - sed -i -e "s/0.0.0-auto.0/1.2.3/" $file; + sed -i -e "s/0.0.0+auto.0/1.2.3/" $file; done; python -m build twine check dist/* diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d1b4f8d..f3a0325 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -82,7 +82,7 @@ jobs: TWINE_PASSWORD: ${{ secrets.pypi_password }} run: | for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do - sed -i -e "s/0.0.0-auto.0/${{github.event.release.tag_name}}/" $file; + sed -i -e "s/0.0.0+auto.0/${{github.event.release.tag_name}}/" $file; done; python -m build twine upload dist/* From e6f2d0c113b0f05d0d58126987395a2d54245e78 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 22 Aug 2022 21:36:32 -0400 Subject: [PATCH 31/65] Keep copyright up to date in documentation --- docs/conf.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 1f682cc..0365f33 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -6,6 +6,7 @@ import os import sys +import datetime sys.path.insert(0, os.path.abspath("..")) @@ -45,7 +46,8 @@ # General information about the project. project = "Adafruit Bluefruit Connect Library" -copyright = "2019 Dan Halbert" +current_year = str(datetime.datetime.now().year) +copyright = current_year + " Dan Halbert" author = "Dan Halbert" # The version info for the project you're documenting, acts as replacement for From 99e6e1f4e1862e23563a908f1e4a38ec83362f91 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Tue, 23 Aug 2022 17:26:22 -0400 Subject: [PATCH 32/65] Use year duration range for copyright attribution --- docs/conf.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 0365f33..4aa5581 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -46,8 +46,14 @@ # General information about the project. project = "Adafruit Bluefruit Connect Library" +creation_year = "2019" current_year = str(datetime.datetime.now().year) -copyright = current_year + " Dan Halbert" +year_duration = ( + current_year + if current_year == creation_year + else creation_year + " - " + current_year +) +copyright = year_duration + " Dan Halbert" author = "Dan Halbert" # The version info for the project you're documenting, acts as replacement for From a1b359a4e8e3aa37625b4f5da65cec53ab009314 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Fri, 4 Nov 2022 00:02:50 -0400 Subject: [PATCH 33/65] Switching to composite actions --- .github/workflows/build.yml | 67 +---------------------- .github/workflows/release.yml | 88 ------------------------------ .github/workflows/release_gh.yml | 14 +++++ .github/workflows/release_pypi.yml | 14 +++++ 4 files changed, 30 insertions(+), 153 deletions(-) delete mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/release_gh.yml create mode 100644 .github/workflows/release_pypi.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cb2f60e..041a337 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,68 +10,5 @@ jobs: test: runs-on: ubuntu-latest steps: - - name: Dump GitHub context - env: - GITHUB_CONTEXT: ${{ toJson(github) }} - run: echo "$GITHUB_CONTEXT" - - name: Translate Repo Name For Build Tools filename_prefix - id: repo-name - run: | - echo ::set-output name=repo-name::$( - echo ${{ github.repository }} | - awk -F '\/' '{ print tolower($2) }' | - tr '_' '-' - ) - - name: Set up Python 3.x - uses: actions/setup-python@v2 - with: - python-version: "3.x" - - name: Versions - run: | - python3 --version - - name: Checkout Current Repo - uses: actions/checkout@v1 - with: - submodules: true - - name: Checkout tools repo - uses: actions/checkout@v2 - with: - repository: adafruit/actions-ci-circuitpython-libs - path: actions-ci - - name: Install dependencies - # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.) - run: | - source actions-ci/install.sh - - name: Pip install Sphinx, pre-commit - run: | - pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit - - name: Library version - run: git describe --dirty --always --tags - - name: Setup problem matchers - uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1 - - name: Pre-commit hooks - run: | - pre-commit run --all-files - - name: Build assets - run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . - - name: Archive bundles - uses: actions/upload-artifact@v2 - with: - name: bundles - path: ${{ github.workspace }}/bundles/ - - name: Build docs - working-directory: docs - run: sphinx-build -E -W -b html . _build/html - - name: Check For pyproject.toml - id: need-pypi - run: | - echo ::set-output name=pyproject-toml::$( find . -wholename './pyproject.toml' ) - - name: Build Python package - if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') - run: | - pip install --upgrade build twine - for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do - sed -i -e "s/0.0.0+auto.0/1.2.3/" $file; - done; - python -m build - twine check dist/* + - name: Run Build CI workflow + uses: adafruit/workflows-circuitpython-libs/build@main diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index f3a0325..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,88 +0,0 @@ -# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries -# -# SPDX-License-Identifier: MIT - -name: Release Actions - -on: - release: - types: [published] - -jobs: - upload-release-assets: - runs-on: ubuntu-latest - steps: - - name: Dump GitHub context - env: - GITHUB_CONTEXT: ${{ toJson(github) }} - run: echo "$GITHUB_CONTEXT" - - name: Translate Repo Name For Build Tools filename_prefix - id: repo-name - run: | - echo ::set-output name=repo-name::$( - echo ${{ github.repository }} | - awk -F '\/' '{ print tolower($2) }' | - tr '_' '-' - ) - - name: Set up Python 3.x - uses: actions/setup-python@v2 - with: - python-version: "3.x" - - name: Versions - run: | - python3 --version - - name: Checkout Current Repo - uses: actions/checkout@v1 - with: - submodules: true - - name: Checkout tools repo - uses: actions/checkout@v2 - with: - repository: adafruit/actions-ci-circuitpython-libs - path: actions-ci - - name: Install deps - run: | - source actions-ci/install.sh - - name: Build assets - run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . - - name: Upload Release Assets - # the 'official' actions version does not yet support dynamically - # supplying asset names to upload. @csexton's version chosen based on - # discussion in the issue below, as its the simplest to implement and - # allows for selecting files with a pattern. - # https://github.com/actions/upload-release-asset/issues/4 - #uses: actions/upload-release-asset@v1.0.1 - uses: csexton/release-asset-action@master - with: - pattern: "bundles/*" - github-token: ${{ secrets.GITHUB_TOKEN }} - - upload-pypi: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - name: Check For pyproject.toml - id: need-pypi - run: | - echo ::set-output name=pyproject-toml::$( find . -wholename './pyproject.toml' ) - - name: Set up Python - if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') - uses: actions/setup-python@v2 - with: - python-version: '3.x' - - name: Install dependencies - if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') - run: | - python -m pip install --upgrade pip - pip install --upgrade build twine - - name: Build and publish - if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') - env: - TWINE_USERNAME: ${{ secrets.pypi_username }} - TWINE_PASSWORD: ${{ secrets.pypi_password }} - run: | - for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do - sed -i -e "s/0.0.0+auto.0/${{github.event.release.tag_name}}/" $file; - done; - python -m build - twine upload dist/* diff --git a/.github/workflows/release_gh.yml b/.github/workflows/release_gh.yml new file mode 100644 index 0000000..041a337 --- /dev/null +++ b/.github/workflows/release_gh.yml @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +name: Build CI + +on: [pull_request, push] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Run Build CI workflow + uses: adafruit/workflows-circuitpython-libs/build@main diff --git a/.github/workflows/release_pypi.yml b/.github/workflows/release_pypi.yml new file mode 100644 index 0000000..041a337 --- /dev/null +++ b/.github/workflows/release_pypi.yml @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +name: Build CI + +on: [pull_request, push] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Run Build CI workflow + uses: adafruit/workflows-circuitpython-libs/build@main From 29e813867b6205e94e95cf6aed60bb8afd631f16 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Fri, 4 Nov 2022 00:47:00 -0400 Subject: [PATCH 34/65] Updated pylint version to 2.13.0 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3343606..4c43710 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/pycqa/pylint - rev: v2.11.1 + rev: v2.13.0 hooks: - id: pylint name: pylint (library code) From d71ca33794988dde3d5651eaf1b638ca555e142d Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Fri, 4 Nov 2022 08:15:20 -0400 Subject: [PATCH 35/65] Update pylint to 2.15.5 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4c43710..0e5fccc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/pycqa/pylint - rev: v2.13.0 + rev: v2.15.5 hooks: - id: pylint name: pylint (library code) From d4a340d8674133922117815e1cc390c67a770875 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Fri, 4 Nov 2022 09:12:45 -0400 Subject: [PATCH 36/65] Fix release CI files --- .github/workflows/release_gh.yml | 14 +++++++++----- .github/workflows/release_pypi.yml | 15 ++++++++++----- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release_gh.yml b/.github/workflows/release_gh.yml index 041a337..b8aa8d6 100644 --- a/.github/workflows/release_gh.yml +++ b/.github/workflows/release_gh.yml @@ -2,13 +2,17 @@ # # SPDX-License-Identifier: MIT -name: Build CI +name: GitHub Release Actions -on: [pull_request, push] +on: + release: + types: [published] jobs: - test: + upload-release-assets: runs-on: ubuntu-latest steps: - - name: Run Build CI workflow - uses: adafruit/workflows-circuitpython-libs/build@main + - name: Run GitHub Release CI workflow + uses: adafruit/workflows-circuitpython-libs/release-gh@main + with: + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release_pypi.yml b/.github/workflows/release_pypi.yml index 041a337..65775b7 100644 --- a/.github/workflows/release_pypi.yml +++ b/.github/workflows/release_pypi.yml @@ -2,13 +2,18 @@ # # SPDX-License-Identifier: MIT -name: Build CI +name: PyPI Release Actions -on: [pull_request, push] +on: + release: + types: [published] jobs: - test: + upload-release-assets: runs-on: ubuntu-latest steps: - - name: Run Build CI workflow - uses: adafruit/workflows-circuitpython-libs/build@main + - name: Run PyPI Release CI workflow + uses: adafruit/workflows-circuitpython-libs/release-pypi@main + with: + pypi-username: ${{ secrets.pypi_username }} + pypi-password: ${{ secrets.pypi_password }} From 724051679be3c2fca9d696d8667db2cb173ea39f Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Fri, 4 Nov 2022 18:34:33 -0400 Subject: [PATCH 37/65] Update .pylintrc for v2.15.5 --- .pylintrc | 45 ++++----------------------------------------- 1 file changed, 4 insertions(+), 41 deletions(-) diff --git a/.pylintrc b/.pylintrc index f772971..40208c3 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries # # SPDX-License-Identifier: Unlicense @@ -26,7 +26,7 @@ jobs=1 # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. -load-plugins= +load-plugins=pylint.extensions.no_self_use # Pickle collected data for later comparisons. persistent=yes @@ -54,8 +54,8 @@ confidence= # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" -# disable=import-error,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call -disable=print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,import-error,bad-continuation,unspecified-encoding +# disable=import-error,raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,deprecated-str-translate-call +disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option @@ -225,12 +225,6 @@ max-line-length=100 # Maximum number of lines in a module max-module-lines=1000 -# List of optional constructs for which whitespace checking is disabled. `dict- -# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. -# `trailing-comma` allows a space between comma and closing bracket: (a, ). -# `empty-line` allows space-only lines. -no-space-check=trailing-comma,dict-separator - # Allow the body of a class to be on the same line as the declaration if body # contains single statement. single-line-class-stmt=no @@ -257,38 +251,22 @@ min-similarity-lines=12 [BASIC] -# Naming hint for argument names -argument-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - # Regular expression matching correct argument names argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ -# Naming hint for attribute names -attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - # Regular expression matching correct attribute names attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata -# Naming hint for class attribute names -class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ - # Regular expression matching correct class attribute names class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ -# Naming hint for class names -# class-name-hint=[A-Z_][a-zA-Z0-9]+$ -class-name-hint=[A-Z_][a-zA-Z0-9_]+$ - # Regular expression matching correct class names # class-rgx=[A-Z_][a-zA-Z0-9]+$ class-rgx=[A-Z_][a-zA-Z0-9_]+$ -# Naming hint for constant names -const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ - # Regular expression matching correct constant names const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ @@ -296,9 +274,6 @@ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # ones are exempt. docstring-min-length=-1 -# Naming hint for function names -function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - # Regular expression matching correct function names function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ @@ -309,21 +284,12 @@ good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_ # Include a hint for the correct naming format with invalid-name include-naming-hint=no -# Naming hint for inline iteration names -inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ - # Regular expression matching correct inline iteration names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ -# Naming hint for method names -method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - # Regular expression matching correct method names method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ -# Naming hint for module names -module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - # Regular expression matching correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ @@ -339,9 +305,6 @@ no-docstring-rgx=^_ # to this list to register other decorators that produce valid properties. property-classes=abc.abstractproperty -# Naming hint for variable names -variable-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - # Regular expression matching correct variable names variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ From 06fd3553be721425ea97bf92956f405d6efb3c00 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Thu, 1 Sep 2022 20:16:31 -0400 Subject: [PATCH 38/65] Add .venv to .gitignore Signed-off-by: Alec Delaney <89490472+tekktrik@users.noreply.github.com> --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 544ec4a..db3d538 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ _build # Virtual environment-specific files .env +.venv # MacOS-specific files *.DS_Store From 92a6ea7e5fe745c52bf72cf0fb48712dfdafe6ae Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Thu, 19 Jan 2023 23:39:55 -0500 Subject: [PATCH 39/65] Add upload url to release action Signed-off-by: Alec Delaney <89490472+tekktrik@users.noreply.github.com> --- .github/workflows/release_gh.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release_gh.yml b/.github/workflows/release_gh.yml index b8aa8d6..9acec60 100644 --- a/.github/workflows/release_gh.yml +++ b/.github/workflows/release_gh.yml @@ -16,3 +16,4 @@ jobs: uses: adafruit/workflows-circuitpython-libs/release-gh@main with: github-token: ${{ secrets.GITHUB_TOKEN }} + upload-url: ${{ github.event.release.upload_url }} From 32ba1265af889be591e1e9c67f1de1572b587957 Mon Sep 17 00:00:00 2001 From: Neradoc Date: Sat, 4 Feb 2023 22:06:11 +0100 Subject: [PATCH 40/65] Add the RawTextPacket class to the documentation, and mention its use in Packet.from_stream() --- adafruit_bluefruit_connect/packet.py | 5 ++++- docs/api.rst | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index b3b8d3c..3808b34 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -81,7 +81,10 @@ def from_stream(cls, stream): set on stream, using its own preset timeout. Return None if there was no input, otherwise return an instance of one of the packet classes registered with ``Packet``. - Raise an Error if the packet was not recognized or was malformed + Raise an Error if the packet was not recognized or was malformed. + + If a packet of type "RT" (like ``RawTextPacket``) is registered, it will be + used to return the raw data line when no packet type was recognized. :param stream stream: an input stream that provides standard stream read operations, such as ``ble.UARTServer`` or ``busio.UART``. diff --git a/docs/api.rst b/docs/api.rst index c32ec68..d1a7bf0 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -30,3 +30,6 @@ .. automodule:: adafruit_bluefruit_connect.quaternion_packet :members: + +.. automodule:: adafruit_bluefruit_connect.raw_text_packet + :members: From 7aa578e2dd167a0bdfb77ba4bb1a82245e792f82 Mon Sep 17 00:00:00 2001 From: Neradoc Date: Wed, 8 Feb 2023 18:02:56 +0100 Subject: [PATCH 41/65] Fix creating a color packet with an int --- adafruit_bluefruit_connect/color_packet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_bluefruit_connect/color_packet.py b/adafruit_bluefruit_connect/color_packet.py index 9056d84..9524813 100644 --- a/adafruit_bluefruit_connect/color_packet.py +++ b/adafruit_bluefruit_connect/color_packet.py @@ -34,7 +34,7 @@ def __init__(self, color): or an int color value ``0xRRGGBB`` """ if isinstance(color, int): - self._color = tuple(color.to_bytes("BBB", "big")) + self._color = tuple(color.to_bytes(3, "big")) elif len(color) == 3 and all(0 <= c <= 255 for c in color): self._color = color else: From fd7294e667e651eeb4fe7578836bcd62adc1c464 Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Tue, 25 Apr 2023 16:32:19 -0700 Subject: [PATCH 42/65] Adding type annotations for packet This is my model for other similar packet issues (especially those with the cls parameter. As per Jeff's recommendations - we are ignoring the mypy warning on the format() method regarding bytes. --- adafruit_bluefruit_connect/packet.py | 29 ++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index 3808b34..ace2b2b 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -12,8 +12,15 @@ """ +from __future__ import annotations + import struct +from io import RawIOBase +try: + from typing import Union, Optional, Any # adjust these as needed +except ImportError: + pass class Packet: """ @@ -31,18 +38,18 @@ class Packet: # All concrete subclasses should define these class attributes. They're listed here # as a reminder and to make pylint happy. # _FMT_PARSE is the whole packet. - _FMT_PARSE = None + _FMT_PARSE: str # In each class, set PACKET_LENGTH = struct.calcsize(_FMT_PARSE). - PACKET_LENGTH = None + PACKET_LENGTH: int # _FMT_CONSTRUCT does not include the trailing byte, which is the checksum. _FMT_CONSTRUCT = None # The first byte of the prefix is always b'!'. The second byte is the type code. _TYPE_HEADER = None - _type_to_class = {} + _type_to_class: dict = {} @classmethod - def register_packet_type(cls): + def register_packet_type(cls: Any) -> None: """Register a new packet type, using this class and its ``cls._TYPE_HEADER``. The ``from_bytes()`` and ``from_stream()`` methods will then be able to recognize this type of packet. @@ -51,7 +58,7 @@ def register_packet_type(cls): Packet._type_to_class[cls._TYPE_HEADER] = cls @classmethod - def from_bytes(cls, packet): + def from_bytes(cls, packet: bytes) -> Packet: """Create an appropriate object of the correct class for the given packet bytes. Validate packet type, length, and checksum. """ @@ -76,7 +83,7 @@ def from_bytes(cls, packet): return packet_class.parse_private(packet) @classmethod - def from_stream(cls, stream): + def from_stream(cls, stream: RawIOBase) -> Optional[Packet]: """Read the next packet from the incoming stream. Wait as long as the timeout set on stream, using its own preset timeout. Return None if there was no input, otherwise return an instance @@ -120,11 +127,13 @@ def from_stream(cls, stream): packet_class = cls._type_to_class.get(header, None) if not packet_class: raise ValueError("Unregistered packet type {}".format(header)) - packet = header + stream.read(packet_class.PACKET_LENGTH - 2) + rest = stream.read(packet_class.PACKET_LENGTH - 2) + assert rest is not None + packet = header + rest return cls.from_bytes(packet) @classmethod - def parse_private(cls, packet): + def parse_private(cls, packet: bytes) -> Packet: """Default implementation for subclasses. Assumes arguments to ``__init__()`` are exactly the values parsed using ``cls._FMT_PARSE``. Subclasses may need to reimplement if that assumption @@ -136,11 +145,11 @@ def parse_private(cls, packet): return cls(*struct.unpack(cls._FMT_PARSE, packet)) @staticmethod - def checksum(partial_packet): + def checksum(partial_packet: bytes) -> int: """Compute checksum for bytes, not including the checksum byte itself.""" return ~sum(partial_packet) & 0xFF - def add_checksum(self, partial_packet): + def add_checksum(self, partial_packet: bytes) -> bytes: """Compute the checksum of partial_packet and return a new bytes with the checksum appended. """ From 08375aacf9780481fe773148196a3fa417abd1d8 Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Wed, 26 Apr 2023 08:23:26 -0700 Subject: [PATCH 43/65] Adding type annotations for _xyz_packet --- adafruit_bluefruit_connect/_xyz_packet.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/adafruit_bluefruit_connect/_xyz_packet.py b/adafruit_bluefruit_connect/_xyz_packet.py index 37cfa58..b5771ab 100644 --- a/adafruit_bluefruit_connect/_xyz_packet.py +++ b/adafruit_bluefruit_connect/_xyz_packet.py @@ -12,28 +12,35 @@ """ +from __future__ import annotations + import struct +try: + from typing import Generator, Union, Dict, Optional, Any # adjust these as needed +except ImportError: + pass + from .packet import Packet class _XYZPacket(Packet): """A packet of x, y, z float values. Used for several different Bluefruit controller packets.""" - _FMT_PARSE = " None: # Construct an _XYZPacket subclass object # from the given x, y, and z float values, and type character. self._x = x self._y = y self._z = z - def to_bytes(self): + def to_bytes(self) -> bytes: """Return the bytes needed to send this packet.""" partial_packet = struct.pack( self._FMT_CONSTRUCT, self._TYPE_HEADER, self._x, self._y, self._z @@ -41,16 +48,16 @@ def to_bytes(self): return self.add_checksum(partial_packet) @property - def x(self): + def x(self) -> float: """The x value.""" return self._x @property - def y(self): + def y(self) -> float: """The y value.""" return self._y @property - def z(self): + def z(self) -> float: """The z value.""" return self._z From cba3b77178339f0f8a76d4a0872da6094a615b79 Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Wed, 26 Apr 2023 08:23:55 -0700 Subject: [PATCH 44/65] Fixing packet.py in light of sub-class implementation --- adafruit_bluefruit_connect/packet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index ace2b2b..9b3efbf 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -42,9 +42,9 @@ class Packet: # In each class, set PACKET_LENGTH = struct.calcsize(_FMT_PARSE). PACKET_LENGTH: int # _FMT_CONSTRUCT does not include the trailing byte, which is the checksum. - _FMT_CONSTRUCT = None + _FMT_CONSTRUCT: Optional[str] = None # The first byte of the prefix is always b'!'. The second byte is the type code. - _TYPE_HEADER = None + _TYPE_HEADER: Optional[bytearray] = None _type_to_class: dict = {} From 934ac9115050197ab4f67c1ff85415341700763d Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Wed, 26 Apr 2023 08:51:33 -0700 Subject: [PATCH 45/65] Adding type annotations to accelerometer_packet and adjusting packet based on new knowledge --- adafruit_bluefruit_connect/accelerometer_packet.py | 8 +++++++- adafruit_bluefruit_connect/packet.py | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/adafruit_bluefruit_connect/accelerometer_packet.py b/adafruit_bluefruit_connect/accelerometer_packet.py index fc64554..74c1a87 100644 --- a/adafruit_bluefruit_connect/accelerometer_packet.py +++ b/adafruit_bluefruit_connect/accelerometer_packet.py @@ -12,14 +12,20 @@ """ +from __future__ import annotations + from ._xyz_packet import _XYZPacket +try: + from typing import Generator, Union, Dict, Optional, Any # adjust these as needed +except ImportError: + pass class AccelerometerPacket(_XYZPacket): """A packet of x, y, z float values from an accelerometer.""" # Everything else is handled by _XYZPacket. - _TYPE_HEADER = b"!A" + _TYPE_HEADER: bytes = b"!A" # Register this class with the superclass. This allows the user to import only what is needed. diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index 9b3efbf..78764f6 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -44,7 +44,7 @@ class Packet: # _FMT_CONSTRUCT does not include the trailing byte, which is the checksum. _FMT_CONSTRUCT: Optional[str] = None # The first byte of the prefix is always b'!'. The second byte is the type code. - _TYPE_HEADER: Optional[bytearray] = None + _TYPE_HEADER: Optional[bytes] = None _type_to_class: dict = {} From 5c7c0ea6e2c8df63144db024c2a4838f708fc028 Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Wed, 26 Apr 2023 10:31:02 -0700 Subject: [PATCH 46/65] Adding type hints to button_packet with a little house cleaning of _xyz_packet --- .../accelerometer_packet.py | 4 -- adafruit_bluefruit_connect/button_packet.py | 46 +++++++++++-------- adafruit_bluefruit_connect/packet.py | 4 +- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/adafruit_bluefruit_connect/accelerometer_packet.py b/adafruit_bluefruit_connect/accelerometer_packet.py index 74c1a87..a8ef855 100644 --- a/adafruit_bluefruit_connect/accelerometer_packet.py +++ b/adafruit_bluefruit_connect/accelerometer_packet.py @@ -16,10 +16,6 @@ from ._xyz_packet import _XYZPacket -try: - from typing import Generator, Union, Dict, Optional, Any # adjust these as needed -except ImportError: - pass class AccelerometerPacket(_XYZPacket): """A packet of x, y, z float values from an accelerometer.""" diff --git a/adafruit_bluefruit_connect/button_packet.py b/adafruit_bluefruit_connect/button_packet.py index 36542a0..d2e508b 100644 --- a/adafruit_bluefruit_connect/button_packet.py +++ b/adafruit_bluefruit_connect/button_packet.py @@ -13,39 +13,45 @@ """ +from __future__ import annotations + import struct from .packet import Packet +try: + from typing import Optional # adjust these as needed +except ImportError: + pass class ButtonPacket(Packet): """A packet containing a button name and its state.""" - BUTTON_1 = "1" + BUTTON_1: str = "1" """Code for Button 1 on the Bluefruit LE Connect app Control Pad screen.""" - BUTTON_2 = "2" + BUTTON_2: str = "2" """Button 2.""" - BUTTON_3 = "3" + BUTTON_3: str = "3" """Button 3.""" - BUTTON_4 = "4" + BUTTON_4: str = "4" """Button 4.""" # pylint: disable= invalid-name - UP = "5" + UP: str = "5" """Up Button.""" - DOWN = "6" + DOWN: str = "6" """Down Button.""" - LEFT = "7" + LEFT: str = "7" """Left Button.""" - RIGHT = "8" + RIGHT: str = "8" """Right Button.""" - _FMT_PARSE = " None: """Construct a ButtonPacket from a button name and the button's state. :param str button: a single character denoting the button @@ -59,11 +65,11 @@ def __init__(self, button, pressed): except Exception as err: raise ValueError("Button must be a single char.") from err - self._button = button - self._pressed = pressed + self._button: str = button + self._pressed: bool = pressed @classmethod - def parse_private(cls, packet): + def parse_private(cls, packet: bytes) -> Optional[Packet]: """Construct a ButtonPacket from an incoming packet. Do not call this directly; call Packet.from_bytes() instead. pylint makes it difficult to call this method _parse(), hence the name. @@ -73,9 +79,9 @@ def parse_private(cls, packet): raise ValueError("Bad button press/release value") return cls(chr(button[0]), pressed == b"1") - def to_bytes(self): + def to_bytes(self) -> bytes: """Return the bytes needed to send this packet.""" - partial_packet = struct.pack( + partial_packet: bytes = struct.pack( self._FMT_CONSTRUCT, self._TYPE_HEADER, bytes(self._button, "utf-8"), @@ -84,13 +90,13 @@ def to_bytes(self): return self.add_checksum(partial_packet) @property - def button(self): + def button(self) -> str: """A single character string (not bytes) specifying the button that the user pressed or released.""" return self._button @property - def pressed(self): + def pressed(self) -> bool: """``True`` if button is pressed, or ``False`` if it is released.""" return self._pressed diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index 78764f6..77544a7 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -18,7 +18,7 @@ from io import RawIOBase try: - from typing import Union, Optional, Any # adjust these as needed + from typing import Optional, Any # adjust these as needed except ImportError: pass @@ -133,7 +133,7 @@ def from_stream(cls, stream: RawIOBase) -> Optional[Packet]: return cls.from_bytes(packet) @classmethod - def parse_private(cls, packet: bytes) -> Packet: + def parse_private(cls, packet: bytes) -> Optional[Packet]: """Default implementation for subclasses. Assumes arguments to ``__init__()`` are exactly the values parsed using ``cls._FMT_PARSE``. Subclasses may need to reimplement if that assumption From 24695d31534f381f278075d13c6704f55123180d Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Wed, 26 Apr 2023 10:39:44 -0700 Subject: [PATCH 47/65] Adding type hints to color_packet --- adafruit_bluefruit_connect/color_packet.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/adafruit_bluefruit_connect/color_packet.py b/adafruit_bluefruit_connect/color_packet.py index 9524813..46b559d 100644 --- a/adafruit_bluefruit_connect/color_packet.py +++ b/adafruit_bluefruit_connect/color_packet.py @@ -12,21 +12,27 @@ """ +from __future__ import annotations + import struct from .packet import Packet +try: + from typing import Optional # adjust these as needed +except ImportError: + pass class ColorPacket(Packet): """A packet containing an RGB color value.""" - _FMT_PARSE = " None: """Construct a ColorPacket from a 3-element :class:`tuple` of RGB values, or from an int color value 0xRRGGBB. @@ -41,14 +47,14 @@ def __init__(self, color): raise ValueError("Color must be an integer 0xRRGGBB or a tuple(r,g,b)") @classmethod - def parse_private(cls, packet): + def parse_private(cls, packet: Optional[Packet]) -> Optional[Packet]: """Construct a ColorPacket from an incoming packet. Do not call this directly; call Packet.from_bytes() instead. pylint makes it difficult to call this method _parse(), hence the name. """ return cls(struct.unpack(cls._FMT_PARSE, packet)) - def to_bytes(self): + def to_bytes(self) -> bytes: """Return the bytes needed to send this packet.""" partial_packet = struct.pack( self._FMT_CONSTRUCT, self._TYPE_HEADER, *self._color @@ -56,7 +62,7 @@ def to_bytes(self): return self.add_checksum(partial_packet) @property - def color(self): + def color(self) -> tuple: """A :class:`tuple` ``(red, green blue)`` representing the color the user chose in the BlueFruit Connect app.""" return self._color From 3171d37007b6789a48b1563d64af21e9ab3b48a5 Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Wed, 26 Apr 2023 10:54:38 -0700 Subject: [PATCH 48/65] Adding type annotations to gyro and location packet --- adafruit_bluefruit_connect/gyro_packet.py | 4 +++- adafruit_bluefruit_connect/location_packet.py | 20 ++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/adafruit_bluefruit_connect/gyro_packet.py b/adafruit_bluefruit_connect/gyro_packet.py index 7362119..0f17fa3 100644 --- a/adafruit_bluefruit_connect/gyro_packet.py +++ b/adafruit_bluefruit_connect/gyro_packet.py @@ -12,6 +12,8 @@ """ +from __future__ import annotations + from ._xyz_packet import _XYZPacket @@ -19,7 +21,7 @@ class GyroPacket(_XYZPacket): """A packet of x, y, z float values from a gyroscope.""" # Everything else is handled by _XYZPacket. - _TYPE_HEADER = b"!G" + _TYPE_HEADER: bytes = b"!G" # Register this class with the superclass. This allows the user to import only what is needed. diff --git a/adafruit_bluefruit_connect/location_packet.py b/adafruit_bluefruit_connect/location_packet.py index c7bae5d..e27dbc6 100644 --- a/adafruit_bluefruit_connect/location_packet.py +++ b/adafruit_bluefruit_connect/location_packet.py @@ -12,6 +12,8 @@ """ +from __future__ import annotations + import struct from .packet import Packet @@ -20,19 +22,19 @@ class LocationPacket(Packet): """A packet of latitude, longitude, and altitude values.""" - _FMT_PARSE = " None: """Construct a LocationPacket from the given values.""" self._latitude = latitude self._longitude = longitude self._altitude = altitude - def to_bytes(self): + def to_bytes(self) -> bytes: """Return the bytes needed to send this packet.""" partial_packet = struct.pack( self._FMT_CONSTRUCT, @@ -44,17 +46,17 @@ def to_bytes(self): return self.add_checksum(partial_packet) @property - def latitude(self): + def latitude(self) -> float: """The latitude value.""" return self._latitude @property - def longitude(self): + def longitude(self) -> float: """The longitude value.""" return self._longitude @property - def altitude(self): + def altitude(self) -> float: """The altitude value.""" return self._altitude From e093ababdbf8e7e91a1efe98eab37543e2669f01 Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Wed, 26 Apr 2023 11:22:04 -0700 Subject: [PATCH 49/65] Adding type annotations to several packets We are still getting mypy complaints about the Liskov Principle, and quarternion due to trying to return the sum of a bytes and an int. Need to flag this as an issue. --- .../magnetometer_packet.py | 4 +++- adafruit_bluefruit_connect/quaternion_packet.py | 16 +++++++++------- adafruit_bluefruit_connect/raw_text_packet.py | 10 ++++++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/adafruit_bluefruit_connect/magnetometer_packet.py b/adafruit_bluefruit_connect/magnetometer_packet.py index ef4cff3..5dbaa31 100644 --- a/adafruit_bluefruit_connect/magnetometer_packet.py +++ b/adafruit_bluefruit_connect/magnetometer_packet.py @@ -12,6 +12,8 @@ """ +from __future__ import annotations + from ._xyz_packet import _XYZPacket @@ -19,7 +21,7 @@ class MagnetometerPacket(_XYZPacket): """A packet of x, y, z float values from a magnetometer.""" # Everything else is handled by _XYZPacket. - _TYPE_HEADER = b"!M" + _TYPE_HEADER: bytes = b"!M" # Register this class with the superclass. This allows the user to import only what is needed. diff --git a/adafruit_bluefruit_connect/quaternion_packet.py b/adafruit_bluefruit_connect/quaternion_packet.py index 359b1bf..52c4cf1 100644 --- a/adafruit_bluefruit_connect/quaternion_packet.py +++ b/adafruit_bluefruit_connect/quaternion_packet.py @@ -12,6 +12,8 @@ """ +from __future__ import annotations + import struct from ._xyz_packet import _XYZPacket @@ -23,18 +25,18 @@ class QuaternionPacket(_XYZPacket): # Use _XYZPacket to handle x, y, z, and add w. - _FMT_PARSE = " None: """Construct a QuaternionPacket from the given x, y, z, and w float values.""" super().__init__(x, y, z) self._w = w - def to_bytes(self): + def to_bytes(self) -> bytes: """Return the bytes needed to send this packet.""" partial_packet = struct.pack( self._FMT_CONSTRUCT, self._TYPE_HEADER, self._x, self._y, self._z, self._w @@ -42,7 +44,7 @@ def to_bytes(self): return partial_packet + self.checksum(partial_packet) @property - def w(self): + def w(self) -> float: """The w value.""" return self._w diff --git a/adafruit_bluefruit_connect/raw_text_packet.py b/adafruit_bluefruit_connect/raw_text_packet.py index 729eea0..0c82b16 100644 --- a/adafruit_bluefruit_connect/raw_text_packet.py +++ b/adafruit_bluefruit_connect/raw_text_packet.py @@ -22,23 +22,25 @@ """ +from __future__ import annotations + from .packet import Packet class RawTextPacket(Packet): """A packet containing a text string.""" - _TYPE_HEADER = b"RT" + _TYPE_HEADER: bytes = b"RT" - def __init__(self, text): + def __init__(self, text: str) -> None: """Construct a RawTextPacket from a binary string.""" if isinstance(text, bytes): - self._text = text.strip() + self._text: str = text.strip() else: raise ValueError("Text must be a bytes string") @property - def text(self): + def text(self) -> str: """Return the text associated with the object.""" return self._text From d5ee52882a6e0b93715b8c83a26988268ba5fc50 Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Wed, 26 Apr 2023 11:22:04 -0700 Subject: [PATCH 50/65] Adding type annotations to several packets We are still getting mypy complaints about the Liskov Principle, and quarternion due to trying to return the sum of a bytes and an int. Need to flag this as an issue. --- adafruit_bluefruit_connect/_xyz_packet.py | 2 +- adafruit_bluefruit_connect/button_packet.py | 3 ++- adafruit_bluefruit_connect/color_packet.py | 3 ++- .../magnetometer_packet.py | 4 +++- adafruit_bluefruit_connect/packet.py | 3 ++- adafruit_bluefruit_connect/quaternion_packet.py | 16 +++++++++------- adafruit_bluefruit_connect/raw_text_packet.py | 10 ++++++---- 7 files changed, 25 insertions(+), 16 deletions(-) diff --git a/adafruit_bluefruit_connect/_xyz_packet.py b/adafruit_bluefruit_connect/_xyz_packet.py index b5771ab..ada2c29 100644 --- a/adafruit_bluefruit_connect/_xyz_packet.py +++ b/adafruit_bluefruit_connect/_xyz_packet.py @@ -17,7 +17,7 @@ import struct try: - from typing import Generator, Union, Dict, Optional, Any # adjust these as needed + from typing import Generator, Union, Dict, Optional, Any # adjust these as needed except ImportError: pass diff --git a/adafruit_bluefruit_connect/button_packet.py b/adafruit_bluefruit_connect/button_packet.py index d2e508b..5f5391d 100644 --- a/adafruit_bluefruit_connect/button_packet.py +++ b/adafruit_bluefruit_connect/button_packet.py @@ -20,10 +20,11 @@ from .packet import Packet try: - from typing import Optional # adjust these as needed + from typing import Optional # adjust these as needed except ImportError: pass + class ButtonPacket(Packet): """A packet containing a button name and its state.""" diff --git a/adafruit_bluefruit_connect/color_packet.py b/adafruit_bluefruit_connect/color_packet.py index 46b559d..44595ba 100644 --- a/adafruit_bluefruit_connect/color_packet.py +++ b/adafruit_bluefruit_connect/color_packet.py @@ -19,10 +19,11 @@ from .packet import Packet try: - from typing import Optional # adjust these as needed + from typing import Optional # adjust these as needed except ImportError: pass + class ColorPacket(Packet): """A packet containing an RGB color value.""" diff --git a/adafruit_bluefruit_connect/magnetometer_packet.py b/adafruit_bluefruit_connect/magnetometer_packet.py index ef4cff3..5dbaa31 100644 --- a/adafruit_bluefruit_connect/magnetometer_packet.py +++ b/adafruit_bluefruit_connect/magnetometer_packet.py @@ -12,6 +12,8 @@ """ +from __future__ import annotations + from ._xyz_packet import _XYZPacket @@ -19,7 +21,7 @@ class MagnetometerPacket(_XYZPacket): """A packet of x, y, z float values from a magnetometer.""" # Everything else is handled by _XYZPacket. - _TYPE_HEADER = b"!M" + _TYPE_HEADER: bytes = b"!M" # Register this class with the superclass. This allows the user to import only what is needed. diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index 77544a7..c042ccd 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -18,10 +18,11 @@ from io import RawIOBase try: - from typing import Optional, Any # adjust these as needed + from typing import Optional, Any # adjust these as needed except ImportError: pass + class Packet: """ A Bluefruit app controller packet. A packet consists of these bytes, in order: diff --git a/adafruit_bluefruit_connect/quaternion_packet.py b/adafruit_bluefruit_connect/quaternion_packet.py index 359b1bf..52c4cf1 100644 --- a/adafruit_bluefruit_connect/quaternion_packet.py +++ b/adafruit_bluefruit_connect/quaternion_packet.py @@ -12,6 +12,8 @@ """ +from __future__ import annotations + import struct from ._xyz_packet import _XYZPacket @@ -23,18 +25,18 @@ class QuaternionPacket(_XYZPacket): # Use _XYZPacket to handle x, y, z, and add w. - _FMT_PARSE = " None: """Construct a QuaternionPacket from the given x, y, z, and w float values.""" super().__init__(x, y, z) self._w = w - def to_bytes(self): + def to_bytes(self) -> bytes: """Return the bytes needed to send this packet.""" partial_packet = struct.pack( self._FMT_CONSTRUCT, self._TYPE_HEADER, self._x, self._y, self._z, self._w @@ -42,7 +44,7 @@ def to_bytes(self): return partial_packet + self.checksum(partial_packet) @property - def w(self): + def w(self) -> float: """The w value.""" return self._w diff --git a/adafruit_bluefruit_connect/raw_text_packet.py b/adafruit_bluefruit_connect/raw_text_packet.py index 729eea0..0c82b16 100644 --- a/adafruit_bluefruit_connect/raw_text_packet.py +++ b/adafruit_bluefruit_connect/raw_text_packet.py @@ -22,23 +22,25 @@ """ +from __future__ import annotations + from .packet import Packet class RawTextPacket(Packet): """A packet containing a text string.""" - _TYPE_HEADER = b"RT" + _TYPE_HEADER: bytes = b"RT" - def __init__(self, text): + def __init__(self, text: str) -> None: """Construct a RawTextPacket from a binary string.""" if isinstance(text, bytes): - self._text = text.strip() + self._text: str = text.strip() else: raise ValueError("Text must be a bytes string") @property - def text(self): + def text(self) -> str: """Return the text associated with the object.""" return self._text From f9f5ffe01d3576ee24e07ed9d540d68164ce303b Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Wed, 26 Apr 2023 13:43:47 -0700 Subject: [PATCH 51/65] Fixing color_packet.py To avoid the dreaded Liskov Substitution Principle (thanks to mypy's fastidiousness).. --- adafruit_bluefruit_connect/color_packet.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/adafruit_bluefruit_connect/color_packet.py b/adafruit_bluefruit_connect/color_packet.py index 44595ba..717de71 100644 --- a/adafruit_bluefruit_connect/color_packet.py +++ b/adafruit_bluefruit_connect/color_packet.py @@ -19,7 +19,7 @@ from .packet import Packet try: - from typing import Optional # adjust these as needed + from typing import Optional, Tuple # adjust these as needed except ImportError: pass @@ -33,7 +33,7 @@ class ColorPacket(Packet): _FMT_CONSTRUCT: str = "<2s3B" _TYPE_HEADER: bytes = b"!C" - def __init__(self, color: Optional[Packet]) -> None: + def __init__(self, color: Tuple) -> None: """Construct a ColorPacket from a 3-element :class:`tuple` of RGB values, or from an int color value 0xRRGGBB. @@ -41,14 +41,14 @@ def __init__(self, color: Optional[Packet]) -> None: or an int color value ``0xRRGGBB`` """ if isinstance(color, int): - self._color = tuple(color.to_bytes(3, "big")) + self._color: Tuple = tuple(color.to_bytes(3, "big")) elif len(color) == 3 and all(0 <= c <= 255 for c in color): self._color = color else: raise ValueError("Color must be an integer 0xRRGGBB or a tuple(r,g,b)") @classmethod - def parse_private(cls, packet: Optional[Packet]) -> Optional[Packet]: + def parse_private(cls, packet: bytes) -> Optional[Packet]: """Construct a ColorPacket from an incoming packet. Do not call this directly; call Packet.from_bytes() instead. pylint makes it difficult to call this method _parse(), hence the name. From aa8c809f03841318633f7c47d15411ecb3a6a327 Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Fri, 28 Apr 2023 16:01:25 -0700 Subject: [PATCH 52/65] Converting checksum() results from int to bytes as per packet base class --- adafruit_bluefruit_connect/quaternion_packet.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/adafruit_bluefruit_connect/quaternion_packet.py b/adafruit_bluefruit_connect/quaternion_packet.py index 52c4cf1..5f7a1b5 100644 --- a/adafruit_bluefruit_connect/quaternion_packet.py +++ b/adafruit_bluefruit_connect/quaternion_packet.py @@ -41,7 +41,8 @@ def to_bytes(self) -> bytes: partial_packet = struct.pack( self._FMT_CONSTRUCT, self._TYPE_HEADER, self._x, self._y, self._z, self._w ) - return partial_packet + self.checksum(partial_packet) + return partial_packet + bytes((self.checksum(partial_packet),)) + @property def w(self) -> float: From b75d623ddc09e95e5a7b66e5e11805833dfca47b Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Fri, 28 Apr 2023 16:12:00 -0700 Subject: [PATCH 53/65] removing unnecessary typing import from _xyz_packet.py --- adafruit_bluefruit_connect/_xyz_packet.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/adafruit_bluefruit_connect/_xyz_packet.py b/adafruit_bluefruit_connect/_xyz_packet.py index ada2c29..5b3267b 100644 --- a/adafruit_bluefruit_connect/_xyz_packet.py +++ b/adafruit_bluefruit_connect/_xyz_packet.py @@ -16,11 +16,6 @@ import struct -try: - from typing import Generator, Union, Dict, Optional, Any # adjust these as needed -except ImportError: - pass - from .packet import Packet From 19120bc386b535d36219217d108b35238778a584 Mon Sep 17 00:00:00 2001 From: hundredvisionsguy Date: Fri, 28 Apr 2023 16:22:17 -0700 Subject: [PATCH 54/65] fixing black issues --- adafruit_bluefruit_connect/quaternion_packet.py | 1 - 1 file changed, 1 deletion(-) diff --git a/adafruit_bluefruit_connect/quaternion_packet.py b/adafruit_bluefruit_connect/quaternion_packet.py index 5f7a1b5..f1b912e 100644 --- a/adafruit_bluefruit_connect/quaternion_packet.py +++ b/adafruit_bluefruit_connect/quaternion_packet.py @@ -42,7 +42,6 @@ def to_bytes(self) -> bytes: self._FMT_CONSTRUCT, self._TYPE_HEADER, self._x, self._y, self._z, self._w ) return partial_packet + bytes((self.checksum(partial_packet),)) - @property def w(self) -> float: From 5d95d679ca9727741723c7460fc514203d9ad147 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 8 May 2023 11:12:37 -0500 Subject: [PATCH 55/65] move typing import into try block --- adafruit_bluefruit_connect/packet.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index c042ccd..40c2b8e 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -15,10 +15,11 @@ from __future__ import annotations import struct -from io import RawIOBase + try: from typing import Optional, Any # adjust these as needed + from io import RawIOBase except ImportError: pass From a05cd6e13990ee075372ce241391e407ba55354b Mon Sep 17 00:00:00 2001 From: Tekktrik Date: Tue, 9 May 2023 20:26:25 -0400 Subject: [PATCH 56/65] Update pre-commit hooks Signed-off-by: Tekktrik --- .pre-commit-config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0e5fccc..70ade69 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,21 +4,21 @@ repos: - repo: https://github.com/python/black - rev: 22.3.0 + rev: 23.3.0 hooks: - id: black - repo: https://github.com/fsfe/reuse-tool - rev: v0.14.0 + rev: v1.1.2 hooks: - id: reuse - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.2.0 + rev: v4.4.0 hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/pycqa/pylint - rev: v2.15.5 + rev: v2.17.4 hooks: - id: pylint name: pylint (library code) From 6157c587df52d00bb07152578bab6dfe9bff7425 Mon Sep 17 00:00:00 2001 From: Tekktrik Date: Wed, 10 May 2023 22:28:30 -0400 Subject: [PATCH 57/65] Run pre-commit --- examples/bluefruitconnect_controlpad.py | 1 - examples/bluefruitconnect_sensors.py | 1 - 2 files changed, 2 deletions(-) diff --git a/examples/bluefruitconnect_controlpad.py b/examples/bluefruitconnect_controlpad.py index e59f6e4..949f65b 100644 --- a/examples/bluefruitconnect_controlpad.py +++ b/examples/bluefruitconnect_controlpad.py @@ -30,7 +30,6 @@ # Loop and read packets while ble.connected: - # Keeping trying until a good packet is received try: packet = Packet.from_stream(uart_server) diff --git a/examples/bluefruitconnect_sensors.py b/examples/bluefruitconnect_sensors.py index 30175c2..47577aa 100644 --- a/examples/bluefruitconnect_sensors.py +++ b/examples/bluefruitconnect_sensors.py @@ -34,7 +34,6 @@ # Loop and read packets while ble.connected: - # Keeping trying until a good packet is received try: packet = Packet.from_stream(uart_server) From 48789e65b41fa1a4ab9ae909c47ab8c2307bc66d Mon Sep 17 00:00:00 2001 From: Tekktrik Date: Sun, 14 May 2023 13:00:32 -0400 Subject: [PATCH 58/65] Update .pylintrc, fix jQuery for docs Signed-off-by: Tekktrik --- .pylintrc | 2 +- docs/conf.py | 1 + docs/requirements.txt | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index 40208c3..f945e92 100644 --- a/.pylintrc +++ b/.pylintrc @@ -396,4 +396,4 @@ min-public-methods=1 # Exceptions that will emit a warning when being caught. Defaults to # "Exception" -overgeneral-exceptions=Exception +overgeneral-exceptions=builtins.Exception diff --git a/docs/conf.py b/docs/conf.py index 4aa5581..924164e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -17,6 +17,7 @@ # ones. extensions = [ "sphinx.ext.autodoc", + "sphinxcontrib.jquery", "sphinx.ext.intersphinx", "sphinx.ext.napoleon", "sphinx.ext.todo", diff --git a/docs/requirements.txt b/docs/requirements.txt index 88e6733..797aa04 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -3,3 +3,4 @@ # SPDX-License-Identifier: Unlicense sphinx>=4.0.0 +sphinxcontrib-jquery From 4c0cee3d11e32e46fb68ca838a8f3a7cbd7d1f82 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 18 Sep 2023 16:21:11 -0500 Subject: [PATCH 59/65] "fix rtd theme " --- docs/conf.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 924164e..038f0c5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -103,19 +103,10 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -on_rtd = os.environ.get("READTHEDOCS", None) == "True" - -if not on_rtd: # only import and set the theme if we're building docs locally - try: - import sphinx_rtd_theme - - html_theme = "sphinx_rtd_theme" - html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] - except: - html_theme = "default" - html_theme_path = ["."] -else: - html_theme_path = ["."] +import sphinx_rtd_theme + +html_theme = "sphinx_rtd_theme" +html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, From 3ff8860fb615cf719848dce4cb7a61f698d9b106 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 16 Oct 2023 14:30:31 -0500 Subject: [PATCH 60/65] unpin sphinx and add sphinx-rtd-theme to docs reqs Signed-off-by: foamyguy --- docs/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 797aa04..979f568 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,5 +2,6 @@ # # SPDX-License-Identifier: Unlicense -sphinx>=4.0.0 +sphinx sphinxcontrib-jquery +sphinx-rtd-theme From cf764dbad50d03361901d84662a4bc9f969e4573 Mon Sep 17 00:00:00 2001 From: vin1953 Date: Tue, 26 Mar 2024 14:06:59 -0400 Subject: [PATCH 61/65] Corrected file name in examples.rst to reflect bluefruitconnect_simpletest2.py --- docs/examples.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples.rst b/docs/examples.rst index 2e58955..17844cd 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -28,6 +28,6 @@ This example demonstrates receiving text from the UART interface. This example demonstrates receiving both a color (as in simpletest above) and raw text (using RawTextPacket). -.. literalinclude:: ../examples/bluefruitconnect_simpletest.py - :caption: examples/bluefruitconnect_simpletest.py +.. literalinclude:: ../examples/bluefruitconnect_simpletest2.py + :caption: examples/bluefruitconnect_simpletest2.py :linenos: From b58fa53037336ed359164690ba66f8bd03591812 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 7 Oct 2024 09:24:05 -0500 Subject: [PATCH 62/65] remove deprecated get_html_theme_path() call Signed-off-by: foamyguy --- docs/conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 038f0c5..7aefa98 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -106,7 +106,6 @@ import sphinx_rtd_theme html_theme = "sphinx_rtd_theme" -html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, From 2fa760e30a44755c979f3d8230341867fd56f24b Mon Sep 17 00:00:00 2001 From: foamyguy Date: Tue, 14 Jan 2025 11:32:34 -0600 Subject: [PATCH 63/65] add sphinx configuration to rtd.yaml Signed-off-by: foamyguy --- .readthedocs.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 33c2a61..88bca9f 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -8,6 +8,9 @@ # Required version: 2 +sphinx: + configuration: docs/conf.py + build: os: ubuntu-20.04 tools: From ce409e38750f5a08c1451847db3c8434bbdbe85a Mon Sep 17 00:00:00 2001 From: foamyguy Date: Fri, 16 May 2025 13:32:54 +0000 Subject: [PATCH 64/65] change to ruff --- .gitattributes | 11 + .pre-commit-config.yaml | 43 +-- .pylintrc | 399 -------------------- README.rst | 6 +- adafruit_bluefruit_connect/button_packet.py | 1 - adafruit_bluefruit_connect/color_packet.py | 4 +- adafruit_bluefruit_connect/packet.py | 9 +- docs/api.rst | 3 + docs/conf.py | 8 +- examples/bluefruitconnect_controlpad.py | 2 +- examples/bluefruitconnect_sensors.py | 2 +- examples/bluefruitconnect_simpletest.py | 2 +- examples/bluefruitconnect_simpletest2.py | 2 +- examples/bluefruitconnect_uart.py | 3 +- ruff.toml | 110 ++++++ 15 files changed, 151 insertions(+), 454 deletions(-) create mode 100644 .gitattributes delete mode 100644 .pylintrc create mode 100644 ruff.toml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..21c125c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2024 Justin Myers for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + +.py text eol=lf +.rst text eol=lf +.txt text eol=lf +.yaml text eol=lf +.toml text eol=lf +.license text eol=lf +.md text eol=lf diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 70ade69..ff19dde 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,42 +1,21 @@ -# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò +# SPDX-FileCopyrightText: 2024 Justin Myers for Adafruit Industries # # SPDX-License-Identifier: Unlicense repos: - - repo: https://github.com/python/black - rev: 23.3.0 - hooks: - - id: black - - repo: https://github.com/fsfe/reuse-tool - rev: v1.1.2 - hooks: - - id: reuse - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - - repo: https://github.com/pycqa/pylint - rev: v2.17.4 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.3.4 hooks: - - id: pylint - name: pylint (library code) - types: [python] - args: - - --disable=consider-using-f-string - exclude: "^(docs/|examples/|tests/|setup.py$)" - - id: pylint - name: pylint (example code) - description: Run pylint rules on "examples/*.py" files - types: [python] - files: "^examples/" - args: - - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code - - id: pylint - name: pylint (test code) - description: Run pylint rules on "tests/*.py" files - types: [python] - files: "^tests/" - args: - - --disable=missing-docstring,consider-using-f-string,duplicate-code + - id: ruff-format + - id: ruff + args: ["--fix"] + - repo: https://github.com/fsfe/reuse-tool + rev: v3.0.1 + hooks: + - id: reuse diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index f945e92..0000000 --- a/.pylintrc +++ /dev/null @@ -1,399 +0,0 @@ -# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries -# -# SPDX-License-Identifier: Unlicense - -[MASTER] - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code -extension-pkg-whitelist= - -# Add files or directories to the ignore-list. They should be base names, not -# paths. -ignore=CVS - -# Add files or directories matching the regex patterns to the ignore-list. The -# regex matches against base names, not paths. -ignore-patterns= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -#init-hook= - -# Use multiple processes to speed up Pylint. -jobs=1 - -# List of plugins (as comma separated values of python modules names) to load, -# usually to register additional checkers. -load-plugins=pylint.extensions.no_self_use - -# Pickle collected data for later comparisons. -persistent=yes - -# Specify a configuration file. -#rcfile= - -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. -unsafe-load-any-extension=no - - -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED -confidence= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once).You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use"--disable=all --enable=classes -# --disable=W" -# disable=import-error,raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,deprecated-str-translate-call -disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -enable= - - -[REPORTS] - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio).You can also give a reporter class, eg -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - - -[LOGGING] - -# Logging modules to check that the string format arguments are in logging -# function parameter format -logging-modules=logging - - -[SPELLING] - -# Spelling dictionary name. Available dictionaries: none. To make it working -# install python-enchant package. -spelling-dict= - -# List of comma separated words that should not be checked. -spelling-ignore-words= - -# A path to a file that contains private dictionary; one word per line. -spelling-private-dict-file= - -# Tells whether to store unknown words to indicated private dictionary in -# --spelling-private-dict-file option instead of raising a message. -spelling-store-unknown-words=no - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -# notes=FIXME,XXX,TODO -notes=FIXME,XXX - - -[TYPECHECK] - -# List of decorators that produce context managers, such as -# contextlib.contextmanager. Add to this list to register other decorators that -# produce valid context managers. -contextmanager-decorators=contextlib.contextmanager - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members= - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# This flag controls whether pylint should warn about no-member and similar -# checks whenever an opaque object is returned when inferring. The inference -# can return multiple potential results while evaluating a Python object, but -# some branches might not be evaluated, which results in partial inference. In -# that case, it might be useful to still emit no-member and other checks for -# the rest of the inferred objects. -ignore-on-opaque-inference=yes - -# List of class names for which member attributes should not be checked (useful -# for classes with dynamically set attributes). This supports the use of -# qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis. It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules=board - -# Show a hint with possible names when a member name was not found. The aspect -# of finding the hint is based on edit distance. -missing-member-hint=yes - -# The minimum edit distance a name should have in order to be considered a -# similar match for a missing member name. -missing-member-hint-distance=1 - -# The total number of similar names that should be taken in consideration when -# showing a hint for a missing member. -missing-member-max-choices=1 - - -[VARIABLES] - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid to define new builtins when possible. -additional-builtins= - -# Tells whether unused global variables should be treated as a violation. -allow-global-unused-variables=yes - -# List of strings which can identify a callback function by name. A callback -# name must start or end with one of those strings. -callbacks=cb_,_cb - -# A regular expression matching the name of dummy variables (i.e. expectedly -# not used). -dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ - -# Argument names that match this expression will be ignored. Default to name -# with leading underscore -ignored-argument-names=_.*|^ignored_|^unused_ - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=six.moves,future.builtins - - -[FORMAT] - -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -# expected-line-ending-format= -expected-line-ending-format=LF - -# Regexp for a line that is allowed to be longer than the limit. -ignore-long-lines=^\s*(# )??$ - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - -# Maximum number of characters on a single line. -max-line-length=100 - -# Maximum number of lines in a module -max-module-lines=1000 - -# Allow the body of a class to be on the same line as the declaration if body -# contains single statement. -single-line-class-stmt=no - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no - - -[SIMILARITIES] - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=yes - -# Minimum lines number of a similarity. -min-similarity-lines=12 - - -[BASIC] - -# Regular expression matching correct argument names -argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - -# Regular expression matching correct attribute names -attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - -# Bad variable names which should always be refused, separated by a comma -bad-names=foo,bar,baz,toto,tutu,tata - -# Regular expression matching correct class attribute names -class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ - -# Regular expression matching correct class names -# class-rgx=[A-Z_][a-zA-Z0-9]+$ -class-rgx=[A-Z_][a-zA-Z0-9_]+$ - -# Regular expression matching correct constant names -const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - -# Regular expression matching correct function names -function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - -# Good variable names which should always be accepted, separated by a comma -# good-names=i,j,k,ex,Run,_ -good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_ - -# Include a hint for the correct naming format with invalid-name -include-naming-hint=no - -# Regular expression matching correct inline iteration names -inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ - -# Regular expression matching correct method names -method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - -# Regular expression matching correct module names -module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=^_ - -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -property-classes=abc.abstractproperty - -# Regular expression matching correct variable names -variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ - - -[IMPORTS] - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma -deprecated-modules=optparse,tkinter.tix - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled) -ext-import-graph= - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled) -import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled) -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__,__new__,setUp - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict,_fields,_replace,_source,_make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=mcs - - -[DESIGN] - -# Maximum number of arguments for function / method -max-args=5 - -# Maximum number of attributes for a class (see R0902). -# max-attributes=7 -max-attributes=11 - -# Maximum number of boolean expressions in a if statement -max-bool-expr=5 - -# Maximum number of branch for function / method body -max-branches=12 - -# Maximum number of locals for function / method body -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - -# Maximum number of return / yield for function / method body -max-returns=6 - -# Maximum number of statements in function / method body -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=1 - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "Exception" -overgeneral-exceptions=builtins.Exception diff --git a/README.rst b/README.rst index 2fb107b..2d178b8 100644 --- a/README.rst +++ b/README.rst @@ -13,9 +13,9 @@ Introduction :target: https://github.com/adafruit/Adafruit_CircuitPython_BluefruitConnect/actions/ :alt: Build Status -.. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black - :alt: Code Style: Black +.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json + :target: https://github.com/astral-sh/ruff + :alt: Code Style: Ruff This module helps you to communicate with the Adafruit Bluefruit Connect app or use its protocols. diff --git a/adafruit_bluefruit_connect/button_packet.py b/adafruit_bluefruit_connect/button_packet.py index 5f5391d..168cbba 100644 --- a/adafruit_bluefruit_connect/button_packet.py +++ b/adafruit_bluefruit_connect/button_packet.py @@ -36,7 +36,6 @@ class ButtonPacket(Packet): """Button 3.""" BUTTON_4: str = "4" """Button 4.""" - # pylint: disable= invalid-name UP: str = "5" """Up Button.""" DOWN: str = "6" diff --git a/adafruit_bluefruit_connect/color_packet.py b/adafruit_bluefruit_connect/color_packet.py index 717de71..0c1f153 100644 --- a/adafruit_bluefruit_connect/color_packet.py +++ b/adafruit_bluefruit_connect/color_packet.py @@ -57,9 +57,7 @@ def parse_private(cls, packet: bytes) -> Optional[Packet]: def to_bytes(self) -> bytes: """Return the bytes needed to send this packet.""" - partial_packet = struct.pack( - self._FMT_CONSTRUCT, self._TYPE_HEADER, *self._color - ) + partial_packet = struct.pack(self._FMT_CONSTRUCT, self._TYPE_HEADER, *self._color) return self.add_checksum(partial_packet) @property diff --git a/adafruit_bluefruit_connect/packet.py b/adafruit_bluefruit_connect/packet.py index 40c2b8e..d099ad2 100644 --- a/adafruit_bluefruit_connect/packet.py +++ b/adafruit_bluefruit_connect/packet.py @@ -16,10 +16,9 @@ import struct - try: - from typing import Optional, Any # adjust these as needed from io import RawIOBase + from typing import Any, Optional # adjust these as needed except ImportError: pass @@ -68,12 +67,12 @@ def from_bytes(cls, packet: bytes) -> Packet: raise ValueError("Packet too short") packet_class = cls._type_to_class.get(packet[0:2], None) if not packet_class: - raise ValueError("Unregistered packet type {}".format(packet[0:2])) + raise ValueError(f"Unregistered packet type {packet[0:2]}") # In case this was called from a subclass, make sure the parsed # type matches up with the current class. if not issubclass(packet_class, cls): - raise ValueError("Packet type is not a {}".format(cls.__name__)) + raise ValueError(f"Packet type is not a {cls.__name__}") if len(packet) != packet_class.PACKET_LENGTH: raise ValueError("Wrong length packet") @@ -128,7 +127,7 @@ def from_stream(cls, stream: RawIOBase) -> Optional[Packet]: header = bytes(start + packet_type) packet_class = cls._type_to_class.get(header, None) if not packet_class: - raise ValueError("Unregistered packet type {}".format(header)) + raise ValueError(f"Unregistered packet type {header}") rest = stream.read(packet_class.PACKET_LENGTH - 2) assert rest is not None packet = header + rest diff --git a/docs/api.rst b/docs/api.rst index d1a7bf0..51d1c3a 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -4,6 +4,9 @@ .. If your library file(s) are nested in a directory (e.g. /adafruit_foo/foo.py) .. use this format as the module name: "adafruit_foo.foo" +API Reference +############# + .. automodule:: adafruit_bluefruit_connect :members: diff --git a/docs/conf.py b/docs/conf.py index 7aefa98..a9c3bd5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,12 +1,10 @@ -# -*- coding: utf-8 -*- - # SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # # SPDX-License-Identifier: MIT +import datetime import os import sys -import datetime sys.path.insert(0, os.path.abspath("..")) @@ -50,9 +48,7 @@ creation_year = "2019" current_year = str(datetime.datetime.now().year) year_duration = ( - current_year - if current_year == creation_year - else creation_year + " - " + current_year + current_year if current_year == creation_year else creation_year + " - " + current_year ) copyright = year_duration + " Dan Halbert" author = "Dan Halbert" diff --git a/examples/bluefruitconnect_controlpad.py b/examples/bluefruitconnect_controlpad.py index 949f65b..fe5457f 100644 --- a/examples/bluefruitconnect_controlpad.py +++ b/examples/bluefruitconnect_controlpad.py @@ -8,10 +8,10 @@ from adafruit_ble import BLERadio from adafruit_ble.advertising.standard import ProvideServicesAdvertisement from adafruit_ble.services.nordic import UARTService -from adafruit_bluefruit_connect.packet import Packet # Only the packet classes that are imported will be known to Packet. from adafruit_bluefruit_connect.button_packet import ButtonPacket +from adafruit_bluefruit_connect.packet import Packet ble = BLERadio() uart_server = UARTService() diff --git a/examples/bluefruitconnect_sensors.py b/examples/bluefruitconnect_sensors.py index 47577aa..218bf60 100644 --- a/examples/bluefruitconnect_sensors.py +++ b/examples/bluefruitconnect_sensors.py @@ -8,13 +8,13 @@ from adafruit_ble import BLERadio from adafruit_ble.advertising.standard import ProvideServicesAdvertisement from adafruit_ble.services.nordic import UARTService -from adafruit_bluefruit_connect.packet import Packet # Only the packet classes that are imported will be known to Packet. from adafruit_bluefruit_connect.accelerometer_packet import AccelerometerPacket from adafruit_bluefruit_connect.gyro_packet import GyroPacket from adafruit_bluefruit_connect.location_packet import LocationPacket from adafruit_bluefruit_connect.magnetometer_packet import MagnetometerPacket +from adafruit_bluefruit_connect.packet import Packet from adafruit_bluefruit_connect.quaternion_packet import QuaternionPacket ble = BLERadio() diff --git a/examples/bluefruitconnect_simpletest.py b/examples/bluefruitconnect_simpletest.py index f0deca1..3f71e92 100644 --- a/examples/bluefruitconnect_simpletest.py +++ b/examples/bluefruitconnect_simpletest.py @@ -8,10 +8,10 @@ from adafruit_ble import BLERadio from adafruit_ble.advertising.standard import ProvideServicesAdvertisement from adafruit_ble.services.nordic import UARTService -from adafruit_bluefruit_connect.packet import Packet # Only the packet classes that are imported will be known to Packet. from adafruit_bluefruit_connect.color_packet import ColorPacket +from adafruit_bluefruit_connect.packet import Packet ble = BLERadio() uart_server = UARTService() diff --git a/examples/bluefruitconnect_simpletest2.py b/examples/bluefruitconnect_simpletest2.py index ecb2172..596e23c 100644 --- a/examples/bluefruitconnect_simpletest2.py +++ b/examples/bluefruitconnect_simpletest2.py @@ -10,10 +10,10 @@ from adafruit_ble import BLERadio from adafruit_ble.advertising.standard import ProvideServicesAdvertisement from adafruit_ble.services.nordic import UARTService -from adafruit_bluefruit_connect.packet import Packet # Only the packet classes that are imported will be known to Packet. from adafruit_bluefruit_connect.color_packet import ColorPacket +from adafruit_bluefruit_connect.packet import Packet from adafruit_bluefruit_connect.raw_text_packet import RawTextPacket ble = BLERadio() diff --git a/examples/bluefruitconnect_uart.py b/examples/bluefruitconnect_uart.py index 2bbbf43..d73ae67 100644 --- a/examples/bluefruitconnect_uart.py +++ b/examples/bluefruitconnect_uart.py @@ -7,6 +7,7 @@ # will be displayed. Periodically, text is sent TO the connected device. import time + from adafruit_ble import BLERadio from adafruit_ble.advertising.standard import ProvideServicesAdvertisement from adafruit_ble.services.nordic import UARTService @@ -40,7 +41,7 @@ print("RX:", text) # OUTGOING (TX) periodically send text if time.monotonic() - last_send > SEND_RATE: - text = "COUNT = {}\r\n".format(count) + text = f"COUNT = {count}\r\n" print("TX:", text.strip()) uart_server.write(text.encode()) count += 1 diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 0000000..ecb20d0 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,110 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +target-version = "py38" +line-length = 100 + +[lint] +preview = true +select = ["I", "PL", "UP"] + +extend-select = [ + "D419", # empty-docstring + "E501", # line-too-long + "W291", # trailing-whitespace + "PLC0414", # useless-import-alias + "PLC2401", # non-ascii-name + "PLC2801", # unnecessary-dunder-call + "PLC3002", # unnecessary-direct-lambda-call + "E999", # syntax-error + "PLE0101", # return-in-init + "F706", # return-outside-function + "F704", # yield-outside-function + "PLE0116", # continue-in-finally + "PLE0117", # nonlocal-without-binding + "PLE0241", # duplicate-bases + "PLE0302", # unexpected-special-method-signature + "PLE0604", # invalid-all-object + "PLE0605", # invalid-all-format + "PLE0643", # potential-index-error + "PLE0704", # misplaced-bare-raise + "PLE1141", # dict-iter-missing-items + "PLE1142", # await-outside-async + "PLE1205", # logging-too-many-args + "PLE1206", # logging-too-few-args + "PLE1307", # bad-string-format-type + "PLE1310", # bad-str-strip-call + "PLE1507", # invalid-envvar-value + "PLE2502", # bidirectional-unicode + "PLE2510", # invalid-character-backspace + "PLE2512", # invalid-character-sub + "PLE2513", # invalid-character-esc + "PLE2514", # invalid-character-nul + "PLE2515", # invalid-character-zero-width-space + "PLR0124", # comparison-with-itself + "PLR0202", # no-classmethod-decorator + "PLR0203", # no-staticmethod-decorator + "UP004", # useless-object-inheritance + "PLR0206", # property-with-parameters + "PLR0904", # too-many-public-methods + "PLR0911", # too-many-return-statements + "PLR0912", # too-many-branches + "PLR0913", # too-many-arguments + "PLR0914", # too-many-locals + "PLR0915", # too-many-statements + "PLR0916", # too-many-boolean-expressions + "PLR1702", # too-many-nested-blocks + "PLR1704", # redefined-argument-from-local + "PLR1711", # useless-return + "C416", # unnecessary-comprehension + "PLR1733", # unnecessary-dict-index-lookup + "PLR1736", # unnecessary-list-index-lookup + + # ruff reports this rule is unstable + #"PLR6301", # no-self-use + + "PLW0108", # unnecessary-lambda + "PLW0120", # useless-else-on-loop + "PLW0127", # self-assigning-variable + "PLW0129", # assert-on-string-literal + "B033", # duplicate-value + "PLW0131", # named-expr-without-context + "PLW0245", # super-without-brackets + "PLW0406", # import-self + "PLW0602", # global-variable-not-assigned + "PLW0603", # global-statement + "PLW0604", # global-at-module-level + + # fails on the try: import typing used by libraries + #"F401", # unused-import + + "F841", # unused-variable + "E722", # bare-except + "PLW0711", # binary-op-exception + "PLW1501", # bad-open-mode + "PLW1508", # invalid-envvar-default + "PLW1509", # subprocess-popen-preexec-fn + "PLW2101", # useless-with-lock + "PLW3301", # nested-min-max +] + +ignore = [ + "PLR2004", # magic-value-comparison + "UP030", # format literals + "PLW1514", # unspecified-encoding + "PLR0913", # too-many-arguments + "PLR0915", # too-many-statements + "PLR0917", # too-many-positional-arguments + "PLR0904", # too-many-public-methods + "PLR0912", # too-many-branches + "PLR0916", # too-many-boolean-expressions + "PLR6301", # could-be-static no-self-use + "PLC0415", # import outside toplevel + "PLC2701", # private import + "UP006", # builtin instead of typing class + "UP007", # x | y typing +] + +[format] +line-ending = "lf" From 24e02c36802f1c0bfd5a98f1c9ab62412644bb1d Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 4 Jun 2025 10:00:20 -0500 Subject: [PATCH 65/65] update rtd.yml file Signed-off-by: foamyguy --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 88bca9f..255dafd 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -12,7 +12,7 @@ sphinx: configuration: docs/conf.py build: - os: ubuntu-20.04 + os: ubuntu-lts-latest tools: python: "3" pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy