Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package micropython-lib for openSUSE:Factory checked in at 2025-08-15 21:52:36 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/micropython-lib (Old) and /work/SRC/openSUSE:Factory/.micropython-lib.new.1085 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "micropython-lib" Fri Aug 15 21:52:36 2025 rev:4 rq:1299774 version:1.26.0 Changes: -------- --- /work/SRC/openSUSE:Factory/micropython-lib/micropython-lib.changes 2025-04-20 20:03:41.362382206 +0200 +++ /work/SRC/openSUSE:Factory/.micropython-lib.new.1085/micropython-lib.changes 2025-08-15 21:54:13.217508628 +0200 @@ -1,0 +2,20 @@ +Fri Aug 15 08:21:31 UTC 2025 - Dominik Heidler <dheid...@suse.de> + +- Update to 1.26.0 + * aiorepl: Handle stream shutdown. + * aiohttp: Fix partial reads by using readexactly. + * abc: Add ABC base class. + * aioble-l2cap: Raise correct error if l2cap disconnects during send. + * logging: Allow logging.exception helper to handle tracebacks. + * errno: Add ENOTCONN constant. + * aiorepl: Use blocking reads for raw REPL and raw paste. + * urllib.urequest: Add support for headers to urequest.urlopen. + * tools/verifygitlog.py: Sync with changes from the main repo. + * utop: Print IDF heap details. + * utop: Print MicroPython memory info. + * utop: Add initial implementation for ESP32. + * all: Apply Ruff 0.11.6 reformatting changes. + * top: Bump the Ruff version to 0.11.6. + * lora: Fix SNR value in SX126x received packets. + +------------------------------------------------------------------- Old: ---- micropython-lib-1.25.0.tar.gz New: ---- micropython-lib-1.26.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ micropython-lib.spec ++++++ --- /var/tmp/diff_new_pack.MDDfKc/_old 2025-08-15 21:54:13.713529253 +0200 +++ /var/tmp/diff_new_pack.MDDfKc/_new 2025-08-15 21:54:13.713529253 +0200 @@ -1,7 +1,7 @@ # # spec file for package micropython-lib # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2025 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: micropython-lib -Version: 1.25.0 +Version: 1.26.0 Release: 0 Summary: Core Python libraries ported to MicroPython License: MIT AND Python-2.0 ++++++ micropython-lib-1.25.0.tar.gz -> micropython-lib-1.26.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/.github/workflows/ruff.yml new/micropython-lib-1.26.0/.github/workflows/ruff.yml --- old/micropython-lib-1.25.0/.github/workflows/ruff.yml 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/.github/workflows/ruff.yml 2025-07-31 16:59:51.000000000 +0200 @@ -6,6 +6,7 @@ runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - run: pip install --user ruff==0.1.2 + # Version should be kept in sync with .pre-commit_config.yaml & also micropython + - run: pip install --user ruff==0.11.6 - run: ruff check --output-format=github . - run: ruff format --diff . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/.pre-commit-config.yaml new/micropython-lib-1.26.0/.pre-commit-config.yaml --- old/micropython-lib-1.25.0/.pre-commit-config.yaml 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/.pre-commit-config.yaml 2025-07-31 16:59:51.000000000 +0200 @@ -8,7 +8,8 @@ verbose: true stages: [commit-msg] - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: v0.1.2 + # Version should be kept in sync with .github/workflows/ruff.yml & also micropython + rev: v0.11.6 hooks: - id: ruff id: ruff-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/aiorepl/aiorepl.py new/micropython-lib-1.26.0/micropython/aiorepl/aiorepl.py --- old/micropython-lib-1.25.0/micropython/aiorepl/aiorepl.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/aiorepl/aiorepl.py 2025-07-31 16:59:51.000000000 +0200 @@ -114,6 +114,8 @@ curs = 0 # cursor offset from end of cmd buffer while True: b = await s.read(1) + if not b: # Handle EOF/empty read + break pc = c # save previous character c = ord(b) pt = t # save previous time @@ -132,7 +134,7 @@ continue if curs: # move cursor to end of the line - sys.stdout.write("\x1B[{}C".format(curs)) + sys.stdout.write("\x1b[{}C".format(curs)) curs = 0 sys.stdout.write("\n") if cmd: @@ -153,15 +155,15 @@ if curs: cmd = "".join((cmd[: -curs - 1], cmd[-curs:])) sys.stdout.write( - "\x08\x1B[K" + "\x08\x1b[K" ) # move cursor back, erase to end of line sys.stdout.write(cmd[-curs:]) # redraw line - sys.stdout.write("\x1B[{}D".format(curs)) # reset cursor location + sys.stdout.write("\x1b[{}D".format(curs)) # reset cursor location else: cmd = cmd[:-1] sys.stdout.write("\x08 \x08") elif c == CHAR_CTRL_A: - await raw_repl(s, g) + raw_repl(sys.stdin, g) break elif c == CHAR_CTRL_B: continue @@ -207,21 +209,21 @@ elif key == "[D": # left if curs < len(cmd) - 1: curs += 1 - sys.stdout.write("\x1B") + sys.stdout.write("\x1b") sys.stdout.write(key) elif key == "[C": # right if curs: curs -= 1 - sys.stdout.write("\x1B") + sys.stdout.write("\x1b") sys.stdout.write(key) elif key == "[H": # home pcurs = curs curs = len(cmd) - sys.stdout.write("\x1B[{}D".format(curs - pcurs)) # move cursor left + sys.stdout.write("\x1b[{}D".format(curs - pcurs)) # move cursor left elif key == "[F": # end pcurs = curs curs = 0 - sys.stdout.write("\x1B[{}C".format(pcurs)) # move cursor right + sys.stdout.write("\x1b[{}C".format(pcurs)) # move cursor right else: # sys.stdout.write("\\x") # sys.stdout.write(hex(c)) @@ -231,7 +233,7 @@ # inserting into middle of line cmd = "".join((cmd[:-curs], b, cmd[-curs:])) sys.stdout.write(cmd[-curs - 1 :]) # redraw line to end - sys.stdout.write("\x1B[{}D".format(curs)) # reset cursor location + sys.stdout.write("\x1b[{}D".format(curs)) # reset cursor location else: sys.stdout.write(b) cmd += b @@ -239,7 +241,7 @@ micropython.kbd_intr(3) -async def raw_paste(s, g, window=512): +def raw_paste(s, window=512): sys.stdout.write("R\x01") # supported sys.stdout.write(bytearray([window & 0xFF, window >> 8, 0x01]).decode()) eof = False @@ -248,7 +250,7 @@ file = b"" while not eof: for idx in range(window): - b = await s.read(1) + b = s.read(1) c = ord(b) if c == CHAR_CTRL_C or c == CHAR_CTRL_D: # end of file @@ -267,7 +269,12 @@ return file -async def raw_repl(s: asyncio.StreamReader, g: dict): +def raw_repl(s, g: dict): + """ + This function is blocking to prevent other + async tasks from writing to the stdio stream and + breaking the raw repl session. + """ heading = "raw REPL; CTRL-B to exit\n" line = "" sys.stdout.write(heading) @@ -276,7 +283,7 @@ line = "" sys.stdout.write(">") while True: - b = await s.read(1) + b = s.read(1) c = ord(b) if c == CHAR_CTRL_A: rline = line @@ -284,7 +291,7 @@ if len(rline) == 2 and ord(rline[0]) == CHAR_CTRL_E: if rline[1] == "A": - line = await raw_paste(s, g) + line = raw_paste(s) break else: # reset raw REPL diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/aiorepl/manifest.py new/micropython-lib-1.26.0/micropython/aiorepl/manifest.py --- old/micropython-lib-1.25.0/micropython/aiorepl/manifest.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/aiorepl/manifest.py 2025-07-31 16:59:51.000000000 +0200 @@ -1,5 +1,5 @@ metadata( - version="0.2.0", + version="0.2.2", description="Provides an asynchronous REPL that can run concurrently with an asyncio, also allowing await expressions.", ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/bluetooth/aioble/aioble/l2cap.py new/micropython-lib-1.26.0/micropython/bluetooth/aioble/aioble/l2cap.py --- old/micropython-lib-1.25.0/micropython/bluetooth/aioble/aioble/l2cap.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/bluetooth/aioble/aioble/l2cap.py 2025-07-31 16:59:51.000000000 +0200 @@ -133,7 +133,6 @@ # Waits until the channel is free and then sends buf. # If the buffer is larger than the MTU it will be sent in chunks. async def send(self, buf, timeout_ms=None, chunk_size=None): - self._assert_connected() offset = 0 chunk_size = min(self.our_mtu * 2, self.peer_mtu, chunk_size or self.peer_mtu) mv = memoryview(buf) @@ -141,6 +140,7 @@ if self._stalled: await self.flush(timeout_ms) # l2cap_send returns True if you can send immediately. + self._assert_connected() self._stalled = not ble.l2cap_send( self._connection._conn_handle, self._cid, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/bluetooth/aioble/examples/l2cap_file_client.py new/micropython-lib-1.26.0/micropython/bluetooth/aioble/examples/l2cap_file_client.py --- old/micropython-lib-1.25.0/micropython/bluetooth/aioble/examples/l2cap_file_client.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/bluetooth/aioble/examples/l2cap_file_client.py 2025-07-31 16:59:51.000000000 +0200 @@ -88,7 +88,7 @@ await self._command(_COMMAND_SEND, path.encode()) - with open(dest, "wb") as f: # noqa: ASYNC101 + with open(dest, "wb") as f: # noqa: ASYNC230 total = 0 buf = bytearray(self._channel.our_mtu) mv = memoryview(buf) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/bluetooth/aioble/examples/l2cap_file_server.py new/micropython-lib-1.26.0/micropython/bluetooth/aioble/examples/l2cap_file_server.py --- old/micropython-lib-1.25.0/micropython/bluetooth/aioble/examples/l2cap_file_server.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/bluetooth/aioble/examples/l2cap_file_server.py 2025-07-31 16:59:51.000000000 +0200 @@ -83,7 +83,7 @@ if send_file: print("Sending:", send_file) - with open(send_file, "rb") as f: # noqa: ASYNC101 + with open(send_file, "rb") as f: # noqa: ASYNC230 buf = bytearray(channel.peer_mtu) mv = memoryview(buf) while n := f.readinto(buf): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/bluetooth/aioble/manifest.py new/micropython-lib-1.26.0/micropython/bluetooth/aioble/manifest.py --- old/micropython-lib-1.25.0/micropython/bluetooth/aioble/manifest.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/bluetooth/aioble/manifest.py 2025-07-31 16:59:51.000000000 +0200 @@ -3,7 +3,7 @@ # code. This allows (for development purposes) all the files to live in the # one directory. -metadata(version="0.6.0") +metadata(version="0.6.1") # Default installation gives you everything. Install the individual # components (or a combination of them) if you want a more minimal install. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/bluetooth/aioble-l2cap/manifest.py new/micropython-lib-1.26.0/micropython/bluetooth/aioble-l2cap/manifest.py --- old/micropython-lib-1.25.0/micropython/bluetooth/aioble-l2cap/manifest.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/bluetooth/aioble-l2cap/manifest.py 2025-07-31 16:59:51.000000000 +0200 @@ -1,4 +1,4 @@ -metadata(version="0.2.0") +metadata(version="0.2.1") require("aioble-core") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/drivers/codec/wm8960/wm8960.py new/micropython-lib-1.26.0/micropython/drivers/codec/wm8960/wm8960.py --- old/micropython-lib-1.25.0/micropython/drivers/codec/wm8960/wm8960.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/drivers/codec/wm8960/wm8960.py 2025-07-31 16:59:51.000000000 +0200 @@ -331,8 +331,7 @@ sysclk = 11289600 else: sysclk = 12288000 - if sysclk < sample_rate * 256: - sysclk = sample_rate * 256 + sysclk = max(sysclk, sample_rate * 256) if mclk_freq is None: mclk_freq = sysclk else: # sysclk_source == SYSCLK_MCLK @@ -691,10 +690,8 @@ def alc_gain(self, target=-12, max_gain=30, min_gain=-17.25, noise_gate=-78): def limit(value, minval, maxval): value = int(value) - if value < minval: - value = minval - if value > maxval: - value = maxval + value = max(value, minval) + value = min(value, maxval) return value target = limit((16 + (target * 2) // 3), 0, 15) @@ -718,8 +715,7 @@ while value > 1: value >>= 1 lb += 1 - if lb > limit: - lb = limit + lb = min(lb, limit) return lb attack = logb(attack / 6, 7) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/drivers/display/lcd160cr/lcd160cr.py new/micropython-lib-1.26.0/micropython/drivers/display/lcd160cr/lcd160cr.py --- old/micropython-lib-1.25.0/micropython/drivers/display/lcd160cr/lcd160cr.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/drivers/display/lcd160cr/lcd160cr.py 2025-07-31 16:59:51.000000000 +0200 @@ -189,10 +189,8 @@ c[3] = h - 1 else: if c[0] == c[2]: - if c[1] < 0: - c[1] = 0 - if c[3] < 0: - c[3] = 0 + c[1] = max(c[1], 0) + c[3] = max(c[3], 0) else: if c[3] < c[1]: c[0], c[2] = c[2], c[0] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/drivers/imu/lsm9ds1/lsm9ds1.py new/micropython-lib-1.26.0/micropython/drivers/imu/lsm9ds1/lsm9ds1.py --- old/micropython-lib-1.25.0/micropython/drivers/imu/lsm9ds1/lsm9ds1.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/drivers/imu/lsm9ds1/lsm9ds1.py 2025-07-31 16:59:51.000000000 +0200 @@ -43,6 +43,7 @@ print("") time.sleep_ms(100) """ + import array from micropython import const diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/drivers/radio/nrf24l01/nrf24l01.py new/micropython-lib-1.26.0/micropython/drivers/radio/nrf24l01/nrf24l01.py --- old/micropython-lib-1.25.0/micropython/drivers/radio/nrf24l01/nrf24l01.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/drivers/radio/nrf24l01/nrf24l01.py 2025-07-31 16:59:51.000000000 +0200 @@ -1,5 +1,4 @@ -"""NRF24L01 driver for MicroPython -""" +"""NRF24L01 driver for MicroPython""" from micropython import const import utime diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/drivers/sensor/hts221/hts221.py new/micropython-lib-1.26.0/micropython/drivers/sensor/hts221/hts221.py --- old/micropython-lib-1.25.0/micropython/drivers/sensor/hts221/hts221.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/drivers/sensor/hts221/hts221.py 2025-07-31 16:59:51.000000000 +0200 @@ -52,7 +52,7 @@ # Set configuration register # Humidity and temperature average configuration - self.bus.writeto_mem(self.slv_addr, 0x10, b"\x1B") + self.bus.writeto_mem(self.slv_addr, 0x10, b"\x1b") # Set control register # PD | BDU | ODR diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/drivers/sensor/lps22h/lps22h.py new/micropython-lib-1.26.0/micropython/drivers/sensor/lps22h/lps22h.py --- old/micropython-lib-1.25.0/micropython/drivers/sensor/lps22h/lps22h.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/drivers/sensor/lps22h/lps22h.py 2025-07-31 16:59:51.000000000 +0200 @@ -37,6 +37,7 @@ print("Pressure: %.2f hPa Temperature: %.2f C"%(lps.pressure(), lps.temperature())) time.sleep_ms(10) """ + import machine from micropython import const diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/espflash/espflash.py new/micropython-lib-1.26.0/micropython/espflash/espflash.py --- old/micropython-lib-1.25.0/micropython/espflash/espflash.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/espflash/espflash.py 2025-07-31 16:59:51.000000000 +0200 @@ -113,22 +113,22 @@ raise Exception(f"Register poll timeout. Addr: 0x{addr:02X} Flag: 0x{flag:02X}.") def _write_slip(self, pkt): - pkt = pkt.replace(b"\xDB", b"\xdb\xdd").replace(b"\xc0", b"\xdb\xdc") - self.uart.write(b"\xC0" + pkt + b"\xC0") + pkt = pkt.replace(b"\xdb", b"\xdb\xdd").replace(b"\xc0", b"\xdb\xdc") + self.uart.write(b"\xc0" + pkt + b"\xc0") self._log(pkt) def _read_slip(self): pkt = None # Find the packet start. - if self.uart.read(1) == b"\xC0": + if self.uart.read(1) == b"\xc0": pkt = bytearray() while True: b = self.uart.read(1) - if b is None or b == b"\xC0": + if b is None or b == b"\xc0": break pkt += b - pkt = pkt.replace(b"\xDB\xDD", b"\xDB").replace(b"\xDB\xDC", b"\xC0") - self._log(b"\xC0" + pkt + b"\xC0", False) + pkt = pkt.replace(b"\xdb\xdd", b"\xdb").replace(b"\xdb\xdc", b"\xc0") + self._log(b"\xc0" + pkt + b"\xc0", False) return pkt def _strerror(self, err): @@ -230,7 +230,7 @@ raise Exception(f"Unexpected flash size bits: 0x{flash_bits:02X}.") flash_size = 2**flash_bits - print(f"Flash size {flash_size/1024/1024} MBytes") + print(f"Flash size {flash_size / 1024 / 1024} MBytes") return flash_size def flash_attach(self): @@ -265,7 +265,7 @@ self.md5sum.update(buf) # The last data block should be padded to the block size with 0xFF bytes. if len(buf) < blksize: - buf += b"\xFF" * (blksize - len(buf)) + buf += b"\xff" * (blksize - len(buf)) checksum = self._checksum(buf) if seq % erase_blocks == 0: # print(f"Erasing {seq} -> {seq+erase_blocks}...") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/lora/examples/reliable_delivery/sender.py new/micropython-lib-1.26.0/micropython/lora/examples/reliable_delivery/sender.py --- old/micropython-lib-1.25.0/micropython/lora/examples/reliable_delivery/sender.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/lora/examples/reliable_delivery/sender.py 2025-07-31 16:59:51.000000000 +0200 @@ -149,7 +149,7 @@ delta = time.ticks_diff(maybe_ack.ticks_ms, sent_at) print( f"ACKed with RSSI {rssi}, {delta}ms after sent " - + f"(skew {delta-ACK_DELAY_MS-ack_packet_ms}ms)" + + f"(skew {delta - ACK_DELAY_MS - ack_packet_ms}ms)" ) if adjust_output_power: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/lora/examples/reliable_delivery/sender_async.py new/micropython-lib-1.26.0/micropython/lora/examples/reliable_delivery/sender_async.py --- old/micropython-lib-1.25.0/micropython/lora/examples/reliable_delivery/sender_async.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/lora/examples/reliable_delivery/sender_async.py 2025-07-31 16:59:51.000000000 +0200 @@ -141,7 +141,7 @@ delta = time.ticks_diff(maybe_ack.ticks_ms, sent_at) print( f"ACKed with RSSI {rssi}, {delta}ms after sent " - + f"(skew {delta-ACK_DELAY_MS-ack_packet_ms}ms)" + + f"(skew {delta - ACK_DELAY_MS - ack_packet_ms}ms)" ) if adjust_output_power: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/lora/lora-sx126x/lora/sx126x.py new/micropython-lib-1.26.0/micropython/lora/lora-sx126x/lora/sx126x.py --- old/micropython-lib-1.25.0/micropython/lora/lora-sx126x/lora/sx126x.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/lora/lora-sx126x/lora/sx126x.py 2025-07-31 16:59:51.000000000 +0200 @@ -596,8 +596,9 @@ pkt_status = self._cmd("B", _CMD_GET_PACKET_STATUS, n_read=4) rx_packet.ticks_ms = ticks_ms - rx_packet.snr = pkt_status[2] # SNR, units: dB *4 - rx_packet.rssi = 0 - pkt_status[1] // 2 # RSSI, units: dBm + # SNR units are dB * 4 (signed) + rx_packet.rssi, rx_packet.snr = struct.unpack("xBbx", pkt_status) + rx_packet.rssi //= -2 # RSSI, units: dBm rx_packet.crc_error = (flags & _IRQ_CRC_ERR) != 0 return rx_packet diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/lora/lora-sx126x/manifest.py new/micropython-lib-1.26.0/micropython/lora/lora-sx126x/manifest.py --- old/micropython-lib-1.25.0/micropython/lora/lora-sx126x/manifest.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/lora/lora-sx126x/manifest.py 2025-07-31 16:59:51.000000000 +0200 @@ -1,3 +1,3 @@ -metadata(version="0.1.4") +metadata(version="0.1.5") require("lora") package("lora") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/examples/actuator.py new/micropython-lib-1.26.0/micropython/senml/examples/actuator.py --- old/micropython-lib-1.25.0/micropython/senml/examples/actuator.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/examples/actuator.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from senml import * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/examples/base.py new/micropython-lib-1.26.0/micropython/senml/examples/base.py --- old/micropython-lib-1.25.0/micropython/senml/examples/base.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/examples/base.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from senml import * import time diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/examples/basic.py new/micropython-lib-1.26.0/micropython/senml/examples/basic.py --- old/micropython-lib-1.25.0/micropython/senml/examples/basic.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/examples/basic.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from senml import * import time diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/examples/basic2.py new/micropython-lib-1.26.0/micropython/senml/examples/basic2.py --- old/micropython-lib-1.25.0/micropython/senml/examples/basic2.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/examples/basic2.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from senml import * import time diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/examples/basic_cbor.py new/micropython-lib-1.26.0/micropython/senml/examples/basic_cbor.py --- old/micropython-lib-1.25.0/micropython/senml/examples/basic_cbor.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/examples/basic_cbor.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from senml import * import time import cbor2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/examples/custom_record.py new/micropython-lib-1.26.0/micropython/senml/examples/custom_record.py --- old/micropython-lib-1.25.0/micropython/senml/examples/custom_record.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/examples/custom_record.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from senml import * import time diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/examples/gateway.py new/micropython-lib-1.26.0/micropython/senml/examples/gateway.py --- old/micropython-lib-1.25.0/micropython/senml/examples/gateway.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/examples/gateway.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from senml import * import time diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/examples/gateway_actuators.py new/micropython-lib-1.26.0/micropython/senml/examples/gateway_actuators.py --- old/micropython-lib-1.25.0/micropython/senml/examples/gateway_actuators.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/examples/gateway_actuators.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from senml import * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/examples/supported_data_types.py new/micropython-lib-1.26.0/micropython/senml/examples/supported_data_types.py --- old/micropython-lib-1.25.0/micropython/senml/examples/supported_data_types.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/examples/supported_data_types.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from senml import * import time diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/senml/__init__.py new/micropython-lib-1.26.0/micropython/senml/senml/__init__.py --- old/micropython-lib-1.25.0/micropython/senml/senml/__init__.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/senml/__init__.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from .senml_base import SenmlBase from .senml_pack import SenmlPack from .senml_record import SenmlRecord diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/senml/senml_pack.py new/micropython-lib-1.26.0/micropython/senml/senml/senml_pack.py --- old/micropython-lib-1.25.0/micropython/senml/senml/senml_pack.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/senml/senml_pack.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from senml.senml_record import SenmlRecord from senml.senml_base import SenmlBase import json diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/senml/senml/senml_record.py new/micropython-lib-1.26.0/micropython/senml/senml/senml_record.py --- old/micropython-lib-1.25.0/micropython/senml/senml/senml_record.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/senml/senml/senml_record.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - import binascii from senml.senml_base import SenmlBase diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/urllib.urequest/manifest.py new/micropython-lib-1.26.0/micropython/urllib.urequest/manifest.py --- old/micropython-lib-1.25.0/micropython/urllib.urequest/manifest.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/urllib.urequest/manifest.py 2025-07-31 16:59:51.000000000 +0200 @@ -1,4 +1,4 @@ -metadata(version="0.7.0") +metadata(version="0.8.0") # Originally written by Paul Sokolovsky. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/urllib.urequest/urllib/urequest.py new/micropython-lib-1.26.0/micropython/urllib.urequest/urllib/urequest.py --- old/micropython-lib-1.25.0/micropython/urllib.urequest/urllib/urequest.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/micropython/urllib.urequest/urllib/urequest.py 2025-07-31 16:59:51.000000000 +0200 @@ -1,7 +1,7 @@ import socket -def urlopen(url, data=None, method="GET"): +def urlopen(url, data=None, method="GET", headers={}): if data is not None and method == "GET": method = "POST" try: @@ -40,6 +40,12 @@ s.write(host) s.write(b"\r\n") + for k in headers: + s.write(k) + s.write(b": ") + s.write(headers[k]) + s.write(b"\r\n") + if data: s.write(b"Content-Length: ") s.write(str(len(data))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/utop/README.md new/micropython-lib-1.26.0/micropython/utop/README.md --- old/micropython-lib-1.25.0/micropython/utop/README.md 1970-01-01 01:00:00.000000000 +0100 +++ new/micropython-lib-1.26.0/micropython/utop/README.md 2025-07-31 16:59:51.000000000 +0200 @@ -0,0 +1,12 @@ +# utop + +Provides a top-like live overview of the running system. + +On the `esp32` port this depends on the `esp32.idf_task_info()` function, which +can be enabled by adding the following lines to the board `sdkconfig`: + +```ini +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y +CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y +``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/utop/manifest.py new/micropython-lib-1.26.0/micropython/utop/manifest.py --- old/micropython-lib-1.25.0/micropython/utop/manifest.py 1970-01-01 01:00:00.000000000 +0100 +++ new/micropython-lib-1.26.0/micropython/utop/manifest.py 2025-07-31 16:59:51.000000000 +0200 @@ -0,0 +1,6 @@ +metadata( + version="0.1.0", + description="Provides a top-like live overview of the running system.", +) + +module("utop.py") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/micropython/utop/utop.py new/micropython-lib-1.26.0/micropython/utop/utop.py --- old/micropython-lib-1.25.0/micropython/utop/utop.py 1970-01-01 01:00:00.000000000 +0100 +++ new/micropython-lib-1.26.0/micropython/utop/utop.py 2025-07-31 16:59:51.000000000 +0200 @@ -0,0 +1,109 @@ +import micropython +import time + +try: + import esp32 + import _thread +except ImportError: + esp32 = None + + +def top(update_interval_ms=1000, timeout_ms=None, thread_names={}): + time_start = time.ticks_ms() + previous_total_runtime = None + previous_task_runtimes = {} + previous_line_count = 0 + esp32_task_state_names = dict( + enumerate(("running", "ready", "blocked", "suspended", "deleted", "invalid")) + ) + + while timeout_ms is None or abs(time.ticks_diff(time.ticks_ms(), time_start)) < timeout_ms: + if previous_line_count > 0: + print("\x1b[{}A".format(previous_line_count), end="") + line_count = 0 + + if esp32 is not None: + if not hasattr(esp32, "idf_task_info"): + print( + "INFO: esp32.idf_task_info() is not available, cannot list active tasks.\x1b[K" + ) + line_count += 1 + else: + print(" CPU% CORE PRIORITY STATE STACKWATERMARK NAME\x1b[K") + line_count += 1 + + total_runtime, tasks = esp32.idf_task_info() + current_thread_id = _thread.get_ident() + tasks.sort(key=lambda t: t[0]) + for ( + task_id, + task_name, + task_state, + task_priority, + task_runtime, + task_stackhighwatermark, + task_coreid, + ) in tasks: + task_runtime_percentage = "-" + if ( + total_runtime != previous_total_runtime + and task_id in previous_task_runtimes + ): + task_runtime_percentage = "{:.2f}%".format( + 100 + * ((task_runtime - previous_task_runtimes[task_id]) & (2**32 - 1)) + / ((total_runtime - previous_total_runtime) & (2**32 - 1)) + ) + print( + "{:>7} {:>4} {:>8d} {:<9} {:<14d} {}{}\x1b[K".format( + task_runtime_percentage, + "-" if task_coreid is None else task_coreid, + task_priority, + esp32_task_state_names.get(task_state, "unknown"), + task_stackhighwatermark, + thread_names.get(task_id, task_name), + " (*)" if task_id == current_thread_id else "", + ) + ) + line_count += 1 + + previous_task_runtimes[task_id] = task_runtime + previous_total_runtime = total_runtime + else: + print("INFO: Platform does not support listing active tasks.\x1b[K") + line_count += 1 + + print("\x1b[K") + line_count += 1 + print("MicroPython ", end="") + micropython.mem_info() + line_count += 3 + + if esp32 is not None: + print("\x1b[K") + line_count += 1 + for name, cap in (("data", esp32.HEAP_DATA), ("exec", esp32.HEAP_EXEC)): + heaps = esp32.idf_heap_info(cap) + print( + "IDF heap ({}): {} regions, {} total, {} free, {} largest contiguous, {} min free watermark\x1b[K".format( + name, + len(heaps), + sum((h[0] for h in heaps)), + sum((h[1] for h in heaps)), + max((h[2] for h in heaps)), + sum((h[3] for h in heaps)), + ) + ) + line_count += 1 + + if previous_line_count > line_count: + for _ in range(previous_line_count - line_count): + print("\x1b[K") + print("\x1b[{}A".format(previous_line_count - line_count), end="") + + previous_line_count = line_count + + try: + time.sleep_ms(update_interval_ms) + except KeyboardInterrupt: + break diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/pyproject.toml new/micropython-lib-1.26.0/pyproject.toml --- old/micropython-lib-1.25.0/pyproject.toml 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/pyproject.toml 2025-07-31 16:59:51.000000000 +0200 @@ -64,7 +64,7 @@ "ISC003", # micropython does not support implicit concatenation of f-strings "PIE810", # micropython does not support passing tuples to .startswith or .endswith "PLC1901", - "PLR1701", + "PLR1704", # sometimes desirable to redefine an argument to save code size "PLR1714", "PLR5501", "PLW0602", @@ -72,6 +72,7 @@ "PLW2901", "RUF012", "RUF100", + "SIM101", "W191", # tab-indent, redundant when using formatter ] line-length = 99 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-ecosys/aiohttp/aiohttp/__init__.py new/micropython-lib-1.26.0/python-ecosys/aiohttp/aiohttp/__init__.py --- old/micropython-lib-1.25.0/python-ecosys/aiohttp/aiohttp/__init__.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-ecosys/aiohttp/aiohttp/__init__.py 2025-07-31 16:59:51.000000000 +0200 @@ -42,7 +42,9 @@ return data async def read(self, sz=-1): - return self._decode(await self.content.read(sz)) + return self._decode( + await (self.content.read(sz) if sz == -1 else self.content.readexactly(sz)) + ) async def text(self, encoding="utf-8"): return (await self.read(int(self._get_header("content-length", -1)))).decode(encoding) @@ -66,13 +68,13 @@ self.chunk_size = int(l, 16) if self.chunk_size == 0: # End of message - sep = await self.content.read(2) + sep = await self.content.readexactly(2) assert sep == b"\r\n" return b"" - data = await self.content.read(min(sz, self.chunk_size)) + data = await self.content.readexactly(min(sz, self.chunk_size)) self.chunk_size -= len(data) if self.chunk_size == 0: - sep = await self.content.read(2) + sep = await self.content.readexactly(2) assert sep == b"\r\n" return self._decode(data) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-ecosys/aiohttp/aiohttp/aiohttp_ws.py new/micropython-lib-1.26.0/python-ecosys/aiohttp/aiohttp/aiohttp_ws.py --- old/micropython-lib-1.25.0/python-ecosys/aiohttp/aiohttp/aiohttp_ws.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-ecosys/aiohttp/aiohttp/aiohttp_ws.py 2025-07-31 16:59:51.000000000 +0200 @@ -189,7 +189,7 @@ await self.send(b"", self.CLOSE) async def _read_frame(self): - header = await self.reader.read(2) + header = await self.reader.readexactly(2) if len(header) != 2: # pragma: no cover # raise OSError(32, "Websocket connection closed") opcode = self.CLOSE @@ -197,13 +197,13 @@ return opcode, payload fin, opcode, has_mask, length = self._parse_frame_header(header) if length == 126: # Magic number, length header is 2 bytes - (length,) = struct.unpack("!H", await self.reader.read(2)) + (length,) = struct.unpack("!H", await self.reader.readexactly(2)) elif length == 127: # Magic number, length header is 8 bytes - (length,) = struct.unpack("!Q", await self.reader.read(8)) + (length,) = struct.unpack("!Q", await self.reader.readexactly(8)) if has_mask: # pragma: no cover - mask = await self.reader.read(4) - payload = await self.reader.read(length) + mask = await self.reader.readexactly(4) + payload = await self.reader.readexactly(length) if has_mask: # pragma: no cover payload = bytes(x ^ mask[i % 4] for i, x in enumerate(payload)) return opcode, payload diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-ecosys/aiohttp/manifest.py new/micropython-lib-1.26.0/python-ecosys/aiohttp/manifest.py --- old/micropython-lib-1.25.0/python-ecosys/aiohttp/manifest.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-ecosys/aiohttp/manifest.py 2025-07-31 16:59:51.000000000 +0200 @@ -1,6 +1,6 @@ metadata( description="HTTP client module for MicroPython asyncio module", - version="0.0.5", + version="0.0.6", pypi="aiohttp", ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-ecosys/cbor2/cbor2/__init__.py new/micropython-lib-1.26.0/python-ecosys/cbor2/cbor2/__init__.py --- old/micropython-lib-1.25.0/python-ecosys/cbor2/cbor2/__init__.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-ecosys/cbor2/cbor2/__init__.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - from ._decoder import CBORDecoder from ._decoder import load from ._decoder import loads diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-ecosys/cbor2/cbor2/_decoder.py new/micropython-lib-1.26.0/python-ecosys/cbor2/cbor2/_decoder.py --- old/micropython-lib-1.25.0/python-ecosys/cbor2/cbor2/_decoder.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-ecosys/cbor2/cbor2/_decoder.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - import io import struct diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-ecosys/cbor2/cbor2/_encoder.py new/micropython-lib-1.26.0/python-ecosys/cbor2/cbor2/_encoder.py --- old/micropython-lib-1.25.0/python-ecosys/cbor2/cbor2/_encoder.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-ecosys/cbor2/cbor2/_encoder.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - import io import struct diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-ecosys/cbor2/examples/cbor_test.py new/micropython-lib-1.26.0/python-ecosys/cbor2/examples/cbor_test.py --- old/micropython-lib-1.25.0/python-ecosys/cbor2/examples/cbor_test.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-ecosys/cbor2/examples/cbor_test.py 2025-07-31 16:59:51.000000000 +0200 @@ -23,7 +23,6 @@ THE SOFTWARE. """ - import cbor2 input = [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-stdlib/abc/abc.py new/micropython-lib-1.26.0/python-stdlib/abc/abc.py --- old/micropython-lib-1.25.0/python-stdlib/abc/abc.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-stdlib/abc/abc.py 2025-07-31 16:59:51.000000000 +0200 @@ -1,2 +1,6 @@ +class ABC: + pass + + def abstractmethod(f): return f diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-stdlib/abc/manifest.py new/micropython-lib-1.26.0/python-stdlib/abc/manifest.py --- old/micropython-lib-1.25.0/python-stdlib/abc/manifest.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-stdlib/abc/manifest.py 2025-07-31 16:59:51.000000000 +0200 @@ -1,3 +1,3 @@ -metadata(version="0.0.1") +metadata(version="0.1.0") module("abc.py") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-stdlib/errno/errno.py new/micropython-lib-1.26.0/python-stdlib/errno/errno.py --- old/micropython-lib-1.25.0/python-stdlib/errno/errno.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-stdlib/errno/errno.py 2025-07-31 16:59:51.000000000 +0200 @@ -34,5 +34,6 @@ ERANGE = 34 # Math result not representable EAFNOSUPPORT = 97 # Address family not supported by protocol ECONNRESET = 104 # Connection timed out +ENOTCONN = 107 # Not connected ETIMEDOUT = 110 # Connection timed out EINPROGRESS = 115 # Operation now in progress diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-stdlib/errno/manifest.py new/micropython-lib-1.26.0/python-stdlib/errno/manifest.py --- old/micropython-lib-1.25.0/python-stdlib/errno/manifest.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-stdlib/errno/manifest.py 2025-07-31 16:59:51.000000000 +0200 @@ -1,3 +1,3 @@ -metadata(version="0.1.4") +metadata(version="0.2.0") module("errno.py") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-stdlib/logging/logging.py new/micropython-lib-1.26.0/python-stdlib/logging/logging.py --- old/micropython-lib-1.25.0/python-stdlib/logging/logging.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-stdlib/logging/logging.py 2025-07-31 16:59:51.000000000 +0200 @@ -202,8 +202,8 @@ getLogger().critical(msg, *args) -def exception(msg, *args): - getLogger().exception(msg, *args) +def exception(msg, *args, exc_info=True): + getLogger().exception(msg, *args, exc_info=exc_info) def shutdown(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/python-stdlib/logging/manifest.py new/micropython-lib-1.26.0/python-stdlib/logging/manifest.py --- old/micropython-lib-1.25.0/python-stdlib/logging/manifest.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/python-stdlib/logging/manifest.py 2025-07-31 16:59:51.000000000 +0200 @@ -1,3 +1,3 @@ -metadata(version="0.6.1") +metadata(version="0.6.2") module("logging.py") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/micropython-lib-1.25.0/tools/verifygitlog.py new/micropython-lib-1.26.0/tools/verifygitlog.py --- old/micropython-lib-1.25.0/tools/verifygitlog.py 2025-04-14 02:26:38.000000000 +0200 +++ new/micropython-lib-1.26.0/tools/verifygitlog.py 2025-07-31 16:59:51.000000000 +0200 @@ -49,7 +49,7 @@ def diagnose_subject_line(subject_line, subject_line_format, err): - err.error("Subject line: " + subject_line) + err.error('Subject line: "' + subject_line + '"') if not subject_line.endswith("."): err.error('* must end with "."') if not re.match(r"^[^!]+: ", subject_line): @@ -98,20 +98,47 @@ if len(subject_line) >= 73: err.error("Subject line must be 72 or fewer characters: " + subject_line) + # Do additional checks on the prefix of the subject line. + verify_subject_line_prefix(subject_line.split(": ")[0], err) + # Second one divides subject and body. if len(raw_body) > 1 and raw_body[1]: err.error("Second message line must be empty: " + raw_body[1]) # Message body lines. for line in raw_body[2:]: - # Long lines with URLs are exempt from the line length rule. - if len(line) >= 76 and "://" not in line: + # Long lines with URLs or human names are exempt from the line length rule. + if len(line) >= 76 and not ( + "://" in line + or line.startswith("Co-authored-by: ") + or line.startswith("Signed-off-by: ") + ): err.error("Message lines should be 75 or less characters: " + line) if not raw_body[-1].startswith("Signed-off-by: ") or "@" not in raw_body[-1]: err.error('Message must be signed-off. Use "git commit -s".') +def verify_subject_line_prefix(prefix, err): + ext = (".c", ".h", ".cpp", ".js", ".rst", ".md") + + if prefix.startswith((".", "/")): + err.error('Subject prefix cannot begin with "." or "/".') + + if prefix.endswith("/"): + err.error('Subject prefix cannot end with "/".') + + if prefix.startswith("ports/"): + err.error( + 'Subject prefix cannot begin with "ports/", start with the name of the port instead.' + ) + + if prefix.endswith(ext): + err.error( + "Subject prefix cannot end with a file extension, use the main part of the filename without the extension." + ) + + def run(args): verbose("run", *args)