From 834fecc205b179b2d5dac0977b82d041a145a9ce Mon Sep 17 00:00:00 2001 From: Herwin Bozet Date: Wed, 21 Apr 2021 13:36:15 +0200 Subject: [PATCH 01/48] Added reference attributes in parent module --- adafruit_hashlib/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/adafruit_hashlib/__init__.py b/adafruit_hashlib/__init__.py index 7294fe7..eaa993b 100644 --- a/adafruit_hashlib/__init__.py +++ b/adafruit_hashlib/__init__.py @@ -24,6 +24,12 @@ """ try: import hashlib + md5 = hashlib.md5 + sha1 = hashlib.sha1 + sha224 = hashlib.sha224 + sha256 = hashlib.sha256 + sha384 = hashlib.sha384 + sha512 = hashlib.sha512 except ImportError: from adafruit_hashlib._sha256 import sha224, sha256 from adafruit_hashlib._sha512 import sha384, sha512 From d70020b543173d5ddd2bad91e11235ef86d1c565 Mon Sep 17 00:00:00 2001 From: dherrada Date: Tue, 9 Nov 2021 13:31:14 -0500 Subject: [PATCH 02/48] 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 e96b413ccd13ca864c046a35ba79c39174bd0906 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Tue, 23 Nov 2021 13:14:07 -0600 Subject: [PATCH 03/48] 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 916cbf944274bd81d595b44700e1467ca04cce4d Mon Sep 17 00:00:00 2001 From: Tim Hawes Date: Thu, 2 Dec 2021 00:14:52 +0000 Subject: [PATCH 04/48] Implement MD5 hash algorithm --- LICENSES/RSA-MD.txt | 20 +++ adafruit_hashlib/_md5.py | 315 ++++++++++++++++++++++++++++++++- examples/hashlib_simpletest.py | 16 ++ 3 files changed, 343 insertions(+), 8 deletions(-) create mode 100644 LICENSES/RSA-MD.txt diff --git a/LICENSES/RSA-MD.txt b/LICENSES/RSA-MD.txt new file mode 100644 index 0000000..6864f20 --- /dev/null +++ b/LICENSES/RSA-MD.txt @@ -0,0 +1,20 @@ +Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. diff --git a/adafruit_hashlib/_md5.py b/adafruit_hashlib/_md5.py index c4d49bc..b7ec68b 100644 --- a/adafruit_hashlib/_md5.py +++ b/adafruit_hashlib/_md5.py @@ -1,18 +1,317 @@ -# SPDX-FileCopyrightText: 2019 Brent Rubell for Adafruit Industries +# SPDX-FileCopyrightText: 1991-1992 RSA Data Security, Inc +# SPDX-FileCopyrightText: 2021 Tim Hawes # -# SPDX-License-Identifier: MIT +# SPDX-License-Identifier: RSA-MD +# +# Derived from: +# +# MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm +# +# Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +# rights reserved. +# +# License to copy and use this software is granted provided that it +# is identified as the "RSA Data Security, Inc. MD5 Message-Digest +# Algorithm" in all material mentioning or referencing this software +# or this function. +# +# License is also granted to make and use derivative works provided +# that such works are identified as "derived from the RSA Data +# Security, Inc. MD5 Message-Digest Algorithm" in all material +# mentioning or referencing the derived work. +# +# RSA Data Security, Inc. makes no representations concerning either +# the merchantability of this software or the suitability of this +# software for any particular purpose. It is provided "as is" +# without express or implied warranty of any kind. +# +# These notices must be retained in any copies of any part of this +# documentation and/or software. """ `_md5.py` ====================================================== MD5 Hash Algorithm. -* Author(s): Brent Rubell + +Based on: +https://tools.ietf.org/html/rfc1321 +https://gist.github.com/HoLyVieR/11e464a91b290e33b38e + +Modified for Python3 and CircuitPython by Tim Hawes. + +* Author(s): RSA Data Security, Olivier Arteau, Tim Hawes """ -# pylint: disable=too-few-public-methods, invalid-name +# pylint: disable=invalid-name,missing-function-docstring,too-many-arguments + +import binascii +import struct +from micropython import const + + +# Constants + + +S11 = const(7) +S12 = const(12) +S13 = const(17) +S14 = const(22) +S21 = const(5) +S22 = const(9) +S23 = const(14) +S24 = const(20) +S31 = const(4) +S32 = const(11) +S33 = const(16) +S34 = const(23) +S41 = const(6) +S42 = const(10) +S43 = const(15) +S44 = const(21) +PADDING = b"\x80" + (b"\x00" * 63) + + +# F, G, H and I are basic MD5 functions. + + +def F(x, y, z): + return (x & y) | ((~x) & z) + + +def G(x, y, z): + return (x & z) | (y & (~z)) + + +def H(x, y, z): + return x ^ y ^ z + + +def I(x, y, z): + return y ^ (x | (~z)) + + +# ROTATE_LEFT rotates x left n bits. + + +def ROTATE_LEFT(x, n): + x = x & 0xFFFFFFFF + return ((x << n) | (x >> (32 - n))) & 0xFFFFFFFF + + +# FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +# Rotation is separate from addition to prevent recomputation. + + +def FF(a, b, c, d, x, s, ac): + a = a + F(b, c, d) + x + ac + a = ROTATE_LEFT(a, s) + a = a + b + return a + + +def GG(a, b, c, d, x, s, ac): + a = a + G(b, c, d) + x + ac + a = ROTATE_LEFT(a, s) + a = a + b + return a + + +def HH(a, b, c, d, x, s, ac): + a = a + H(b, c, d) + x + ac + a = ROTATE_LEFT(a, s) + a = a + b + return a + + +def II(a, b, c, d, x, s, ac): + a = a + I(b, c, d) + x + ac + a = ROTATE_LEFT(a, s) + a = a + b + return a + + +def encode(data, length): + """Encodes input (UINT4) into output (unsigned char). Assumes length is + a multiple of 4. + """ + k = length >> 2 + return struct.pack(*("%iI" % k,) + tuple(data[:k])) + + +def decode(data, length): + """Decodes input (unsigned char) into output (UINT4). Assumes length is + a multiple of 4. + """ + k = length >> 2 + return struct.unpack("%iI" % k, data[:length]) + + class md5: - """RSA MD5 Algorithm class.""" + """Returns a md5 hash object; optionally initialized with a string""" + + digest_size = 16 + block_size = 64 + name = "md5" + + def __init__(self, string=b""): + """Constructs an MD5 hash object.""" + self.count = 0 + self.buffer = b"" + + # Load magic initialization constants. + self.state = (0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476) + + if string: + self.update(string) + + def update(self, data): + """Update the hash object with the bytes-like object.""" + data_len = len(data) + + # Compute number of bytes mod 64 + index = int(self.count >> 3) & 0x3F + + # Update number of bits + self.count = self.count + (data_len << 3) + + part_len = md5.block_size - index + + # Transform as many times as possible. + if data_len >= part_len: + self.buffer = self.buffer[:index] + data[:part_len] + self._transform(self.buffer) + i = part_len + while i + 63 < data_len: + self._transform(data[i : i + md5.block_size]) + i = i + md5.block_size + index = 0 + else: + i = 0 + + # Buffer remaining input + self.buffer = self.buffer[:index] + data[i:data_len] + + def digest(self): + """Return the digest of the data passed to the update() method so far.""" + # Save digest state + _buffer, _count, _state = self.buffer, self.count, self.state + + # Save number of bits + bits = self.count + + # Pad out to 56 mod 64. + index = (self.count >> 3) & 0x3F + if index < 56: + pad_len = 56 - index + else: + pad_len = 120 - index + self.update(PADDING[:pad_len]) + + # Append length (before padding) + self.update(encode((bits & 0xFFFFFFFF, bits >> 32), 8)) + + # Save digest output + result = self.state + + # Restore digest state + self.buffer, self.count, self.state = _buffer, _count, _state + + return encode(result, md5.digest_size) + + def hexdigest(self): + """Like digest() except the digest is returned as a string object of + double length, containing only hexadecimal digits. + """ + return binascii.hexlify(self.digest()).decode("ascii") + + def copy(self): + """Return a copy (“clone”) of the hash object.""" + new = md5() + new.count = self.count + new.buffer = self.buffer + new.state = self.state + return new + + def _transform(self, block): + """MD5 basic transformation. Transforms state based on block.""" + # pylint: disable=invalid-name,too-many-statements + a, b, c, d = self.state + x = decode(block, md5.block_size) + + # Round 1 + a = FF(a, b, c, d, x[0], S11, 0xD76AA478) + d = FF(d, a, b, c, x[1], S12, 0xE8C7B756) + c = FF(c, d, a, b, x[2], S13, 0x242070DB) + b = FF(b, c, d, a, x[3], S14, 0xC1BDCEEE) + a = FF(a, b, c, d, x[4], S11, 0xF57C0FAF) + d = FF(d, a, b, c, x[5], S12, 0x4787C62A) + c = FF(c, d, a, b, x[6], S13, 0xA8304613) + b = FF(b, c, d, a, x[7], S14, 0xFD469501) + a = FF(a, b, c, d, x[8], S11, 0x698098D8) + d = FF(d, a, b, c, x[9], S12, 0x8B44F7AF) + c = FF(c, d, a, b, x[10], S13, 0xFFFF5BB1) + b = FF(b, c, d, a, x[11], S14, 0x895CD7BE) + a = FF(a, b, c, d, x[12], S11, 0x6B901122) + d = FF(d, a, b, c, x[13], S12, 0xFD987193) + c = FF(c, d, a, b, x[14], S13, 0xA679438E) + b = FF(b, c, d, a, x[15], S14, 0x49B40821) + + # Round 2 + a = GG(a, b, c, d, x[1], S21, 0xF61E2562) + d = GG(d, a, b, c, x[6], S22, 0xC040B340) + c = GG(c, d, a, b, x[11], S23, 0x265E5A51) + b = GG(b, c, d, a, x[0], S24, 0xE9B6C7AA) + a = GG(a, b, c, d, x[5], S21, 0xD62F105D) + d = GG(d, a, b, c, x[10], S22, 0x02441453) + c = GG(c, d, a, b, x[15], S23, 0xD8A1E681) + b = GG(b, c, d, a, x[4], S24, 0xE7D3FBC8) + a = GG(a, b, c, d, x[9], S21, 0x21E1CDE6) + d = GG(d, a, b, c, x[14], S22, 0xC33707D6) + c = GG(c, d, a, b, x[3], S23, 0xF4D50D87) + b = GG(b, c, d, a, x[8], S24, 0x455A14ED) + a = GG(a, b, c, d, x[13], S21, 0xA9E3E905) + d = GG(d, a, b, c, x[2], S22, 0xFCEFA3F8) + c = GG(c, d, a, b, x[7], S23, 0x676F02D9) + b = GG(b, c, d, a, x[12], S24, 0x8D2A4C8A) + + # Round 3 + a = HH(a, b, c, d, x[5], S31, 0xFFFA3942) + d = HH(d, a, b, c, x[8], S32, 0x8771F681) + c = HH(c, d, a, b, x[11], S33, 0x6D9D6122) + b = HH(b, c, d, a, x[14], S34, 0xFDE5380C) + a = HH(a, b, c, d, x[1], S31, 0xA4BEEA44) + d = HH(d, a, b, c, x[4], S32, 0x4BDECFA9) + c = HH(c, d, a, b, x[7], S33, 0xF6BB4B60) + b = HH(b, c, d, a, x[10], S34, 0xBEBFBC70) + a = HH(a, b, c, d, x[13], S31, 0x289B7EC6) + d = HH(d, a, b, c, x[0], S32, 0xEAA127FA) + c = HH(c, d, a, b, x[3], S33, 0xD4EF3085) + b = HH(b, c, d, a, x[6], S34, 0x04881D05) + a = HH(a, b, c, d, x[9], S31, 0xD9D4D039) + d = HH(d, a, b, c, x[12], S32, 0xE6DB99E5) + c = HH(c, d, a, b, x[15], S33, 0x1FA27CF8) + b = HH(b, c, d, a, x[2], S34, 0xC4AC5665) + + # Round 4 + a = II(a, b, c, d, x[0], S41, 0xF4292244) + d = II(d, a, b, c, x[7], S42, 0x432AFF97) + c = II(c, d, a, b, x[14], S43, 0xAB9423A7) + b = II(b, c, d, a, x[5], S44, 0xFC93A039) + a = II(a, b, c, d, x[12], S41, 0x655B59C3) + d = II(d, a, b, c, x[3], S42, 0x8F0CCC92) + c = II(c, d, a, b, x[10], S43, 0xFFEFF47D) + b = II(b, c, d, a, x[1], S44, 0x85845DD1) + a = II(a, b, c, d, x[8], S41, 0x6FA87E4F) + d = II(d, a, b, c, x[15], S42, 0xFE2CE6E0) + c = II(c, d, a, b, x[6], S43, 0xA3014314) + b = II(b, c, d, a, x[13], S44, 0x4E0811A1) + a = II(a, b, c, d, x[4], S41, 0xF7537E82) + d = II(d, a, b, c, x[11], S42, 0xBD3AF235) + c = II(c, d, a, b, x[2], S43, 0x2AD7D2BB) + b = II(b, c, d, a, x[9], S44, 0xEB86D391) - def __init__(self, s=None): - raise NotImplementedError( - "MD5 digests not currently implemented in this module." + self.state = ( + 0xFFFFFFFF & (self.state[0] + a), + 0xFFFFFFFF & (self.state[1] + b), + 0xFFFFFFFF & (self.state[2] + c), + 0xFFFFFFFF & (self.state[3] + d), ) diff --git a/examples/hashlib_simpletest.py b/examples/hashlib_simpletest.py index 5da6a87..61f0e53 100755 --- a/examples/hashlib_simpletest.py +++ b/examples/hashlib_simpletest.py @@ -7,6 +7,22 @@ # Bytes-to-encode byte_string = b"CircuitPython" +# Create an MD5 message +print("--MD5--") +m = hashlib.md5() +# Update the hash object with byte_string +m.update(byte_string) +# Obtain the digest, digest size, and block size +print( + "Msg Digest: {}\nMsg Digest Size: {}\nMsg Block Size: {}".format( + m.hexdigest(), m.digest_size, m.block_size + ) +) +# Validate the digest against CPython3 hashlib-md5 +assert ( + m.hexdigest() == "6a61334a5d9f848bea9affcd82864819" +), "Digest does not match expected string." + # Create a SHA-1 message print("--SHA1--") m = hashlib.sha1() From 7b0d2903b23a7c7052f6a6ab1799f7ccd3ac1238 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 8 Dec 2021 20:12:08 -0600 Subject: [PATCH 05/48] allow names --- adafruit_hashlib/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/adafruit_hashlib/__init__.py b/adafruit_hashlib/__init__.py index eaa993b..3ce49b3 100644 --- a/adafruit_hashlib/__init__.py +++ b/adafruit_hashlib/__init__.py @@ -24,6 +24,7 @@ """ try: import hashlib + # pylint: disable=invalid-name md5 = hashlib.md5 sha1 = hashlib.sha1 sha224 = hashlib.sha224 From 9ad5d9fd8d98238e15c330758e18847afc0a9ae2 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 8 Dec 2021 20:24:24 -0600 Subject: [PATCH 06/48] import instead of make variables --- adafruit_hashlib/__init__.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/adafruit_hashlib/__init__.py b/adafruit_hashlib/__init__.py index 3ce49b3..80e01a2 100644 --- a/adafruit_hashlib/__init__.py +++ b/adafruit_hashlib/__init__.py @@ -23,14 +23,8 @@ https://github.com/adafruit/circuitpython/releases """ try: - import hashlib - # pylint: disable=invalid-name - md5 = hashlib.md5 - sha1 = hashlib.sha1 - sha224 = hashlib.sha224 - sha256 = hashlib.sha256 - sha384 = hashlib.sha384 - sha512 = hashlib.sha512 + from hashlib import md5, sha1, sha224, sha256, sha512 + from hashlib import sha3_384 as sha384 except ImportError: from adafruit_hashlib._sha256 import sha224, sha256 from adafruit_hashlib._sha512 import sha384, sha512 From 0b7e6fa366bf718cce5b42296eb67c9db3738ef6 Mon Sep 17 00:00:00 2001 From: Brent Rubell Date: Mon, 20 Dec 2021 09:47:12 -0500 Subject: [PATCH 07/48] Update README.rst We support MD5 now! --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 76113ad..bd06069 100644 --- a/README.rst +++ b/README.rst @@ -17,7 +17,7 @@ This module implements a common interface to many different secure hash and mess Included are the FIPS secure hash algorithms SHA1, SHA224, SHA256, SHA384, and SHA512 (defined in FIPS 180-2) as well as RSA’s MD5 algorithm (defined in Internet RFC 1321). -SHA1 and MD5 algorithms are not supported by the CircuitPython module. +The SHA1 algorithm is not supported by the CircuitPython module. `This library is based on the work performed in the micropython-lib hashlib module by Paul Sokolovsky `_ From 982a93eec76e62522662831834652b120484ecce Mon Sep 17 00:00:00 2001 From: dherrada Date: Thu, 13 Jan 2022 16:27:30 -0500 Subject: [PATCH 08/48] 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 c834cf0a736744b55bc36e712865c403f3e01ba9 Mon Sep 17 00:00:00 2001 From: dherrada Date: Mon, 24 Jan 2022 16:46:16 -0500 Subject: [PATCH 09/48] 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 bd06069..83fa41c 100644 --- a/README.rst +++ b/README.rst @@ -2,7 +2,7 @@ Introduction ============ .. image:: https://readthedocs.org/projects/adafruit-circuitpython-hashlib/badge/?version=latest - :target: https://circuitpython.readthedocs.io/projects/hashlib/en/latest/ + :target: https://docs.circuitpython.org/projects/hashlib/en/latest/ :alt: Documentation Status .. image:: https://img.shields.io/discord/327254708534116352.svg @@ -71,7 +71,7 @@ Usage 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 c378a6f..917c5d8 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), } # Add any paths that contain templates here, relative to this directory. diff --git a/docs/index.rst b/docs/index.rst index f8b16c4..203c1ec 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 15efa8a..84691c3 100644 --- a/setup.py +++ b/setup.py @@ -44,8 +44,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 blinka circuitpython micropython hashlib hashes, sha1, sha224, sha384, " From 7d3bd1b9e144c14a1fae991cab37db1f65225aab Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Thu, 10 Feb 2022 09:56:41 -0500 Subject: [PATCH 10/48] Consolidate Documentation sections of README --- README.rst | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 83fa41c..b8c924b 100644 --- a/README.rst +++ b/README.rst @@ -73,14 +73,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 f696564fa9c33b7892008660a19a7fb034fa65a8 Mon Sep 17 00:00:00 2001 From: dherrada Date: Mon, 14 Feb 2022 15:35:02 -0500 Subject: [PATCH 11/48] 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 8ae5b995cad42d55524ee51b68a21b90134f4640 Mon Sep 17 00:00:00 2001 From: Kattni Rembor Date: Mon, 28 Mar 2022 15:52:04 -0400 Subject: [PATCH 12/48] 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 43d1385..29230db 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 46a5fd159e70ea9822ff4ee4c5fe3aeccdf3af5c Mon Sep 17 00:00:00 2001 From: evaherrada Date: Thu, 21 Apr 2022 15:00:27 -0400 Subject: [PATCH 13/48] Updated gitignore Signed-off-by: evaherrada --- .gitignore | 48 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 9647e71..544ec4a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +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 -.idea + +# 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 -.eggs -dist -**/*.egg-info + +# IDE-specific files +.idea +.vscode +*~ From 86f0cdb4fab7fedca5d8336ba96fc5d624f626ad Mon Sep 17 00:00:00 2001 From: evaherrada Date: Fri, 22 Apr 2022 15:58:44 -0400 Subject: [PATCH 14/48] Patch: Replaced discord badge image --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index b8c924b..48d51ee 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ Introduction :target: https://docs.circuitpython.org/projects/hashlib/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 77fbd068f5d084028ed3c2b6ec23b7f49cf5e991 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Sun, 24 Apr 2022 14:03:57 -0500 Subject: [PATCH 15/48] change discord badge --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 48d51ee..1a55cd3 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ Introduction :target: https://docs.circuitpython.org/projects/hashlib/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 dd633c8c5e0dd006785dfb57a6237edbe0b66e15 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 15 May 2022 12:50:22 -0400 Subject: [PATCH 16/48] 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 29230db..0a91a11 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,duplicate-code 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 9ba578909c8e63952c54d6b2bef7d33c184ee1d0 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 22 May 2022 00:18:55 -0400 Subject: [PATCH 17/48] 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 9d1117cc52dae24441b5b0e68dd032724ac6efa3 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 22 May 2022 00:18:23 -0400 Subject: [PATCH 18/48] 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 bb7fdf2b08804cfcda7dac9ab7215960b09838f3 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 30 May 2022 14:25:04 -0400 Subject: [PATCH 19/48] 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 917c5d8..b7f8025 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -60,7 +60,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 c077001aadc5e6e774558da67caae692a5ea5240 Mon Sep 17 00:00:00 2001 From: evaherrada Date: Tue, 7 Jun 2022 15:34:25 -0400 Subject: [PATCH 20/48] 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 203c1ec..bbe5046 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 d2060181ddc5a1b8442c6dab7b781aba9702c548 Mon Sep 17 00:00:00 2001 From: evaherrada Date: Tue, 21 Jun 2022 17:00:37 -0400 Subject: [PATCH 21/48] Removed duplicate-code from library pylint disable Signed-off-by: evaherrada --- .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 0a91a11..3343606 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ repos: name: pylint (library code) types: [python] args: - - --disable=consider-using-f-string,duplicate-code + - --disable=consider-using-f-string exclude: "^(docs/|examples/|tests/|setup.py$)" - id: pylint name: pylint (example code) From 51bacf986a0910f699f5f28e74460d81d9224cca Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Thu, 23 Jun 2022 23:13:28 -0400 Subject: [PATCH 22/48] Update setup.py to use packages --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 84691c3..b5a3384 100644 --- a/setup.py +++ b/setup.py @@ -52,5 +52,5 @@ # simple. Or you can use find_packages(). # TODO: IF LIBRARY FILES ARE A PACKAGE FOLDER, # CHANGE `py_modules=['...']` TO `packages=['...']` - py_modules=["adafruit_hashlib"], + packages=["adafruit_hashlib"], ) From 11366c625c6136e8aa65d4aaf4b5c97f73542dfa Mon Sep 17 00:00:00 2001 From: Nicolas Favre-Felix Date: Wed, 13 Jul 2022 17:26:15 -0700 Subject: [PATCH 23/48] Add missing new line in docstring for hashlib.new The missing line between the method description and the list of parameters leads to broken formatting in the docs. It needs to be present for the list of parameters to be correctly formatted. --- adafruit_hashlib/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/adafruit_hashlib/__init__.py b/adafruit_hashlib/__init__.py index 80e01a2..ff0201a 100644 --- a/adafruit_hashlib/__init__.py +++ b/adafruit_hashlib/__init__.py @@ -40,6 +40,7 @@ def new(algo, data=b""): """Creates a new hashlib object. + :param str algo: Name of the desired algorithm. :param str data: First parameter. """ From 0a5f143a8d327ee58ad71e01f815edec1790a732 Mon Sep 17 00:00:00 2001 From: evaherrada Date: Fri, 22 Jul 2022 13:58:49 -0400 Subject: [PATCH 24/48] 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 1a55cd3..45178e7 100644 --- a/README.rst +++ b/README.rst @@ -53,8 +53,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-hashlib Usage Example From 81eed8546728a47cf462ccc15f3eab64304fe386 Mon Sep 17 00:00:00 2001 From: Eva Herrada <33632497+evaherrada@users.noreply.github.com> Date: Tue, 26 Jul 2022 14:11:55 -0400 Subject: [PATCH 25/48] Updated badge link --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 45178e7..41d59d5 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ Introduction ============ -.. image:: https://readthedocs.org/projects/adafruit-circuitpython-hashlib/badge/?version=latest +.. image:: https://readthedocs.org/projects/hashlib/badge/?version=latest :target: https://docs.circuitpython.org/projects/hashlib/en/latest/ :alt: Documentation Status From 57c4b6f50aec775f6ffa9c4489cb3dc0676be094 Mon Sep 17 00:00:00 2001 From: evaherrada Date: Tue, 2 Aug 2022 17:00:37 -0400 Subject: [PATCH 26/48] Added Black formatting badge --- README.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.rst b/README.rst index 41d59d5..a7329db 100644 --- a/README.rst +++ b/README.rst @@ -13,6 +13,10 @@ Introduction :target: https://github.com/adafruit/Adafruit_CircuitPython_hashlib/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 implements a common interface to many different secure hash and message digest algorithms. Included are the FIPS secure hash algorithms SHA1, SHA224, SHA256, SHA384, and SHA512 (defined in FIPS 180-2) as well as RSA’s MD5 algorithm (defined in Internet RFC 1321). From 1841609ebf94f259cbc07fd23ce5ff4c41d2500c Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 8 Aug 2022 22:05:54 -0400 Subject: [PATCH 27/48] Switched to pyproject.toml --- .github/workflows/build.yml | 18 ++++++----- .github/workflows/release.yml | 17 ++++++----- optional_requirements.txt | 3 ++ pyproject.toml | 48 ++++++++++++++++++++++++++++++ requirements.txt | 2 +- setup.py | 56 ----------------------------------- 6 files changed, 72 insertions(+), 72 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..a37dab0 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,48 @@ +# SPDX-FileCopyrightText: 2022 Alec Delaney for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +[build-system] +requires = [ + "setuptools", + "wheel", +] + +[project] +name = "adafruit-circuitpython-hashlib" +description = "Secure hashes and message digests" +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_hashlib"} +keywords = [ + "adafruit", + "blinka", + "circuitpython", + "micropython", + "hashlib", + "hashes,", + "sha1,", + "sha224,", + "sha384,", + "sha512", +] +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_hashlib"] + +[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 b5a3384..0000000 --- a/setup.py +++ /dev/null @@ -1,56 +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 -""" - -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-hashlib", - use_scm_version=True, - setup_requires=["setuptools_scm"], - description="Secure hashes and message digests", - long_description=long_description, - long_description_content_type="text/x-rst", - # The project's main homepage. - url="https://github.com/adafruit/Adafruit_CircuitPython_hashlib", - # 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 blinka circuitpython micropython hashlib hashes, sha1, sha224, sha384, " - "sha512", - # You can just specify the packages manually here if your project is - # simple. Or you can use find_packages(). - # TODO: IF LIBRARY FILES ARE A PACKAGE FOLDER, - # CHANGE `py_modules=['...']` TO `packages=['...']` - packages=["adafruit_hashlib"], -) From 5df75673ec7638d02a344b4ac446fcdb9133a7f4 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Tue, 9 Aug 2022 12:03:54 -0400 Subject: [PATCH 28/48] 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 a37dab0..e7a980d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,6 +6,7 @@ requires = [ "setuptools", "wheel", + "setuptools-scm", ] [project] From e2f4cd3c6d513d2b54cd559423abd6635e6a9728 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Tue, 16 Aug 2022 18:09:15 -0400 Subject: [PATCH 29/48] Update version string --- adafruit_hashlib/__init__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_hashlib/__init__.py b/adafruit_hashlib/__init__.py index ff0201a..5b49e0c 100644 --- a/adafruit_hashlib/__init__.py +++ b/adafruit_hashlib/__init__.py @@ -31,7 +31,7 @@ from adafruit_hashlib._sha1 import sha1 from adafruit_hashlib._md5 import md5 -__version__ = "0.0.0-auto.0" +__version__ = "0.0.0+auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_hashlib.git" # FIPS secure hash algorithms supported by this library diff --git a/pyproject.toml b/pyproject.toml index e7a980d..1a70911 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ requires = [ [project] name = "adafruit-circuitpython-hashlib" description = "Secure hashes and message digests" -version = "0.0.0-auto.0" +version = "0.0.0+auto.0" readme = "README.rst" authors = [ {name = "Adafruit Industries", email = "circuitpython@adafruit.com"} From 285442d514f17c3eb5e12872d0da6c474aa87b43 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Tue, 16 Aug 2022 21:09:15 -0400 Subject: [PATCH 30/48] 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 c9e3829c4a3ecad007eda24579017d2a7724bcf8 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Mon, 22 Aug 2022 21:36:32 -0400 Subject: [PATCH 31/48] 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 b7f8025..d7f7ab0 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("..")) @@ -43,7 +44,8 @@ # General information about the project. project = "Adafruit hashlib Library" -copyright = "2019 Brent Rubell" +current_year = str(datetime.datetime.now().year) +copyright = current_year + " Brent Rubell" author = "Brent Rubell" # The version info for the project you're documenting, acts as replacement for From cace15a510273d9bd31f176c8497faa10b84b0be Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Tue, 23 Aug 2022 17:26:22 -0400 Subject: [PATCH 32/48] 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 d7f7ab0..814dfa8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -44,8 +44,14 @@ # General information about the project. project = "Adafruit hashlib Library" +creation_year = "2019" current_year = str(datetime.datetime.now().year) -copyright = current_year + " Brent Rubell" +year_duration = ( + current_year + if current_year == creation_year + else creation_year + " - " + current_year +) +copyright = year_duration + " Brent Rubell" author = "Brent Rubell" # The version info for the project you're documenting, acts as replacement for From 76b921b6dde6ebe8e36746490353513fb165a857 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/48] 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 5d80377ee48bbe02aaaece4be29f59ce980937c5 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/48] 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 61d8f187668c4e3d3e60163faa91751ec8877f2b Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Fri, 4 Nov 2022 08:15:21 -0400 Subject: [PATCH 35/48] 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 a2f0bd5e495fb689f66441743ef7360d06ae6391 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/48] 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 937192fd80f2ae513b37c8f8565a8e02ddfb6474 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/48] 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 044b2c4b64ae8f50285015608fe347f867e15218 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Mon, 7 Nov 2022 23:05:48 -0500 Subject: [PATCH 38/48] Fix pylint errors --- adafruit_hashlib/_sha256.py | 2 +- adafruit_hashlib/_sha512.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_hashlib/_sha256.py b/adafruit_hashlib/_sha256.py index e19b467..5004adb 100644 --- a/adafruit_hashlib/_sha256.py +++ b/adafruit_hashlib/_sha256.py @@ -9,7 +9,7 @@ SHA-256 Hash Algorithm. * Author(s): Tom St Denis, Paul Sokolovsky, Brent Rubell """ -# pylint: disable=invalid-name, unnecessary-lambda, missing-docstring +# pylint: disable=invalid-name, unnecessary-lambda, unnecessary-lambda-assignment, missing-docstring # SHA Block size and message digest sizes, in bytes. SHA_BLOCKSIZE = 64 diff --git a/adafruit_hashlib/_sha512.py b/adafruit_hashlib/_sha512.py index 5514e7f..22e354d 100644 --- a/adafruit_hashlib/_sha512.py +++ b/adafruit_hashlib/_sha512.py @@ -10,7 +10,7 @@ CPython's sha512module.c. * Author(s): Paul Sokolovsky, Brent Rubell """ -# pylint: disable=invalid-name, unnecessary-lambda, missing-docstring, line-too-long +# pylint: disable=invalid-name, unnecessary-lambda, unnecessary-lambda-assignment, missing-docstring, line-too-long # SHA Block size and message digest sizes, in bytes. SHA_BLOCKSIZE = 128 From c1e1ff4c0340309c63d4e690d32354bae7ae96d4 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 39/48] 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 1e2dace3fe891e19bd4c25983969e45c2cd6047e 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 40/48] 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 99db3f4ff1b5595661f830cdf9d654e5244aad8f Mon Sep 17 00:00:00 2001 From: Chris Pappalardo Date: Tue, 25 Apr 2023 14:28:27 -0700 Subject: [PATCH 41/48] added missing type annotations --- adafruit_hashlib/__init__.py | 11 +++++++++-- adafruit_hashlib/_md5.py | 34 ++++++++++++++++++++-------------- adafruit_hashlib/_sha1.py | 19 ++++++++++++++----- adafruit_hashlib/_sha256.py | 31 +++++++++++++++++++++---------- adafruit_hashlib/_sha512.py | 32 ++++++++++++++++++++++---------- 5 files changed, 86 insertions(+), 41 deletions(-) diff --git a/adafruit_hashlib/__init__.py b/adafruit_hashlib/__init__.py index 5b49e0c..74ea4c6 100644 --- a/adafruit_hashlib/__init__.py +++ b/adafruit_hashlib/__init__.py @@ -22,6 +22,13 @@ * Adafruit CircuitPython firmware for the supported boards: https://github.com/adafruit/circuitpython/releases """ + +try: + from typing import List, Optional, Union +except ImportError: + pass + + try: from hashlib import md5, sha1, sha224, sha256, sha512 from hashlib import sha3_384 as sha384 @@ -38,7 +45,7 @@ ALGOS_AVAIL = ["sha1", "md5", "sha224", "sha256", "sha384", "sha512"] -def new(algo, data=b""): +def new(algo, data: Optional[bytes] = b"") -> Union[md5, sha1, sha224, sha256, sha512]: """Creates a new hashlib object. :param str algo: Name of the desired algorithm. @@ -52,7 +59,7 @@ def new(algo, data=b""): @property -def algorithms_available(): +def algorithms_available() -> List[str]: """Returns a list containing the names of the hash algorithms that are available in this module. """ diff --git a/adafruit_hashlib/_md5.py b/adafruit_hashlib/_md5.py index b7ec68b..b0d9fa2 100644 --- a/adafruit_hashlib/_md5.py +++ b/adafruit_hashlib/_md5.py @@ -43,6 +43,12 @@ """ # pylint: disable=invalid-name,missing-function-docstring,too-many-arguments +try: + from typing import Optional, Tuple +except ImportError: + # suppress because typing does not exist on circuitpython + pass + import binascii import struct from micropython import const @@ -73,26 +79,26 @@ # F, G, H and I are basic MD5 functions. -def F(x, y, z): +def F(x: int, y: int, z: int) -> int: return (x & y) | ((~x) & z) -def G(x, y, z): +def G(x: int, y: int, z: int) -> int: return (x & z) | (y & (~z)) -def H(x, y, z): +def H(x: int, y: int, z: int) -> int: return x ^ y ^ z -def I(x, y, z): +def I(x: int, y: int, z: int) -> int: return y ^ (x | (~z)) # ROTATE_LEFT rotates x left n bits. -def ROTATE_LEFT(x, n): +def ROTATE_LEFT(x: int, n: int) -> int: x = x & 0xFFFFFFFF return ((x << n) | (x >> (32 - n))) & 0xFFFFFFFF @@ -101,35 +107,35 @@ def ROTATE_LEFT(x, n): # Rotation is separate from addition to prevent recomputation. -def FF(a, b, c, d, x, s, ac): +def FF(a: int, b: int, c: int, d: int, x: int, s: int, ac: int) -> int: a = a + F(b, c, d) + x + ac a = ROTATE_LEFT(a, s) a = a + b return a -def GG(a, b, c, d, x, s, ac): +def GG(a: int, b: int, c: int, d: int, x: int, s: int, ac: int) -> int: a = a + G(b, c, d) + x + ac a = ROTATE_LEFT(a, s) a = a + b return a -def HH(a, b, c, d, x, s, ac): +def HH(a: int, b: int, c: int, d: int, x: int, s: int, ac: int) -> int: a = a + H(b, c, d) + x + ac a = ROTATE_LEFT(a, s) a = a + b return a -def II(a, b, c, d, x, s, ac): +def II(a: int, b: int, c: int, d: int, x: int, s: int, ac: int) -> int: a = a + I(b, c, d) + x + ac a = ROTATE_LEFT(a, s) a = a + b return a -def encode(data, length): +def encode(data: Tuple[int], length: int) -> bytes: """Encodes input (UINT4) into output (unsigned char). Assumes length is a multiple of 4. """ @@ -137,7 +143,7 @@ def encode(data, length): return struct.pack(*("%iI" % k,) + tuple(data[:k])) -def decode(data, length): +def decode(data: bytes, length: int) -> Tuple[int]: """Decodes input (unsigned char) into output (UINT4). Assumes length is a multiple of 4. """ @@ -152,7 +158,7 @@ class md5: block_size = 64 name = "md5" - def __init__(self, string=b""): + def __init__(self, string: Optional[bytes] = b""): """Constructs an MD5 hash object.""" self.count = 0 self.buffer = b"" @@ -163,7 +169,7 @@ def __init__(self, string=b""): if string: self.update(string) - def update(self, data): + def update(self, data: bytes): """Update the hash object with the bytes-like object.""" data_len = len(data) @@ -231,7 +237,7 @@ def copy(self): new.state = self.state return new - def _transform(self, block): + def _transform(self, block: bytes): """MD5 basic transformation. Transforms state based on block.""" # pylint: disable=invalid-name,too-many-statements a, b, c, d = self.state diff --git a/adafruit_hashlib/_sha1.py b/adafruit_hashlib/_sha1.py index 8b3e8b5..ac1b14e 100755 --- a/adafruit_hashlib/_sha1.py +++ b/adafruit_hashlib/_sha1.py @@ -19,6 +19,13 @@ from io import BytesIO from micropython import const +try: + from typing import Optional, Tuple, Union +except ImportError: + # suppress because typing does not exist on circuitpython + pass + + # SHA Block size and message digest sizes, in bytes. SHA_BLOCKSIZE = 64 SHA_DIGESTSIZE = 20 @@ -30,7 +37,7 @@ K3 = const(0xCA62C1D6) -def _getbuf(data): +def _getbuf(data: Union[str, bytes]) -> bytes: """Converts data into ascii, returns bytes of data. :param str bytes bytearray data: Data to convert. @@ -41,7 +48,7 @@ def _getbuf(data): return bytes(data) -def _left_rotate(n, b): +def _left_rotate(n: int, b: int) -> int: """Left rotate a 32-bit integer, n, by b bits. :param int n: 32-bit integer :param int b: Desired rotation amount, in bits. @@ -51,7 +58,9 @@ def _left_rotate(n, b): # pylint: disable=invalid-name, too-many-arguments -def _hash_computation(chunk, h0, h1, h2, h3, h4): +def _hash_computation( + chunk: bytes, h0: int, h1: int, h2: int, h3: int, h4: int +) -> Tuple[int, int, int, int, int]: """Processes 64-bit chunk of data and returns new digest variables. Per FIPS [6.1.2] :param bytes bytearray chunk: 64-bit bytearray @@ -118,7 +127,7 @@ class sha1: block_size = SHA_BLOCKSIZE name = "sha1" - def __init__(self, data=None): + def __init__(self, data: Optional[Union[str, bytes]] = None): """Construct a SHA-1 hash object. :param bytes data: Optional data to process @@ -159,7 +168,7 @@ def _create_digest(self): return h return _hash_computation(message[64:], *h) - def update(self, data): + def update(self, data: Optional[Union[str, bytes]]): """Updates the hash object with bytes-like object, data. :param bytes data: bytearray or bytes object diff --git a/adafruit_hashlib/_sha256.py b/adafruit_hashlib/_sha256.py index 5004adb..6df455c 100644 --- a/adafruit_hashlib/_sha256.py +++ b/adafruit_hashlib/_sha256.py @@ -11,6 +11,13 @@ """ # pylint: disable=invalid-name, unnecessary-lambda, unnecessary-lambda-assignment, missing-docstring +try: + from typing import Dict, List, Optional, Tuple, Union +except ImportError: + # suppress because typing does not exist on circuitpython + pass + + # SHA Block size and message digest sizes, in bytes. SHA_BLOCKSIZE = 64 SHA_DIGESTSIZE = 32 @@ -42,7 +49,7 @@ def new_shaobject(): Gamma1 = lambda x: (S(x, 17) ^ S(x, 19) ^ R(x, 10)) # pylint: disable=too-many-statements -def sha_transform(sha_info): +def sha_transform(sha_info: Dict[str, Union[List[int], int]]) -> None: W = [] d = sha_info["data"] @@ -59,7 +66,9 @@ def sha_transform(sha_info): ss = sha_info["digest"][:] # pylint: disable=too-many-arguments, line-too-long - def RND(a, b, c, d, e, f, g, h, i, ki): + def RND( + a: int, b: int, c: int, d: int, e: int, f: int, g: int, h: int, i: int, ki: int + ) -> Tuple[int, int]: """Compress""" t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i] t1 = Sigma0(a) + Maj(a, b, c) @@ -267,7 +276,7 @@ def RND(a, b, c, d, e, f, g, h, i, ki): sha_info["digest"] = dig -def sha_init(): +def sha_init() -> Dict[str, Union[List[int], int]]: """Initialize the SHA digest.""" sha_info = new_shaobject() sha_info["digest"] = [ @@ -287,7 +296,7 @@ def sha_init(): return sha_info -def sha224_init(): +def sha224_init() -> Dict[str, Union[List[int], int]]: """Initialize a SHA224 digest.""" sha_info = new_shaobject() sha_info["digest"] = [ @@ -307,13 +316,15 @@ def sha224_init(): return sha_info -def getbuf(string): +def getbuf(string: Union[str, bytes]) -> bytes: if isinstance(string, str): return string.encode("ascii") return bytes(string) -def sha_update(sha_info, buffer): +def sha_update( + sha_info: Dict[str, Union[List[int], int]], buffer: Union[str, bytes] +) -> None: """Update the SHA digest. :param dict sha_info: SHA Digest. :param str buffer: SHA buffer size. @@ -360,7 +371,7 @@ def sha_update(sha_info, buffer): sha_info["local"] = size -def sha_final(sha_info): +def sha_final(sha_info: Dict[str, Union[List[int], int]]) -> bytes: """Finish computing the SHA Digest.""" lo_bit_count = sha_info["count_lo"] hi_bit_count = sha_info["count_hi"] @@ -401,13 +412,13 @@ class sha256: block_size = SHA_BLOCKSIZE name = "sha256" - def __init__(self, s=None): + def __init__(self, s: Optional[Union[str, bytes]] = None): """Constructs a SHA256 hash object.""" self._sha = sha_init() if s: sha_update(self._sha, getbuf(s)) - def update(self, s): + def update(self, s: Union[str, bytes]): """Updates the hash object with a bytes-like object, s.""" sha_update(self._sha, getbuf(s)) @@ -434,7 +445,7 @@ class sha224(sha256): digest_size = digestsize = 28 name = "sha224" - def __init__(self, s=None): + def __init__(self, s: Optional[Union[str, bytes]] = None): """Constructs a SHA224 hash object.""" self._sha = sha224_init() if s: diff --git a/adafruit_hashlib/_sha512.py b/adafruit_hashlib/_sha512.py index 22e354d..2373f66 100644 --- a/adafruit_hashlib/_sha512.py +++ b/adafruit_hashlib/_sha512.py @@ -12,6 +12,13 @@ """ # pylint: disable=invalid-name, unnecessary-lambda, unnecessary-lambda-assignment, missing-docstring, line-too-long +try: + from typing import Dict, List, Optional, Tuple, Union +except ImportError: + # suppress because typing does not exist on circuitpython + pass + + # SHA Block size and message digest sizes, in bytes. SHA_BLOCKSIZE = 128 SHA_DIGESTSIZE = 64 @@ -43,8 +50,9 @@ def new_shaobject(): Gamma0 = lambda x: (S(x, 1) ^ S(x, 8) ^ R(x, 7)) Gamma1 = lambda x: (S(x, 19) ^ S(x, 61) ^ R(x, 6)) + # pylint: disable=protected-access, too-many-statements -def sha_transform(sha_info): +def sha_transform(sha_info: Dict[str, Union[List[int], int]]) -> None: W = [] d = sha_info["data"] @@ -69,7 +77,9 @@ def sha_transform(sha_info): ss = sha_info["digest"][:] # pylint: disable=line-too-long, too-many-arguments - def RND(a, b, c, d, e, f, g, h, i, ki): + def RND( + a: int, b: int, c: int, d: int, e: int, f: int, g: int, h: int, i: int, ki: int + ) -> Tuple[int, int]: t0 = (h + Sigma1(e) + Ch(e, f, g) + ki + W[i]) & 0xFFFFFFFFFFFFFFFF t1 = (Sigma0(a) + Maj(a, b, c)) & 0xFFFFFFFFFFFFFFFF d = (d + t0) & 0xFFFFFFFFFFFFFFFF @@ -324,7 +334,7 @@ def RND(a, b, c, d, e, f, g, h, i, ki): sha_info["digest"] = dig -def sha_init(): +def sha_init() -> Dict[str, Union[List[int], int]]: """Initialize the SHA digest.""" sha_info = new_shaobject() sha_info["digest"] = [ @@ -344,7 +354,7 @@ def sha_init(): return sha_info -def sha384_init(): +def sha384_init() -> Dict[str, Union[List[int], int]]: """Initialize a SHA384 digest.""" sha_info = new_shaobject() sha_info["digest"] = [ @@ -364,13 +374,15 @@ def sha384_init(): return sha_info -def getbuf(s): +def getbuf(s: Union[str, bytes]) -> bytes: if isinstance(s, str): return s.encode("ascii") return bytes(s) -def sha_update(sha_info, buffer): +def sha_update( + sha_info: Dict[str, Union[List[int], int]], buffer: Union[str, bytes] +) -> None: """Update the SHA digest. :param dict sha_info: SHA Digest. :param str buffer: SHA buffer size. @@ -417,7 +429,7 @@ def sha_update(sha_info, buffer): sha_info["local"] = count -def sha_final(sha_info): +def sha_final(sha_info: Dict[str, Union[List[int], int]]) -> bytes: """Finish computing the SHA Digest.""" lo_bit_count = sha_info["count_lo"] hi_bit_count = sha_info["count_hi"] @@ -476,13 +488,13 @@ class sha512: block_size = SHA_BLOCKSIZE name = "sha512" - def __init__(self, s=None): + def __init__(self, s: Optional[Union[str, bytes]] = None): """Constructs a SHA512 hash object.""" self._sha = sha_init() if s: sha_update(self._sha, getbuf(s)) - def update(self, s): + def update(self, s: Union[str, bytes]): """Updates the hash object with a bytes-like object, s.""" sha_update(self._sha, getbuf(s)) @@ -509,7 +521,7 @@ class sha384(sha512): digest_size = digestsize = 48 name = "sha384" - def __init__(self, s=None): + def __init__(self, s: Optional[Union[str, bytes]] = None): """Constructs a SHA224 hash object.""" self._sha = sha384_init() if s: From e32720127945025fd115ea417e7a8f52cf44c7ed Mon Sep 17 00:00:00 2001 From: Tekktrik Date: Tue, 9 May 2023 20:26:25 -0400 Subject: [PATCH 42/48] 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 4f38b68bde77a84b110481a3c4bc6157a2128bc9 Mon Sep 17 00:00:00 2001 From: Tekktrik Date: Wed, 10 May 2023 22:34:04 -0400 Subject: [PATCH 43/48] Run pre-commit --- adafruit_hashlib/_sha256.py | 1 + 1 file changed, 1 insertion(+) diff --git a/adafruit_hashlib/_sha256.py b/adafruit_hashlib/_sha256.py index 6df455c..e90723d 100644 --- a/adafruit_hashlib/_sha256.py +++ b/adafruit_hashlib/_sha256.py @@ -48,6 +48,7 @@ def new_shaobject(): Gamma0 = lambda x: (S(x, 7) ^ S(x, 18) ^ R(x, 3)) Gamma1 = lambda x: (S(x, 17) ^ S(x, 19) ^ R(x, 10)) + # pylint: disable=too-many-statements def sha_transform(sha_info: Dict[str, Union[List[int], int]]) -> None: W = [] From 83616babd1193e243903e92af388a80e2ebdcab1 Mon Sep 17 00:00:00 2001 From: Tekktrik Date: Sun, 14 May 2023 13:00:32 -0400 Subject: [PATCH 44/48] 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 814dfa8..ba88c78 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 223882fc64afa7fd91d28d5e7956d863da4bfad9 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 18 Sep 2023 16:18:44 -0500 Subject: [PATCH 45/48] "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 ba88c78..8932725 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -101,19 +101,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 2b35488cc2757b91115f4efa731ea781341b3deb Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 16 Oct 2023 14:30:31 -0500 Subject: [PATCH 46/48] 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 da665bf1177edc8c7ea9544fc48eb10051839cc2 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 7 Oct 2024 09:24:05 -0500 Subject: [PATCH 47/48] 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 8932725..b1e73b5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -104,7 +104,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 794ca89e2a2a1ed9792179d7dd7b915064e8b7b3 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Tue, 14 Jan 2025 11:32:34 -0600 Subject: [PATCH 48/48] 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: