Upgrade to release 2.15.1:
- Accept trailing Base64URL = padding when decoding JWS segments,
so tokens issued by AWS ALB and similar systems verify instead of
raising DecodeError: Invalid crypto padding. Non-alphabet junk
such as !!!! remains rejected
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 16.0.0:
- BREAKING: Use the Self type introduced in Python 3.11
Error handling improvements:
- Avoid logging callback failures when queued executor handlers
are canceled
Documentation improvements:
- Add Args, Returns and Raises sections to public docstrings
- AGENTS.md file for AI coding assistant guidance
Local development changes:
- Type check with both pyright and mypy by default
- Remove tox test matrix, leaning on Github Actions
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 7.48.0:
- Expose more CURLOPT_SSL_OPTIONS (patch by Scott Talbert)
- Read long description from README.rst instead of duplicating it
in setup.py (patch by Scott Talbert)
- Fix test_redir_protocols_setopt (patch by Scott Talbert)
- Add CURL_LOCK_DATA_HSTS as a CurlShare option (patch by Scott
Talbert)
- Add libpsl support to vcpkg installs for CI and wheel builds
(patch by Scott Talbert)
- Configure nuget repo access as read-only from PRs (patch by Scott
Talbert)
- Officially change project URL to https://pycurl.github.io/ (patch
by Scott Talbert)
- Replace bare except clauses in examples with specific exception
types (patch by Kotesh Kumar Yelamati)
- Add HTTP/3 support in libcurl wheel (patch by Will Noble)
- Fix segfault when calling duphandle() on a closed Curl handle
(patch by Jorge Rocamora)
- Fix abort on non-text string arguments (patch by Jorge Rocamora)
- Fix CurlShare leak when close() detaches attached handles (patch
by Jorge Rocamora)
- Document that views derived from the callback memoryview are not
released (patch by Jorge Rocamora)
- Fix crash when duplicating a handle that uses set_ca_certs()
(patch by Jorge Rocamora)
- Add CurlUrl object wrapping libcurl's URL API, with CURLOPT_CURLU
support (patch by Jorge Rocamora)
- Fix callback exceptions being replaced by SystemError (patch by
Jorge Rocamora)
- Fix test guard silently passing on real libcurl errors (patch by
Jorge Rocamora)
- Update the docstring and manifest source lists (patch by Jorge
Rocamora)
- Refuse pause() from a thread other than the performing one (patch
by Jorge Rocamora)
- Add support for Python 3.15 (patch by Scott Talbert)
- Refuse integers for blob options instead of crashing (patch by
Jorge Rocamora)
- Accept buffer objects for blob options (patch by Jorge Rocamora)
- Release all httppost encoded values and unset the form before
MIMEPOST (patch by Jorge Rocamora)
- Reject callback return values that do not fit in an int (patch by
Jorge Rocamora)
- Clear CurlMulti callbacks before deallocating attached handles
(patch by Eric Buehl)
- Serve the test apps from a threaded WSGI server (patch by Jorge
Rocamora)
- Add support for missing CURL options (patch by Khavish Anshudass
Bhundoo)
- Add CURLOPT_SSL_EC_CURVES & CURLOPT_SSL_SIGNATURE_ALGORITHMS
options (patch by Khavish Anshudass Bhundoo)
- Remove unused variable from do_curl_setopt_httppost (patch by
Scott Talbert)
- test: silence WSGI test server access logging to stderr (patch by
Scott Talbert)
- test: pin down oversized mime data_cb error assertions (patch by
Scott Talbert)
- Give vendored OpenSSL a private OPENSSLDIR on Linux manylinux
wheels (patch by Scott Talbert)
- Enable -Werror for the pycurl build in cibuildwheel without
affecting vcpkg (patch by Scott Talbert)
- Handle libcurl options deprecated in 8.22.0 (patch by Scott
Talbert)
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 2.15.0:
- Improve performance of module_imports_on_top_of_file.
- Improve performance of python_3000_invalid_escape_sequence.
- Improve performacne of missing_whitespace_after_keyword.
- Drop EOL python 3.9.
- Add support for python 3.15.
- Fix loading unrelated configuration due to commonprefix.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 7.36.2:
- Detects single-crate cross-file symbol collisions and
conditionally emits crate-root re-exports.
- Prepend the file module name to Rust type paths to use canonical
paths.
- Expose generated per-file Rust proto modules as public.
- Include .c files in the source_files glob in upb/port/BUILD
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 2.6.3:
- IntervalDict.update and __init__ behave like dict.update when the
provided intervals overlap (the last provided value wins).
- IntervalDict.pop accepts None as default value.
- Fix from_string accepting prefix (re.match) instead of full value
(re.fullmatch) for infinities.
- Documentation of iterate explicitly states that base should be
side-effect-free.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 1.22.4:
- Account for the capture groups %z adds to the generated pattern
- Reject out-of-range timezone minutes
- Document the extra_types conversion mapping
- Fix case-sensitive am/pm and Zulu conversion under
case-insensitive matching
- Resolve year-less strftime formats against the current year
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 2.17:
- Added support for DateTimePatternGenerator.getDefaultHourCycle()
and enums
- Added missing wrappers for UDateFormatField
- Added support for ICU 79.1
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 3.5.3:
- Close the storage connection before forking process workers, this
just simplifies things.
- Run the callback of an empty chord with an empty results list.
Previously it was never enqueued.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 4.3.1:
- Fix type-check failures with ty 0.0.87
- Exclude .DS_Store from release
- Route annotated command help through the application output
stream
- Add example embedding a cmd2 app in a Textual app with
textual-tty
- Add example embedding a cmd2 app in a Textual app with
textual-tty
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 7.2.5:
- Fix @cachedmethod with condition for decorated methods taking a
pending keyword argument (broken since v7.0.0).
- Fix pickling and deep-copying of instances using @cachedmethod
(broken since v7.0.0).
- Fix calling @cachedmethod decorated methods through the class
with the receiver (self) passed as a keyword argument (broken
since v7.2.4).
- Various documentation improvements.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 3.13.0:
- It is now possible to nest ThreadSensitiveContext by providing an
explicit executor for thread-sensitive tasks. This enables moving
a block of such work away from the parent context's shared worker.
The provided executor must run work sequentially and on a single
thread, as per ThreadPoolExecutor(max_workers=1), and the calling
code is responsible for managing the executor's lifecycle.
- Local attribute access is now 2-3x faster. Local(...) now uses one
of two internal specialisations, selected by thread_critical,
instead of checking the mode on every access.
As a result Local is now marked @final and raises TypeError if
subclassed. Subclassing was never supported, and could not have
worked correctly with the specialised implementations.
- asgiref.timeout.timeout is deprecated, and will be removed in a
future release. Move to use asyncio.timeout() instead.
- Added support for Python 3.15.
- Dropped support for EOL Python 3.10.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
pyproject.toml specifies setuptools.build_meta as the build backend, so
inherit python_setuptools_build_meta instead of setuptools3.
Fixes:
QA Issue: inherits setuptools3 but has pyproject.toml specifying backend
setuptools.build_meta, use the correct class [pep517-backend]
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
- Recognize timezone file names with multiple slashes in the TZ environment
variable.
- Use HTTPS in place of FTP to retrieve tzdata archive.
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
simple-websocket is the only hard dependency in pyproject.toml, and the
default threading async mode uses it for WebSocket connections. The
threading driver and the client also import queue (python3-threading),
and the client imports ssl (python3-io).
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Simple WebSocket server and client for Python, built on wsproto.
Backport the upstream conversion of the async tests to pytest-asyncio;
the 1.1.0 tests call asyncio.get_event_loop(), which fails on Python
3.14 when there is no current event loop. Add it to the fast ptest list;
all 47 tests pass on qemuriscv64.
AI-Generated: Uses Claude Code
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Changelog:
* Drop Python 2 support; require Python 3.5+
* Remove the module-level names INT_TYPES, STR_TYPES and xrange
* Add inline type annotations; IPy is now a package that ships py.typed
* Fix IP.broadcast() returning an IPv4 address for IPv6 networks
* Fix IP.reverseName() for 0.0.0.0/0
* Fix the flaky IPSet fuzz test
The fuzz test fix stops the intermittent ptest failure in
TestIPSet.testRandomContains, whose oracle ignored that IPSet merges
adjacent prefixes into a larger one.
The sdist is now named ipy-1.2.tar.gz, so drop PYPI_PACKAGE_SDIST.
AI-Generated: Uses Claude Code
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
The test expects a message sent from another thread 0.2s later to arrive
within a 0.5s poll window, which a loaded test host misses. Upstream
marks it flaky(reruns=3), but pytest-rerunfailures is not available.
Adjust the musl sed to the new end of the -k expression.
AI-Generated: Uses Claude Code
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
test_async_cat_file_ranges fetches a file from a public S3 bucket, which
fails without DNS and internet access on the target, as in sysvinit
qemu images where resolv.conf is empty.
AI-Generated: Uses Claude Code
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 10.17.0:
- Added {class}pikepdf.ObjectSet, which records the objects that a
walk of a PDF's object graph has already visited. Objects in a
PDF are shared and may refer back to their ancestors, so a search
that only limits its depth can take exponential time on quite
ordinary files. ObjectSet.add() reports whether an object is new,
and tells apart direct objects and objects of different Pdf,
which a set of objgen cannot. See {ref}walking-object-graphs.
- Added {meth}pikepdf.Object.is_same_object_as, which tests whether
two references lead to the same object. Neither is, == nor
comparing objgen answers this reliably.
- Added {meth}pikepdf.Pdf.content_scopes and
{meth}pikepdf.Page.content_scopes, which iterate over every
content stream that pages can draw, each with the resource
dictionary it uses: the page itself, form XObjects, annotation
appearance streams, tiling patterns, Type 3 glyph procedures and
soft masks, however they are nested or shared. This is the way to
find every font, image or colour space a document uses. Each
{class}pikepdf.ContentScope is reported once for the document;
pages= selects pages and kinds= selects what is reported.
- Added {meth}pikepdf.Page.get_resources, which returns the
resources of a page or form XObject for reading. Unlike
{attr}pikepdf.Page.resources, it finds resources inherited from
the page tree, does not create an empty dictionary when there are
none, and returns None instead of raising when /Resources is
malformed.
- Fixed comparing two objects with == taking exponential time when
the objects being compared share children, such as the same file
opened twice. Each pair of objects is now compared once.
- Fixed {meth}pikepdf.Pdf.add_pages_from hanging on a page with an
action whose /Next actions are shared or form a loop.
- Fixed {meth}pikepdf.Pdf.open_outline reading only the first item
at each level of an outline whose items are direct objects. Such
items are now made indirect when the outline is saved, as the PDF
specification requires.
- Reading a stream that will not decode now raises
{exc}~pikepdf.exceptions.DataDecodingError with the reason,
whether the stream's data was read from a file or set from
memory. Previously a stream read from a file raised a
{exc}~pikepdf.exceptions.PdfError that said only "read_bytes
called on unfilterable stream", and the reason was available only
from {meth}pikepdf.Pdf.get_warnings. DataDecodingError is a
PdfError, so existing handlers are unaffected.
- An exception raised by a JBIG2 decoder now reaches the caller of
{meth}pikepdf.PdfImage.as_pil_image,
{meth}pikepdf.PdfImage.extract_to and
{meth}pikepdf.PdfImage.read_bytes unchanged, with its own type,
message and traceback. Previously, for an image read from a file,
it was replaced by a generic DataDecodingError or PdfError.
- Added {exc}~pikepdf.exceptions.QpdfRuntimeError, raised for
errors from qpdf that pikepdf has no more specific exception for.
These were previously raised as a bare RuntimeError, which except
pikepdf.PikepdfError did not catch. The new exception derives
from both {exc}~pikepdf.exceptions.PikepdfError and RuntimeError,
so handlers written for RuntimeError still work.
- The empty name / is now supported. The PDF 1.7 and 2.0
specifications define a lone slash as a valid name made of zero
characters, but pikepdf.Name('/') raised ValueError, and
dictionaries refused / as a key. This broke
{meth}pikepdf.Pdf.add_pages_from on files with an empty-named
destination such as /Dests << / 3 0 R >>. Such names can now be
created, used as dictionary keys, and migrated during page
copying. bool(Name('/')) is False, like an empty
{class}pikepdf.String. Name(''), which lacks the leading slash,
is still rejected. PDF/A does not forbid empty names, and the
PDF/A validator accepts them.
- AcroFormField.get_inheritable_field_value_as_name() now returns a
{class}pikepdf.Name, as documented, instead of a str. When the
value is missing or not a name, it returns the empty name
Name('/'), which is falsy, instead of ''. Comparisons such as ==
'/Tx' are unaffected.
- Fixed an out-of-bounds read when opening a PDF from a Python file
object whose readinto() reports more bytes than were requested.
This now raises ValueError, as writing to such a stream already
did. Non-blocking streams, whose readinto() returns None, now
raise ValueError instead of hanging.
- Fixed building from source on PyPy, which failed to compile since
v10.0. PyPy now reads Python file objects through readinto(),
like CPython, instead of copying the result of read().
- {func}pikepdf.open reads directly from the file descriptor when
given a filename, instead of calling the seek() and readinto()
methods of a Python file object for every read. Opening and
reading a large file with many objects is about four to five
times faster, matching the speed of memory mapping
(access_mode=AccessMode.mmap). Streams passed to
{func}pikepdf.open, including plain file objects, are read
through their methods as before.
- Documented {class}pikepdf.TokenFilter with worked examples that
shorten numbers and convert RGB colors to grayscale, and
explained when to use a token filter instead of
{func}pikepdf.parse_content_stream. The API reference no longer
says that the parser should not be used to edit content streams.
The TokenFilter.handle_token documentation now says correctly
that exceptions it raises propagate to the caller.
Extend RDEPENDS with the missing runtime dependencies
python3-fonttools and python3-jsonschema which are required
to import pikepdf.pdfa.
Install pdfa_differential.py to pass the tests from
test_pdfa_differential.py. Fixes:
E ModuleNotFoundError: No module named 'pdfa_differential'
This work was sponsored by GOVCERT.LU.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Upgrade to release 9.1.0:
- Removed support for Python 3.10, now end-of-life.
- Where a path supplies more than one metadata directory for a
distribution, as an interrupted or unclean upgrade may leave
behind, discovery now prefers the greater one by reverse
lexicographic ordering of the directory names, so the stale
metadata no longer shadows the version in use.
- A missing required metadata field (Name or Version) now raises a
KeyError that names the field and identifies the distribution,
which PathDistribution renders as its metadata path.
- Restored lazy validation of EntryPoint.value, deferring the
ValueError for an invalid value until a component is accessed or
the entry point is loaded, so one malformed entry point no longer
prevents entry points in other groups from being selected.
- importlib_metadata.diagnose no longer crashes on a metadata
directory that has no metadata file or whose metadata declares no
name. Such distributions are now reported by their location.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 2.5.0:
- imgtool now requires Python 3.8 or later. This also fixes key
export commands, which failed on Python 3.8 and 3.9.
- Added imgtool keyinfo, which reports whether a PEM file holds a
key pair or only a public key. With --require, it fails if the
kind does not match, which build systems can use as a check.
- Added --name-suffix to imgtool getpub and imgtool getpubhash,
which appends a suffix to the generated C or Rust symbol names so
that several keys can be embedded in one image.
- Public-key-only PEM files are now supported by imgtool getpub,
imgtool getpubhash and imgtool verify. imgtool sign given a
public-only PEM now fails with a clear error.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 2.16.0:
Changed:
- Look up only the cookie domains that match the request host, and
skip the expired cookie sweep until a cookie is due. With 1,000
cookies across 500 domains, building the Cookie header is about
18 times faster. Cookies from different domains are now sent from
the least to the most specific domain.
Fixed:
- Reuse the client cookie jar instead of copying it on every
request and redirect. A custom policy set with
client.cookies.jar.set_policy() now applies to outgoing requests
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 7.17.0:
- Dropped support for Python 3.10.
- Binary wheels are now provided for iOS and Android. This allows
the use of the optimized C tracer on mobile platforms.
- Fix: three or more levels of nested with statements could make a
with line look like a branch with an exit that can never happen.
Using the sys.monitoring core, these phantom branches were
reported as partial. Other cores hid the problem but still
counted the phantom branches in the total.
- Fix: a comment or string that merely mentioned if True: or while
True: could mark its line as a branch that is known to be
partial, so a branch that never ran was reported as taken. These
built-in patterns now only match at the start of the statement.
- Fix: region detection missed functions defined in unusual places,
such as else and except clauses. This is now fixed.
- Fix: recent versions of the lcov tool complain if the same
function name appears more than once in a report. Python can have
multiple same-named functions in a few ways, for example,
getters/setters or conditionally defined functions. These are now
disambiguated by adding a @<line number> suffix to the function
name.
- Fix: The "Can't combine statement coverage data with branch data"
error now names the two data files it couldn’t combine. The error
description in the docs now lists common causes and how to find
the process that wrote the file.
- Fix: at coverage totals close to 0 or 100, the XML report could
get incorrect line-rate values like 8.333e-05 or 1. This is now
fixed.
- Fix: a parallel data file saved more than once kept the hash of
its first save in its file name. Combining could then skip it as
a duplicate of another file that had the same data at that point,
and delete it, losing the data recorded after the first save.
Each save now updates the hash. This had been a problem since
7.13.1.
- Fixes for obscure but legal file names:
- File names (and plugin names) can contain control characters,
which are legal in POSIX paths but unsafe in reports: in XML
1.0 they make the document non-well-formed, and in a terminal
they act as escape sequences (colors, title/clipboard
sequences, cursor moves that forge output). Now the XML report,
the text and Markdown summary reports, and coverage debug data
replace non-printable characters in names. Printable names are
unchanged.
- A file pattern (from include, omit, or a [paths] alias)
containing a newline sent the glob-to-regex translation into an
infinite loop, hanging the process. Newlines in patterns are
now handled like any other character.
- Fixes in the implementation of the C tracer:
- If a plugin’s dynamic_source_filename method raised an
exception, lines in that function could be recorded as
belonging to a different file. Also fixed some minor memory
leaks in the C tracer.
- The refcount of None was mismanaged during function calls,
including comprehensions. This was unlikely to cause an actual
problem, but is now fixed. Thanks, Andrew Dalke.
- The C tracer held borrowed references to dictionary values,
which was unsafe on free-threaded Python. Now it takes its own
references.
- An internal error while recording a new file could be reported
as a confusing SystemError instead of the actual exception.
- Performance: the text summary report (coverage report) held on to
every file’s parsed source until it finished, so its memory use
grew with the size of the project: ten times or more what 7.14
used on large projects. Now it keeps only what it needs to print.
- Performance: HTML reports should be about 5% faster to produce.
- Kept the political banner in the README.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 26.10.2:
- Fix reading the TLS peer certificate
(TransportDetails.peer_cert) with pyOpenSSL 26.2.0 and later:
autobahn.twisted.util.extract_peer_certificate() raised
AttributeError: 'X509' object has no attribute 'get_extension'
for every certificate with extensions, as pyOpenSSL removed its
X.509 extension API (and deprecates the rest of its X509 API).
The certificate is now read with cryptography, in the new
backend-neutral autobahn.util.peer_certificate_details(), which
also never raises on certificate content it cannot parse (it is
peer data, read before authentication): extensions, or a subject
or issuer, that cannot be read are left empty. The peer_cert dict
keeps its keys and formats, except: ⚠ extensions[].value was
OpenSSL's text; a subject or issuer alternative name is still
given as OpenSSL prints it (DNS:localhost, IP Address:127.0.0.1),
other extensions now as cryptography prints them; and
signature_algorithm is ed25519 instead of ED25519 for Ed25519
certificates
- Fix the TLS peer certificate never being available on Twisted
WebSocket and RawSocket connections: it was read when the TCP
connection was made, before the TLS handshake, and so was always
None. It is now read when the TLS handshake is complete, together
with the TLS channel ID. With this, TLS client certificate
authentication (Crossbar.io authmethod tls, and dynamic
authenticators reading transport.peer_cert) works again
- Fix asyncio: fill TransportDetails.peer_cert (it was always
None), and treat a TLS server connection without a client
certificate as secure, with a TLS channel ID: is_secure was
derived from the peer certificate, so WAMP-cryptosign with
channel binding failed on asyncio servers
- Behaviour change - the TLS channel ID tls-unique on Twisted now
follows RFC 5929 (the first TLS Finished message of the
handshake, in a full handshake the client's), as Python's ssl
module, and so autobahn on asyncio, already did. Twisted used the
server's Finished message, so WAMP-cryptosign with channel
binding failed between Twisted and asyncio peers over WebSocket,
and between Twisted RawSocket peers (whose protocols did not set
is_server, so the client side used the wrong message). Twisted
peers on autobahn 26.10.1 or older and on 26.10.2 no longer agree
on the channel ID over WebSocket: upgrade both sides of
connections that use channel binding (#2014) Work around a PyPy
bug: PyPy's ssl module (up to at least PyPy 7.3.23) returns the
server's TLS Finished message from
get_channel_binding("tls-unique") instead of the first (the
client's), so autobahn on asyncio on PyPy disagreed with all
other peers on the channel ID. The new autobahn.util.tls_unique()
uses PyPy's own tls_unique_cb() on PyPy, which returns the right
message
- TransportDetails.is_server is now set on Twisted RawSocket and
asyncio WebSocket connections (it was None)
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 1.20.1:
bug:
- [bug] [autogenerate] Fixed issue where a table or column comment
set to an empty string would cause autogenerate to detect a
comment change on every run. As most backends, including
PostgreSQL, MySQL, MariaDB and Oracle, don't store an empty
string comment distinctly from no comment, autogenerate now
treats an empty string comment the same as None when comparing
comments. Additionally, an empty string comment is now rendered
in op.create_table() and op.add_column() directives, where it was
previously omitted. Pull request courtesy vineoy.
- [bug] [autogenerate] [postgresql] Fixed rendering of the
PostgreSQL ~sqlalchemy.dialects.postgresql.DOMAIN type in
autogenerated migration scripts. Previously the type was
rendered using repr(), which omitted the check, not_null,
default, collation, constraint_name, schema and create_type
arguments and did not apply a dialect prefix to the underlying
data type. The full set of arguments is now rendered and the
underlying data type is rendered using the standard
type-rendering logic. Pull request courtesy Sebastian Cao.
- [bug] [autogenerate] [postgresql] Fixed false-positive "Computed
default cannot be modified" warning emitted during autogenerate
when comparing PostgreSQL Computed columns whose reflected SQL
expression includes type cast specifiers such as ::regconfig or
::text, which PostgreSQL adds to the expression as stored. These
cast specifiers are now stripped before comparison so that
otherwise equivalent expressions no longer trigger the warning.
Pull request courtesy Sebastian Cao.
- [bug] [autogenerate] [postgresql] Fixed issue where autogenerate
would detect an unchanged PostgreSQL expression-based index as
modified when the expression included type casts, such as a cast
to a type with a length or precision, a nested cast, or a cast
followed by a DESC modifier.
- [bug] [postgresql] Fixed bug where Operations.alter_column()
against a PostgreSQL identity column would render an incomplete,
invalid ALTER TABLE ... ALTER COLUMN statement with no clause at
all when existing_server_default was omitted, even if there were
no existing server default. Pull request courtesy Riti Grover.
- [bug] [environment] Fixed issue where a third party plugin
published using the alembic.plugins entrypoint, configured to
refer to a plugin module as documented at
alembic.plugins.toplevel, would cause import alembic to fail with
a TypeError, as the loaded module was erroneously iterated rather
than being set up directly. An entrypoint that refers to a
collection of modules, the form which inadvertently worked
previously, continues to be accepted but now emits a deprecation
warning.
- [bug] [autogenerate] Fixed issue where dialect-specific keyword
arguments on a ForeignKeyConstraint, ForeignKey or
CheckConstraint, such as postgresql_not_valid, were not rendered
for the constraints that are part of an autogenerated
Operations.create_table() directive, nor for an autogenerated
Operations.create_check_constraint() directive. The
Operations.create_table() case additionally requires SQLAlchemy
2.0.55 / 2.1.5 or greater.
- [bug] [autogenerate] Fixed issue where, when using SQLAlchemy
2.1, the CHECK constraint generated by a type such as
~sqlalchemy.types.Enum or ~sqlalchemy.types.Boolean with
create_constraint=True would be rendered by autogenerate as
explicit sa.CheckConstraint() entries within op.create_table(),
in addition to the type itself which already produces that
constraint, leading to a duplicate constraint error when the
migration is run.
- [bug] [operations] Fixed issue where a CreateTableOp produced
from an existing ~sqlalchemy.schema.Table using
CreateTableOp.from_table() would emit the CHECK constraint
generated by a type such as ~sqlalchemy.types.Enum or
~sqlalchemy.types.Boolean with create_constraint=True twice in
the resulting CREATE TABLE statement when invoked directly.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Drop the Cython version patch, as upstream has a wider range now.
async-timeout was removed as an dependency upstream in v1.90.0.
Signed-off-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to addresses eMudhra certificates issue.
See https://emudhra.we-have-a-problem.com/
Sync all grpc recipes to the same version.
Removed obsolete patches:
* The compiler-argument fix is already handled upstream using
shlex.split()
* Bundled protobuf now restricts musttail to AArch64 and x86-64, so the
MIPS exclusion patch is unnecessary.
License-Update: switched from license to license expression
orig: License: Apache License 2.0
New: License-Expression: Apache-2.0
Signed-off-by: Peter Marko <peter.marko@siemens.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
std only provides AtomicU64 on targets with 64-bit atomics, so ruff
fails to build for riscv32:
error[E0432]: unresolved import `std::sync::atomic::AtomicU64`
--> crates/ruff/src/cache.rs:7:25
Add a patch that uses portable-atomic's AtomicU64 for the cache
timestamp on such targets, archived in the same on-disk format.
AI-Generated: Uses Claude Code
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
fsspec imports ctypes, asyncio, json, logging and threading, which are
not in python3-core, without ctypes "import fsspec" fails, which also
broke the python3-pyyaml-include ptests.
Install the top-level fsspec/conftest.py into the ptest dir, it
provides the "m" fixture and the autouse instance cache cleaner, and
without it most tests error out or fail.
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
pandas 3 imports zoneinfo, so without it "import pandas" fails with
ModuleNotFoundError, and later imports in the same interpreter fail on
the partially initialized module.
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
test_documented_cache_lock_name reads docs/how-to.rst relative to the
tests dir and fails with FileNotFoundError when it is not installed.
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
anyio 4.15 imports typing_extensions on python < 3.15, so importing
anyio on target fails with ModuleNotFoundError. This broke the
a2wsgi, pytest-httpx and uvicorn ptests.
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Add a recipe for fonttools which provides tools to manipulate font
files. Release 4.67.0 brings:
- [varLib] Support decreasing design-space axis mappings, via a new
keyword-only allow_decreasing argument to models.normalizeValue.
- [designspaceLib] Allow partial DesignSpace v5 axis subsets:
omitted range attributes on an <axis-subset> are taken from the
parent axis, as the spec says.
- [designspaceLib] Fix DesignSpaceDocument.normalize() for mapped
axes: axis bounds and rule conditions are now normalized from
their original values.
- [designspaceLib] splitInterpolable and splitVariableFonts now
warn when a source or instance is dropped because it lies outside
the document's own axes, instead of silently discarding it.
- [varLib.instancer] Add support for instancing variable COLRv1
fonts.
- [varLib.instancer] Apply VVAR vertical-origin deltas to VORG, and
use OpenType rounding for instanced advances and vertical
origins.
- [varLib.instancer] Keep a universal FeatureVariations record when
pinning removes its last condition but other axes remain.
- [varLib.instancer] Preserve ppem Device corrections in GDEF,
BASE, GPOS and JSTF instead of asserting on them.
- [varLib.instancer] Allow requesting an axis's original range on
VARC fonts.
- [varLib.instancer, subset] Fold, remove or remap MATH
VariationIndex devices when instancing, subsetting the GDEF store
or optimizing it.
- [varLib] Raise ValueError: Missing required table fvar from
varLib.mutator and the instancer CLI on a static font, instead of
a bare KeyError.
- [featureVars] When adding rvrn, also shift lookup indices inside
existing FeatureVariations. Handle null ConditionSet and
FeatureTableSubstitution offsets when building, subsetting and
instancing. Keep FeatureTableSubstitution records sorted after
merging new ones into an existing record.
- [ttLib] Fix FeatureParams (size, ssXX, cvXX) in FeatureVariations
alternate feature tables, which failed to compile and round-trip.
- [ttLib] Fully decode lazily loaded ligatures, SinglePos and
PairPos arrays during recursive decompilation, so reorderGlyphs()
on a lazy font no longer corrupts or asserts on them.
- [VARC] Update the variation-store binary format to follow
harfbuzz/boring-expansion-spec#175:
SparseVarRegionList.RegionCount is uint32, sparse axes use
Offset32 and MultiVarData items are stored in an INDEX. VARC
fonts built with earlier fontTools versions must be rebuilt.
- [VARC] Several fixes: derive component conditions from
conditionIndex, set the implicit scaleY when importing XML,
report the font's current coordinates for components that reset
unspecified axes, and keep inherited coordinates when drawing
CFF2 VARC components.
- [varLib] buildMultiVarData accepts flattened per-region vector
tuples.
- [otConverters] Bounds-check CFF2 INDEX count and offSize on read,
raising TTLibError instead of allocating huge lazy lists.
- [ttLib] Handle empty packed deltas when OPTIMIZE_FONT_SPEED is
set.
- [scaleUpem] Scale per-glyph VORG origins; fix VARC scaling for
static fonts and condition variations; don't mutate the shared
default CFF FontMatrix.
- [cmap] Fix format 2 compilation when all codes are single-byte or
all single-byte codes map to .notdef. Formats 2 and 4 now reject
glyph IDs above 65535 instead of wrapping them. Split format 14
default UVS ranges longer than 256 codepoints. Empty format 12
and 13 subtables round-trip.
- [glyf] Use unsigned instruction lengths, so programs of
32768-65535 bytes compile and decompile correctly. Keep
instructions in zero-contour glyphs.
- [pens] Fix cubic off-curve detection in TTGlyphPointPen across
contour starts. Glyph.drawPoints() now raises NotImplementedError
for an all-off-curve cubic contour, which the point pen protocol
cannot express. RoundingPen passes the all-off-curve None
sentinel through.
- [CFF2] Preserve operands when a blend has zero regions.
- [cffLib] Read CFF font names as Latin-1, matching how they are
written. Deleting a CFF dict attribute now actually removes it.
- [CFF2ToCFF] Fix conversion of fonts with local subroutines. A
CFF2 table with a single FontDict is now converted to a
name-keyed CFF font that keeps its glyph names.
- [subset] Handle a null GDEF variation store.
- [merge] Support merging fonts that both have a MATH table.
- [feaLib] Reject the same mark class used twice in one anchor
list. Don't crash on value records whose devices are all NULL.
Pad a short OS/2 Vendor with spaces.
- [feaLib] Raise FeatureLibError with a location, instead of a bare
Python error, for: a BASE script list without a matching tag
list, a UnicodeRange bit outside 0-127, a name string that cannot
be decoded, a STAT axis location with no or too many values, and
a non-ASCII OS/2 Vendor.
- [name] Fix the BCP 47 tags of some Mac and Windows language IDs,
e.g. es was mapped to Mac Estonian. getDebugName prefers the
Windows English name over the Mac one.
- [post] Don't crash on a format 2.0 table with numGlyphs set to 0.
- [VDMX] Recompute numRecs and numRatios when compiling.
- [Silf] Fix compiling a Silf table that was decompiled from
binary.
- [woff2] Preserve minorVersion when copying flavor data.
- [ttGlyphSet] Compute glyph width lazily for glyf variable fonts
without HVAR, so .width is correct before drawing.
- [varLib.interpolatable] Respect designspace source layers; fix
--json output with SciPy.
- [misc.psLib] Fix tokenizing of escaped parentheses in PostScript
strings.
- [svgLib] Raise ValueError instead of IndexError on a truncated
path command.
- [misc.transform] Preserve the direction of the remaining axis
when decomposing a transform whose first column is zero.
- [misc.textTools] Tag.__ne__ returns NotImplemented for
unsupported types.
- [misc.dictTools] hashdict rejects in-place union (|=).
- [misc.xmlReader] Close owned input streams when parsing fails.
- [misc.filesystem] WriteZipFS.close() can be called more than
once.
- [EBDT] Keep EBDT/CBDT glyph metrics after probing a missing
attribute.
This work was sponsored by GOVCERT.LU.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
Upgrade to release 1.13.0:
- Document explicit proxy evaluation and identity checks with None.
- Fixed some broken tests on Python 3.15.
- Added configuration for Windows ARM64 wheels.
- Added Python 3.15 wheels.
- Dropped support for EOL Python 3.10 and 3.9.
- Dropped wheel building for Python 3.13 free-threading
(experimental and unsupported by cibuildwheel anymore; details).
- Fixed typo in __annotations__ (basically it was broken).
License-Update: Copyright years updated
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>