Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-uritools for openSUSE:Factory
checked in at 2026-10-12 22:07:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-uritools (Old)
and /work/SRC/openSUSE:Factory/.python-uritools.new.3698736 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-uritools"
Mon Oct 12 22:07:17 2026 rev:9 rq:1384225 version:6.1.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-uritools/python-uritools.changes
2026-05-20 15:25:16.163989018 +0200
+++
/work/SRC/openSUSE:Factory/.python-uritools.new.3698736/python-uritools.changes
2026-10-12 22:07:21.287649554 +0200
@@ -1,0 +2,12 @@
+Sun Oct 11 14:15:37 UTC 2026 - Andrea Manzini <[email protected]>
+
+- Update to 6.1.3 (includes 6.1.2):
+ * No changes to the runtime code
+ * Type stubs import TypeAlias from typing, so typing_extensions
+ is no longer needed by type checkers
+ * Minor style and documentation improvements
+ * Update build environment
+- Raise setuptools BuildRequires to >= 80, as upstream requires
+- Spec cleanup: drop obsolete Group tag
+
+-------------------------------------------------------------------
Old:
----
uritools-6.1.1.tar.gz
New:
----
uritools-6.1.3.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-uritools.spec ++++++
--- /var/tmp/diff_new_pack.es9uaA/_old 2026-10-12 22:07:22.058681381 +0200
+++ /var/tmp/diff_new_pack.es9uaA/_new 2026-10-12 22:07:22.059681423 +0200
@@ -18,15 +18,14 @@
%{?sle15_python_module_pythons}
Name: python-uritools
-Version: 6.1.1
+Version: 6.1.3
Release: 0
Summary: URI parsing, classification and composition
License: MIT
-Group: Development/Languages/Python
URL: https://github.com/tkem/uritools/
Source:
https://files.pythonhosted.org/packages/source/u/uritools/uritools-%{version}.tar.gz
BuildRequires: %{python_module pip}
-BuildRequires: %{python_module setuptools >= 78}
+BuildRequires: %{python_module setuptools >= 80}
BuildRequires: %{python_module setuptools-scm >= 8.2}
BuildRequires: %{python_module wheel}
BuildRequires: fdupes
++++++ uritools-6.1.1.tar.gz -> uritools-6.1.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/.github/FUNDING.yml
new/uritools-6.1.3/.github/FUNDING.yml
--- old/uritools-6.1.1/.github/FUNDING.yml 2026-05-09 21:51:08.000000000
+0200
+++ new/uritools-6.1.3/.github/FUNDING.yml 1970-01-01 01:00:00.000000000
+0100
@@ -1,2 +0,0 @@
-github: [tkem]
-custom: ["https://www.paypal.me/tkem"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/.github/ISSUE_TEMPLATE/bug_report.md
new/uritools-6.1.3/.github/ISSUE_TEMPLATE/bug_report.md
--- old/uritools-6.1.1/.github/ISSUE_TEMPLATE/bug_report.md 2026-05-09
21:51:08.000000000 +0200
+++ new/uritools-6.1.3/.github/ISSUE_TEMPLATE/bug_report.md 1970-01-01
01:00:00.000000000 +0100
@@ -1,29 +0,0 @@
----
-name: Bug report
-about: Create a report to help us improve
-title: ''
-labels: bug
-assignees: tkem
-
----
-
-Before reporting a bug, please make sure you have the latest `uritools`
version installed:
-```
-pip install --upgrade uritools
-```
-
-**Describe the bug**
-A clear and concise description of what the bug is.
-
-**Expected result**
-A clear and concise description of what you expected to happen.
-
-**Actual result**
-A clear and concise description of what happened instead.
-
-**Reproduction steps**
-
-```python
-import uritools
-
-```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/.github/ISSUE_TEMPLATE/config.yml
new/uritools-6.1.3/.github/ISSUE_TEMPLATE/config.yml
--- old/uritools-6.1.1/.github/ISSUE_TEMPLATE/config.yml 2026-05-09
21:51:08.000000000 +0200
+++ new/uritools-6.1.3/.github/ISSUE_TEMPLATE/config.yml 1970-01-01
01:00:00.000000000 +0100
@@ -1 +0,0 @@
-blank_issues_enabled: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/uritools-6.1.1/.github/ISSUE_TEMPLATE/feature_request.md
new/uritools-6.1.3/.github/ISSUE_TEMPLATE/feature_request.md
--- old/uritools-6.1.1/.github/ISSUE_TEMPLATE/feature_request.md
2026-05-09 21:51:08.000000000 +0200
+++ new/uritools-6.1.3/.github/ISSUE_TEMPLATE/feature_request.md
1970-01-01 01:00:00.000000000 +0100
@@ -1,10 +0,0 @@
----
-name: Feature request
-about: Suggest an idea for this project
-title: ''
-labels: enhancement
-assignees: tkem
-
----
-
-Sorry, but `uritools` is not accepting feature requests at this time.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/.github/SECURITY.md
new/uritools-6.1.3/.github/SECURITY.md
--- old/uritools-6.1.1/.github/SECURITY.md 2026-05-09 21:51:08.000000000
+0200
+++ new/uritools-6.1.3/.github/SECURITY.md 1970-01-01 01:00:00.000000000
+0100
@@ -1,13 +0,0 @@
-# Security Policy
-
-## Supported Versions
-
-Security updates are applied only to the latest release.
-
-## Reporting a Vulnerability
-
-If you have discovered a security vulnerability in this project, please report
it privately. **Do not disclose it as a public issue.** This gives us time to
work with you to fix the issue before public exposure, reducing the chance that
the exploit will be used before a patch is released.
-
-Please disclose it at [security
advisory](https://github.com/tkem/uritools/security/advisories/new).
-
-This project is maintained by a single person on a best effort basis. As such,
vulnerability reports will be investigated and fixed or disclosed as soon as
possible, but there may be delays in response time due to the maintainer's
other commitments.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/.github/copilot-instructions.md
new/uritools-6.1.3/.github/copilot-instructions.md
--- old/uritools-6.1.1/.github/copilot-instructions.md 2026-05-18
20:08:33.000000000 +0200
+++ new/uritools-6.1.3/.github/copilot-instructions.md 1970-01-01
01:00:00.000000000 +0100
@@ -1,76 +0,0 @@
-# uritools Project Guidelines
-
-## Overview
-
-RFC 3986 compliant URI parsing library replacing Python's `urllib.parse`.
Requires Python >= 3.10, zero runtime dependencies.
-
-- **Single-file design**: Everything in `src/uritools/__init__.py` — do not
create submodules
-- **Dual type support**: All public functions handle both `str` and `bytes`
via `SplitResultString` / `SplitResultBytes`
-- **Public API**: Defined in `__all__` — changes are breaking
-- **Type stubs**: `src/uritools/__init__.pyi` — keep in sync with runtime API
-
-## Architecture
-
-Functions return `namedtuple` subclasses (`SplitResult`, `DefragResult`) with
both tuple access and getter methods (`.gethost()`, `.getport()`,
`.getquerydict()`). Preserve both interfaces when modifying.
-
-Encoding uses cached lookup tables (`_encoded` dict) with uppercase hex digits
per RFC 3986. Safe characters vary by component (`_SAFE_PATH`, `_SAFE_QUERY`,
etc.).
-
-Type dispatch pattern used throughout:
-```python
-if isinstance(uristring, bytes):
- result = SplitResultBytes
-else:
- result = SplitResultString
-```
-
-### Composition rules (`uricompose()`)
-- Scheme: `[A-Za-z][A-Za-z0-9+.-]*`, lowercased
-- Path with authority must start with `/` or be empty
-- Path without authority cannot start with `//`
-- Relative paths with `:` in first segment get `./` prefix
-- Query accepts `str`, `bytes`, `dict`, or list of tuples
-- Invalid host types must raise `TypeError`, not leak `AttributeError`
-
-### IP address handling
-- Use `ipaddress` module; reject IPvFuture (addresses starting with `v`)
-- IPv6 bracketed in output: `[2001:db8::1]`, always compressed form
-
-### Design decisions (intentional — do not "fix")
-- `getscheme()` always returns `str` (decodes bytes schemes)
-- `getfragment()` and other `get*()` methods decode to `str` by default, even
for bytes input
-- `gethost()` returns `""` for empty host when `default=None`, but returns
`default` when it's not None
-- `SplitResultBytes` / `SplitResultString` are semi-private (not in `__all__`)
-
-## Development
-
-### Running checks
-```bash
-tox # all environments (recommended)
-tox -e py # tests with coverage
-tox -e ruff-format # formatting (ruff format)
-tox -e ruff # linting (ruff check)
-tox -e pyright # type checking
-tox -e docs # Sphinx HTML build
-tox -e doctest # Sphinx doctest
-```
-
-Use `tox` or `PYTHONPATH=src python3 -m pytest tests/` to test against the
workspace source (not the system-installed package).
-
-### Testing conventions
-- `unittest.TestCase` with `check()` helpers — not pytest-style
-- Test both `str` and `bytes` variants of every case
-- Test RFC 3986 examples explicitly in `test_rfc3986()` methods
-- Edge cases in separate `test_abnormal()` methods
-- Maintain 100% line coverage
-- Avoid shadowing built-ins (`dict`, `input`) in loop variables
-
-### Documentation
-- Sphinx docs in `docs/`, built with `tox -e docs`
-- `README.rst` examples must work as doctests
-- Docstrings describe types in prose (no type annotations in signatures)
-- Directive body content uses 3-space indentation in `docs/index.rst`
-
-### Changelog
-- `CHANGELOG.rst` uses `vX.Y.Z (YYYY-MM-DD)` headers with `===` underlines
-- Unreleased changes go under `vX.Y.Z (UNRELEASED)`
-- Each entry is a `- ` bullet (imperative mood, no trailing period)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/.github/copilot-review.md
new/uritools-6.1.3/.github/copilot-review.md
--- old/uritools-6.1.1/.github/copilot-review.md 2026-05-18
20:08:33.000000000 +0200
+++ new/uritools-6.1.3/.github/copilot-review.md 1970-01-01
01:00:00.000000000 +0100
@@ -1,158 +0,0 @@
-# Code, Tests & Docs Review
-
-**Date:** 2026-05-18
-**Version:** 6.1.1
-**Python:** 3.13.7
-**Scope:** `src/uritools/__init__.py`, `src/uritools/__init__.pyi`, `tests/`,
`docs/`, `README.rst`
-
-## Checks Summary
-
-| Check | Result |
-|------------|--------|
-| Tests | 45 passed |
-| Coverage | 100% (394 statements) |
-| Lint | Clean (ruff check) |
-| Format | Clean (ruff format) |
-| Type check | 0 errors (pyright) |
-| Docs build | OK (sphinx html) |
-| Doctests | 10 passed |
-
----
-
-## Code Findings
-
-### C1. Unbounded cache growth in `uriencode()` (low risk)
-
-`_encoded` dict grows without limit when callers pass arbitrary `safe` values.
The existing FIXME (line 79) acknowledges this. Consider `@functools.lru_cache`
or capping the dict size. In practice, the library only uses a handful of fixed
`safe` values internally, so risk is low unless users call `uriencode()`
directly with dynamic `safe` arguments.
-
-### C2. `DefragResult.getfragment()` always returns `str` (design note)
-
-The FIXME at line 129 notes that `getfragment()` decodes to `str` by default
even when `geturi()` returns `bytes`. This is consistent with
`SplitResult.getfragment()` and all other `get*()` methods, so changing it
would be a breaking API change. The FIXME can be considered resolved or
intentional.
-
-### C3. `getscheme()` always returns `str` (design note)
-
-Similar FIXME at line 203: `getscheme()` decodes bytes schemes to `str`. The
stub file already types this as `-> str | None`, confirming this is intentional
behavior.
-
-### C4. `SplitResultBytes` / `SplitResultString` visibility (minor)
-
-Both classes have a `# TODO: make private?` comment. They are not in `__all__`
so they are already semi-private. Making them fully private (prefixing with
`_`) would be a minor cleanup but could break users who import them directly.
-
-### C5. `gethost()` returns empty string for empty host
-
-`gethost(default=X)` returns `default` when host is empty *and* default is not
None, but returns `""` when default is None. This edge case (`"file:///"` ->
`gethost()` returns `""`) is tested and documented, but the asymmetry between
`default=None` and `default="x"` may be unexpected.
-
-### C6. `_AUTHORITY_RE_*` port group matches empty string
-
-The regex `(?::([0-9]*))?$` captures an empty port string for URIs like
`http://host:`. This is handled correctly downstream (`_port()` returns `b""`
for empty port, `getport()` returns default), but the empty-string-vs-None
distinction for port is a subtle edge.
-
-### C8. `getauthority()` TODO about efficiency (trivial)
-
-Line 224: `# TODO: this could be much more efficient by using a dedicated
regex` — `getauthority()` calls three separate getters. Could be
micro-optimized with a single regex, but unlikely to matter in practice.
-
----
-
-## Test Findings
-
-### Good practices observed
-- All public functions tested with both `str` and `bytes` input
-- RFC 3986 examples tested exhaustively (Sections 3, 5.4.1, 5.4.2)
-- Edge cases and abnormal inputs covered thoroughly
-- `check()` helpers enforce round-trip consistency (parse → recompose)
-- IPv4, IPv6, IPv4-mapped IPv6, and IPvFuture rejection all tested
-- Error cases test `TypeError` vs `ValueError` distinction
-- Cross-type `urijoin` (bytes base + str ref, etc.) tested
-- 100% line coverage maintained
-- Python 3.13 IPv4-mapped address representation change handled in
`test_ipv4_mapped_literal` with dual expected values
-
-### T1. `uricompose` with `fragment` parameter
-
-Only tested implicitly via the RFC 3986 example in `test_rfc3986`. No
dedicated test for fragment encoding (e.g., `fragment="foo bar"` producing
`#foo%20bar`).
-
-### T2. `uricompose` with non-default `encoding`
-
-No test passes a non-default `encoding` to `uricompose()`. For example,
composing with `encoding="latin-1"` and non-ASCII path characters.
-
-### T3. `uricompose` authority override with bytes
-
-`test_authority_override` only uses `str` values. No test overrides authority
subcomponents with `bytes` kwargs.
-
-### T4. `uriunsplit` with mixed types
-
-The type dispatch in `uriunsplit()` uses `path` type to select the result
class. Mixed types (e.g., str scheme + bytes path) could produce unexpected
results but are not tested. Consider documenting this as unsupported or adding
a guard.
-
-### T5. `DefragResult.getfragment()` default parameter
-
-No test passes a non-None `default` to `DefragResult.getfragment()` (e.g.,
`uridefrag("").getfragment(default="fallback")`).
-
-### T6. `getauthority` with bytes default tuple
-
-`test_encoding_none` tests str and bytes URI input, but `getauthority()` with
a bytes default tuple is not tested.
-
----
-
-## Documentation Findings
-
-### D3. `docs/index.rst`: no documentation for `uriencode`/`uridecode`
parameters
-
-The `uriencode` and `uridecode` docs describe input/output types but do not
document the `encoding`, `errors`, or `safe` parameters individually. Users
must read the function signature and docstring. Consider adding parameter
descriptions.
-
-### D4. `docs/index.rst`: `SplitResult` attribute table missing `Index` for
properties
-
-The `urisplit` attribute table has empty `Index` cells for `userinfo`, `host`,
and `port`. This is intentional (they are properties, not tuple fields), but it
could be clearer with a note like "n/a" or "(property)".
-
-### D6. `docs/conf.py`: `master_doc` deprecated
-
-`master_doc` is deprecated in Sphinx 4.0+ in favor of `root_doc`. Works fine
currently but will eventually produce a warning.
-
-### D7. `docs/index.rst`: `DefragResult` and `SplitResult` documented twice
-
-These classes are first described in the "URI Decomposition" section (inline
attribute tables) and then again in "Structured Parse Results" via `..
autoclass::` with `:members:`. This provides the best of both worlds (table
overview + detailed API), but the duplication could confuse readers scanning
for the complete API of these classes.
-
-### D8. Changelog entry format guidance
-
-The `CHANGELOG.rst` format is documented in `copilot-instructions.md`
(imperative mood bullets under `vX.Y.Z (YYYY-MM-DD)` headers with `===`
underlines). No separate `CONTRIBUTING.md` exists, but the conventions are
clear from the instructions file.
-
----
-
-## Type Stub Findings
-
-### S1. `DefragResult` and `SplitResult` stub inheritance
-
-The stubs declare `DefragResult(NamedTuple, Generic[AnyStr])` and
`SplitResult(NamedTuple, Generic[AnyStr])`, but the runtime classes inherit
from `collections.namedtuple(...)` (not `typing.NamedTuple`). This is
acceptable for type checking purposes since pyright accepts it (0 errors), but
it's a divergence from the runtime class hierarchy.
-
-### S2. `gethost()` default parameter type
-
-The stub types `default` as `str | ipaddress.IPv4Address |
ipaddress.IPv6Address | None`, but at runtime any value could be passed as
default (it's just returned as-is when host is absent). This is appropriate —
the stub reflects intended usage, not arbitrary usage.
-
-### S3. `uriencode` overload for str input missing `encoding=None`
-
-The str overload of `uriencode` types `encoding` as `str`, not `str | None`.
The bytes overload allows `str | None`. At runtime, passing `encoding=None` to
`uriencode` with a str input would fail (can't call `str.encode(None)`), so the
stub is correct — but this asymmetry is not obvious.
-
----
-
-## Security
-
-No security issues found. The library:
-- Does not perform network I/O
-- Does not execute or evaluate URI content
-- Properly validates IP literals and rejects IPvFuture
-- Uses percent-encoding with uppercase hex digits per RFC 3986
-- Handles path traversal (`../`) correctly per RFC 3986 Section 5.2.4
-- `test_path_traversal_limits` confirms `../` * 100 cannot escape root
-
----
-
-## Summary
-
-The codebase is clean, well-tested (100% coverage), and fully passing all
checks. Key findings by priority:
-
-**Consider addressing:**
-1. **C1**: Consider capping `_encoded` cache or switching to `lru_cache`
-
-**Nice to have:**
-2. **T1-T3**: Add test cases for `uricompose` fragment, encoding, and bytes
authority override
-3. **C2-C3**: Resolve or remove FIXME comments about bytes return types
(behavior is intentional)
-4. **D6**: Rename `master_doc` to `root_doc` in `docs/conf.py`
-
-**No action needed:**
-- C4, C5, C6, C8, D3, D4, D7, D8, S1-S3, T4-T6 — documented here for awareness
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/.github/dependabot.yml
new/uritools-6.1.3/.github/dependabot.yml
--- old/uritools-6.1.1/.github/dependabot.yml 2026-05-09 21:51:08.000000000
+0200
+++ new/uritools-6.1.3/.github/dependabot.yml 1970-01-01 01:00:00.000000000
+0100
@@ -1,6 +0,0 @@
-version: 2
-updates:
- - package-ecosystem: "github-actions"
- directory: "/"
- schedule:
- interval: "monthly"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/.github/workflows/ci.yml
new/uritools-6.1.3/.github/workflows/ci.yml
--- old/uritools-6.1.1/.github/workflows/ci.yml 2026-05-09 21:51:08.000000000
+0200
+++ new/uritools-6.1.3/.github/workflows/ci.yml 1970-01-01 01:00:00.000000000
+0100
@@ -1,27 +0,0 @@
-name: CI
-
-on: [push, pull_request, workflow_dispatch]
-
-permissions:
- contents: read
-
-jobs:
- main:
- name: Python ${{ matrix.python }}
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- python: ["3.10", "3.11", "3.12", "3.13", "3.13t", "3.14", "3.14t",
"pypy3.10", "pypy3.11"]
- steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #
v6.0.2
- - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 #
v6.2.0
- with:
- python-version: ${{ matrix.python }}
- allow-prereleases: true
- - run: pip install coverage tox
- - run: tox
- - uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2
# v6.0.0
- with:
- name: ${{ matrix.python }}
- token: ${{ secrets.CODECOV_TOKEN }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/.gitignore
new/uritools-6.1.3/.gitignore
--- old/uritools-6.1.1/.gitignore 2026-05-09 21:51:08.000000000 +0200
+++ new/uritools-6.1.3/.gitignore 1970-01-01 01:00:00.000000000 +0100
@@ -1,11 +0,0 @@
-*.egg-info
-*.pyc
-*.swp
-.cache/
-.coverage
-.pytest_cache/
-.tox/
-MANIFEST
-build/
-dist/
-docs/_build/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/.readthedocs.yaml
new/uritools-6.1.3/.readthedocs.yaml
--- old/uritools-6.1.1/.readthedocs.yaml 2026-05-09 21:51:08.000000000
+0200
+++ new/uritools-6.1.3/.readthedocs.yaml 1970-01-01 01:00:00.000000000
+0100
@@ -1,11 +0,0 @@
-# Configure ReadTheDocs.
-
-version: 2
-
-build:
- os: "ubuntu-22.04"
- tools:
- python: "3.11"
-
-sphinx:
- configuration: "docs/conf.py"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/CHANGELOG.rst
new/uritools-6.1.3/CHANGELOG.rst
--- old/uritools-6.1.1/CHANGELOG.rst 2026-05-18 20:08:33.000000000 +0200
+++ new/uritools-6.1.3/CHANGELOG.rst 2026-07-24 01:10:41.000000000 +0200
@@ -1,3 +1,19 @@
+v6.1.3 (2026-07-24)
+===================
+
+- Minor style improvements to keep ``ruff`` happy.
+
+- Update build environment.
+
+
+v6.1.2 (2026-05-22)
+===================
+
+- Minor documentation improvements.
+
+- Update build environment.
+
+
v6.1.1 (2026-05-18)
===================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/MANIFEST.in
new/uritools-6.1.3/MANIFEST.in
--- old/uritools-6.1.1/MANIFEST.in 1970-01-01 01:00:00.000000000 +0100
+++ new/uritools-6.1.3/MANIFEST.in 2026-05-22 00:44:05.000000000 +0200
@@ -0,0 +1,3 @@
+prune .github/
+exclude .gitignore
+exclude .readthedocs.yaml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/PKG-INFO new/uritools-6.1.3/PKG-INFO
--- old/uritools-6.1.1/PKG-INFO 2026-05-18 20:22:32.359385700 +0200
+++ new/uritools-6.1.3/PKG-INFO 2026-07-24 01:10:49.468283700 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: uritools
-Version: 6.1.1
+Version: 6.1.3
Summary: URI parsing, classification and composition
Author-email: Thomas Kemmer <[email protected]>
Maintainer-email: Thomas Kemmer <[email protected]>
@@ -82,10 +82,10 @@
<https://github.com/python/cpython/blob/3.14/Lib/urllib/parse.py#L22>`_:
RFC 3986 is considered the current standard and any future changes
- to urlparse module should conform with it. The urlparse module is
- currently not entirely compliant with this RFC due to defacto
- scenarios for parsing, and for backward compatibility purposes,
- some parsing quirks from older RFCs are retained.
+ to urllib.parse module should conform with it. The urllib.parse
+ module is currently not entirely compliant with this RFC due to
+ defacto scenarios for parsing, and for backward compatibility
+ purposes, some parsing quirks from older RFCs are retained.
This module aims to provide fully RFC 3986 compliant replacements for
the most commonly used functions found in ``urllib.parse``. It also
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/README.rst
new/uritools-6.1.3/README.rst
--- old/uritools-6.1.1/README.rst 2026-05-18 20:08:33.000000000 +0200
+++ new/uritools-6.1.3/README.rst 2026-05-22 00:44:05.000000000 +0200
@@ -53,10 +53,10 @@
<https://github.com/python/cpython/blob/3.14/Lib/urllib/parse.py#L22>`_:
RFC 3986 is considered the current standard and any future changes
- to urlparse module should conform with it. The urlparse module is
- currently not entirely compliant with this RFC due to defacto
- scenarios for parsing, and for backward compatibility purposes,
- some parsing quirks from older RFCs are retained.
+ to urllib.parse module should conform with it. The urllib.parse
+ module is currently not entirely compliant with this RFC due to
+ defacto scenarios for parsing, and for backward compatibility
+ purposes, some parsing quirks from older RFCs are retained.
This module aims to provide fully RFC 3986 compliant replacements for
the most commonly used functions found in ``urllib.parse``. It also
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/docs/conf.py
new/uritools-6.1.3/docs/conf.py
--- old/uritools-6.1.1/docs/conf.py 2026-05-09 21:51:08.000000000 +0200
+++ new/uritools-6.1.3/docs/conf.py 2026-07-24 01:10:41.000000000 +0200
@@ -1,27 +1,9 @@
-import pathlib
-import sys
-
-src_directory = (pathlib.Path(__file__).parent.parent / "src").resolve()
-sys.path.insert(0, str(src_directory))
-
-
-# Extract the current version from the source.
-def get_version():
- """Get the version and release from the source code."""
-
- text = (src_directory / "uritools/__init__.py").read_text()
- for line in text.splitlines():
- if not line.strip().startswith("__version__"):
- continue
- full_version = line.partition("=")[2].strip().strip("\"'")
- partial_version = ".".join(full_version.split(".")[:2])
- return full_version, partial_version
- return (None, None)
-
+import importlib.metadata
project = "uritools"
copyright = "2014-2026 Thomas Kemmer"
-release, version = get_version()
+release = importlib.metadata.version(project)
+version = ".".join(release.split(".")[:2])
extensions = [
"sphinx.ext.autodoc",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/docs/index.rst
new/uritools-6.1.3/docs/index.rst
--- old/uritools-6.1.1/docs/index.rst 2026-05-18 20:08:33.000000000 +0200
+++ new/uritools-6.1.3/docs/index.rst 2026-05-22 00:44:05.000000000 +0200
@@ -36,10 +36,11 @@
<https://github.com/python/cpython/blob/3.14/Lib/urllib/parse.py#L22>`_:
RFC 3986 is considered the current standard and any future changes
- to urlparse module should conform with it. The urlparse module is
- currently not entirely compliant with this RFC due to defacto
- scenarios for parsing, and for backward compatibility purposes,
- some parsing quirks from older RFCs are retained.
+ to :mod:`urllib.parse` module should conform with it. The
+ :mod:`urllib.parse` module is currently not entirely compliant
+ with this RFC due to defacto scenarios for parsing, and for
+ backward compatibility purposes, some parsing quirks from older
+ RFCs are retained.
This module aims to provide fully RFC 3986 compliant replacements for
the most commonly used functions found in :mod:`urllib.parse`. It
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/pyproject.toml
new/uritools-6.1.3/pyproject.toml
--- old/uritools-6.1.1/pyproject.toml 2026-05-18 20:08:33.000000000 +0200
+++ new/uritools-6.1.3/pyproject.toml 2026-07-24 01:10:41.000000000 +0200
@@ -1,5 +1,5 @@
[build-system]
-requires = ["setuptools >= 78", "setuptools-scm >= 8.2"]
+requires = ["setuptools >= 80", "setuptools-scm >= 8.2"]
build-backend = "setuptools.build_meta"
[project]
@@ -49,5 +49,8 @@
[tool.pyright]
typeCheckingMode = "standard"
-reportOptionalMemberAccess = false
-reportAttributeAccessIssue = false
+reportAttributeAccessIssue = "information"
+reportOptionalMemberAccess = "warning"
+
+[tool.ruff.lint]
+ignore = ["DTZ005", "SIM102", "UP031"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/src/uritools/__init__.py
new/uritools-6.1.3/src/uritools/__init__.py
--- old/uritools-6.1.1/src/uritools/__init__.py 2026-05-18 20:08:33.000000000
+0200
+++ new/uritools-6.1.3/src/uritools/__init__.py 2026-07-24 01:10:41.000000000
+0200
@@ -33,7 +33,7 @@
"uriunsplit",
)
-__version__ = "6.1.1"
+__version__ = "6.1.3"
# RFC 3986 2.2. Reserved Characters
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/src/uritools/__init__.pyi
new/uritools-6.1.3/src/uritools/__init__.pyi
--- old/uritools-6.1.1/src/uritools/__init__.pyi 2026-05-09
21:51:08.000000000 +0200
+++ new/uritools-6.1.3/src/uritools/__init__.pyi 2026-07-24
01:10:41.000000000 +0200
@@ -1,7 +1,6 @@
import ipaddress
from collections.abc import Iterable, Mapping, Sequence
-from typing import Any, AnyStr, Generic, NamedTuple, overload
-from typing_extensions import TypeAlias
+from typing import Any, AnyStr, Generic, NamedTuple, TypeAlias, overload
__all__ = [
"GEN_DELIMS",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/src/uritools.egg-info/PKG-INFO
new/uritools-6.1.3/src/uritools.egg-info/PKG-INFO
--- old/uritools-6.1.1/src/uritools.egg-info/PKG-INFO 2026-05-18
20:22:32.000000000 +0200
+++ new/uritools-6.1.3/src/uritools.egg-info/PKG-INFO 2026-07-24
01:10:49.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: uritools
-Version: 6.1.1
+Version: 6.1.3
Summary: URI parsing, classification and composition
Author-email: Thomas Kemmer <[email protected]>
Maintainer-email: Thomas Kemmer <[email protected]>
@@ -82,10 +82,10 @@
<https://github.com/python/cpython/blob/3.14/Lib/urllib/parse.py#L22>`_:
RFC 3986 is considered the current standard and any future changes
- to urlparse module should conform with it. The urlparse module is
- currently not entirely compliant with this RFC due to defacto
- scenarios for parsing, and for backward compatibility purposes,
- some parsing quirks from older RFCs are retained.
+ to urllib.parse module should conform with it. The urllib.parse
+ module is currently not entirely compliant with this RFC due to
+ defacto scenarios for parsing, and for backward compatibility
+ purposes, some parsing quirks from older RFCs are retained.
This module aims to provide fully RFC 3986 compliant replacements for
the most commonly used functions found in ``urllib.parse``. It also
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/src/uritools.egg-info/SOURCES.txt
new/uritools-6.1.3/src/uritools.egg-info/SOURCES.txt
--- old/uritools-6.1.1/src/uritools.egg-info/SOURCES.txt 2026-05-18
20:22:32.000000000 +0200
+++ new/uritools-6.1.3/src/uritools.egg-info/SOURCES.txt 2026-07-24
01:10:49.000000000 +0200
@@ -1,19 +1,9 @@
-.gitignore
-.readthedocs.yaml
CHANGELOG.rst
LICENSE
+MANIFEST.in
README.rst
pyproject.toml
tox.ini
-.github/FUNDING.yml
-.github/SECURITY.md
-.github/copilot-instructions.md
-.github/copilot-review.md
-.github/dependabot.yml
-.github/ISSUE_TEMPLATE/bug_report.md
-.github/ISSUE_TEMPLATE/config.yml
-.github/ISSUE_TEMPLATE/feature_request.md
-.github/workflows/ci.yml
docs/conf.py
docs/index.rst
src/uritools/__init__.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/tests/test_compose.py
new/uritools-6.1.3/tests/test_compose.py
--- old/uritools-6.1.1/tests/test_compose.py 2026-05-09 21:51:08.000000000
+0200
+++ new/uritools-6.1.3/tests/test_compose.py 2026-07-24 01:10:41.000000000
+0200
@@ -212,13 +212,13 @@
("?name=foo&type=bar", od([("name", "foo"), ("type", "bar")])),
("?name=foo&name=bar", [("name", "foo"), ("name", "bar")]),
("?name=foo&name=bar", {"name": ["foo", "bar"]}),
- ("?name=a/b/c", dict(name="a/b/c")),
- ("?name=a:b:c", dict(name="a:b:c")),
- ("?name=a?b?c", dict(name="a?b?c")),
- ("?name=a@b@c", dict(name="a@b@c")),
- ("?name=a;b;c", dict(name="a;b;c")),
- ("?name=a%23b%23c", dict(name="a#b#c")),
- ("?name=a%26b%26c", dict(name="a&b&c")),
+ ("?name=a/b/c", {"name": "a/b/c"}),
+ ("?name=a:b:c", {"name": "a:b:c"}),
+ ("?name=a?b?c", {"name": "a?b?c"}),
+ ("?name=a@b@c", {"name": "a@b@c"}),
+ ("?name=a;b;c", {"name": "a;b;c"}),
+ ("?name=a%23b%23c", {"name": "a#b#c"}),
+ ("?name=a%26b%26c", {"name": "a&b&c"}),
]
for uri, query in cases:
self.check(uri, query=query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/tests/test_defrag.py
new/uritools-6.1.3/tests/test_defrag.py
--- old/uritools-6.1.1/tests/test_defrag.py 2026-05-09 21:51:08.000000000
+0200
+++ new/uritools-6.1.3/tests/test_defrag.py 2026-07-24 01:10:41.000000000
+0200
@@ -23,7 +23,7 @@
def encode(s):
return s.encode() if s is not None else None
- cases += list(map(encode, case) for case in cases)
+ cases += [map(encode, case) for case in cases]
for uri, base, fragment in cases:
defrag = uridefrag(uri)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/tests/test_encoding.py
new/uritools-6.1.3/tests/test_encoding.py
--- old/uritools-6.1.1/tests/test_encoding.py 2026-05-18 20:08:33.000000000
+0200
+++ new/uritools-6.1.3/tests/test_encoding.py 2026-07-24 01:10:41.000000000
+0200
@@ -8,7 +8,7 @@
self.assertEqual(uriencode(decoded, safe, encoding), encoded)
self.assertEqual(uridecode(encoded, encoding), decoded)
# swap bytes/string types
- self.assertEqual(uriencode(decoded.encode(encoding), safe, encoding),
encoded) # noqa
+ self.assertEqual(uriencode(decoded.encode(encoding), safe, encoding),
encoded)
self.assertEqual(uridecode(encoded.decode("ascii"), encoding), decoded)
def test_encoding(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/uritools-6.1.1/tox.ini new/uritools-6.1.3/tox.ini
--- old/uritools-6.1.1/tox.ini 2026-05-18 20:08:33.000000000 +0200
+++ new/uritools-6.1.3/tox.ini 2026-07-24 01:10:41.000000000 +0200
@@ -1,5 +1,5 @@
[tox]
-envlist = py,docs,doctest,ruff,ruff-format,pyright
+envlist = py,docs,doctest,pyright,ruff,ruff-format
[testenv]
deps =
@@ -20,23 +20,20 @@
commands =
sphinx-build -W -b doctest -d {envtmpdir}/doctrees docs
{envtmpdir}/doctest
+[testenv:pyright]
+deps =
+ pyright
+commands =
+ pyright {posargs}
+
[testenv:ruff]
deps =
ruff
commands =
ruff check {posargs}
-skip_install = true
[testenv:ruff-format]
deps =
ruff
commands =
ruff format --diff -q {posargs}
-skip_install = true
-
-[testenv:pyright]
-deps =
- pyright
-commands =
- pyright {posargs}
-skip_install = true