Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-dnspython for 
openSUSE:Factory checked in at 2022-03-24 22:56:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-dnspython (Old)
 and      /work/SRC/openSUSE:Factory/.python-dnspython.new.1900 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-dnspython"

Thu Mar 24 22:56:49 2022 rev:33 rq:963789 version:2.2.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-dnspython/python-dnspython.changes        
2022-02-13 19:50:55.686194377 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-dnspython.new.1900/python-dnspython.changes  
    2022-03-24 22:56:52.984185233 +0100
@@ -1,0 +2,18 @@
+Mon Mar 14 21:04:18 UTC 2022 - Sebastian Wagner <sebix+novell....@sebix.at>
+
+- Update to version 2.2.1:
+ * dns.zone.from_text failed if relativize was False and an origin was
+   specified in the parameters.
+ * A number of types permitted an empty "rest of the rdata".
+ * L32, L64, LP, and NID were missing from dns/rdtypes/ANY/__init__.py
+ * The type definition for dns.resolver.resolve_address() was incorrect.
+ * dns/win32util.py erroneously had the executable bit set.
+ * The type definition for a number of asynchronous query routines was
+   missing the default of None for the backend parameter.
+ * dns/tsigkeyring.py didn't import dns.tsig.
+ * A number of rdata types that have a "rest of the line" behavior for
+   the last field of the rdata erroneously permitted an empty string.
+ * Timeout intervals are no longer reported with absurd precision in
+   exception text.
+
+-------------------------------------------------------------------

Old:
----
  dnspython-2.2.0.tar.gz

New:
----
  dnspython-2.2.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-dnspython.spec ++++++
--- /var/tmp/diff_new_pack.OrfpJA/_old  2022-03-24 22:56:53.540185780 +0100
+++ /var/tmp/diff_new_pack.OrfpJA/_new  2022-03-24 22:56:53.544185784 +0100
@@ -28,7 +28,7 @@
 %{?!python_module:%define python_module() python3-%{**}}
 %define skip_python2 1
 Name:           python-dnspython%{psuffix}
-Version:        2.2.0
+Version:        2.2.1
 Release:        0
 Summary:        A DNS toolkit for Python
 License:        ISC

++++++ dnspython-2.2.0.tar.gz -> dnspython-2.2.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/PKG-INFO new/dnspython-2.2.1/PKG-INFO
--- old/dnspython-2.2.0/PKG-INFO        2022-01-18 14:25:28.352968000 +0100
+++ new/dnspython-2.2.1/PKG-INFO        2022-03-07 00:23:06.537618900 +0100
@@ -1,7 +1,8 @@
 Metadata-Version: 2.1
 Name: dnspython
-Version: 2.2.0
+Version: 2.2.1
 Summary: DNS toolkit
+Home-page: https://www.dnspython.org
 License: ISC
 Author: Bob Halley
 Author-email: hal...@dnspython.org
@@ -29,3 +30,92 @@
 Requires-Dist: sniffio (>=1.1,<2.0); extra == "curio"
 Requires-Dist: trio (>=0.14,<0.20); extra == "trio"
 Requires-Dist: wmi (>=1.5.1,<2.0.0); extra == "wmi"
+Project-URL: Bug Tracker, https://github.com/rthalley/dnspython/issues
+Project-URL: Documentation, https://dnspython.readthedocs.io/en/stable/
+Project-URL: Repository, https://github.com/rthalley/dnspython.git
+Description-Content-Type: text/markdown
+
+# dnspython
+
+[![Build 
Status](https://github.com/rthalley/dnspython/actions/workflows/python-package.yml/badge.svg)](https://github.com/rthalley/dnspython/actions/)
+[![Documentation 
Status](https://readthedocs.org/projects/dnspython/badge/?version=latest)](https://dnspython.readthedocs.io/en/latest/?badge=latest)
+[![PyPI 
version](https://badge.fury.io/py/dnspython.svg)](https://badge.fury.io/py/dnspython)
+[![License: 
ISC](https://img.shields.io/badge/License-ISC-brightgreen.svg)](https://opensource.org/licenses/ISC)
+
+## INTRODUCTION
+
+dnspython is a DNS toolkit for Python. It supports almost all record types. It
+can be used for queries, zone transfers, and dynamic updates. It supports TSIG
+authenticated messages and EDNS0.
+
+dnspython provides both high and low level access to DNS. The high level 
classes
+perform queries for data of a given name, type, and class, and return an answer
+set. The low level classes allow direct manipulation of DNS zones, messages,
+names, and records.
+
+To see a few of the ways dnspython can be used, look in the `examples/`
+directory.
+
+dnspython is a utility to work with DNS, `/etc/hosts` is thus not used. For
+simple forward DNS lookups, it's better to use `socket.getaddrinfo()` or
+`socket.gethostbyname()`.
+
+dnspython originated at Nominum where it was developed
+to facilitate the testing of DNS software.
+
+## ABOUT THIS RELEASE
+
+This is dnspython 2.2.1
+Please read
+[What's New](https://dnspython.readthedocs.io/en/stable/whatsnew.html) for
+information about the changes in this release.
+
+## INSTALLATION
+
+* Many distributions have dnspython packaged for you, so you should
+  check there first.
+* If you have pip installed, you can do `pip install dnspython`
+* If not just download the source file and unzip it, then run
+  `sudo python setup.py install`
+* To install the latest from the master branch, run `pip install 
git+https://github.com/rthalley/dnspython.git`
+
+Dnspython's default installation does not depend on any modules other than
+those in the Python standard library.  To use some features, additional modules
+must be installed.  For convenience, pip options are defined for the 
requirements.
+
+If you want to use DNS-over-HTTPS, run
+`pip install dnspython[doh]`.
+
+If you want to use DNSSEC functionality, run
+`pip install dnspython[dnssec]`.
+
+If you want to use internationalized domain names (IDNA)
+functionality, you must run
+`pip install dnspython[idna]`
+
+If you want to use the Trio asynchronous I/O package, run
+`pip install dnspython[trio]`.
+
+If you want to use the Curio asynchronous I/O package, run
+`pip install dnspython[curio]`.
+
+If you want to use WMI on Windows to determine the active DNS settings
+instead of the default registry scanning method, run
+`pip install dnspython[wmi]`.
+
+Note that you can install any combination of the above, e.g.:
+`pip install dnspython[doh,dnssec,idna]`
+
+### Notices
+
+Python 2.x support ended with the release of 1.16.0.  Dnspython 2.0.0 through
+2.2.x support Python 3.6 and later.  As of dnspython 2.3.0, the minimum
+supported Python version will be 3.7.  We plan to align future support with the
+lifetime of the Python 3 versions.
+
+Documentation has moved to
+[dnspython.readthedocs.io](https://dnspython.readthedocs.io).
+
+The ChangeLog has been discontinued.  Please see the github project page
+and git history for detailed change information.
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/README.md 
new/dnspython-2.2.1/README.md
--- old/dnspython-2.2.0/README.md       2022-01-18 14:24:24.957959000 +0100
+++ new/dnspython-2.2.1/README.md       2022-03-07 00:22:16.665122300 +0100
@@ -28,7 +28,7 @@
 
 ## ABOUT THIS RELEASE
 
-This is dnspython 2.2.0.
+This is dnspython 2.2.1
 Please read
 [What's New](https://dnspython.readthedocs.io/en/stable/whatsnew.html) for
 information about the changes in this release.
@@ -44,8 +44,7 @@
 
 Dnspython's default installation does not depend on any modules other than
 those in the Python standard library.  To use some features, additional modules
-must be installed.  For convenience, pip options are defined for the
-requirements.
+must be installed.  For convenience, pip options are defined for the 
requirements.
 
 If you want to use DNS-over-HTTPS, run
 `pip install dnspython[doh]`.
@@ -72,8 +71,10 @@
 
 ### Notices
 
-Python 2.x support ended with the release of 1.16.0.  dnspython 2.0.0 and
-later only support Python 3.6 and later.
+Python 2.x support ended with the release of 1.16.0.  Dnspython 2.0.0 through
+2.2.x support Python 3.6 and later.  As of dnspython 2.3.0, the minimum
+supported Python version will be 3.7.  We plan to align future support with the
+lifetime of the Python 3 versions.
 
 Documentation has moved to
 [dnspython.readthedocs.io](https://dnspython.readthedocs.io).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/_immutable_attr.py 
new/dnspython-2.2.1/dns/_immutable_attr.py
--- old/dnspython-2.2.0/dns/_immutable_attr.py  2022-01-18 14:24:20.383284300 
+0100
+++ new/dnspython-2.2.1/dns/_immutable_attr.py  2022-03-07 00:22:16.666126300 
+0100
@@ -49,7 +49,7 @@
             f(*args, **kwargs)
         finally:
             if not previous:
-                # If we started the initialzation, establish immutability
+                # If we started the initialization, establish immutability
                 # by removing the attribute that allows mutation
                 object.__delattr__(args[0], '_immutable_init')
     nf.__signature__ = inspect.signature(f)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/asyncquery.pyi 
new/dnspython-2.2.1/dns/asyncquery.pyi
--- old/dnspython-2.2.0/dns/asyncquery.pyi      2022-01-18 14:24:20.383865400 
+0100
+++ new/dnspython-2.2.1/dns/asyncquery.pyi      2022-03-07 00:22:16.667009800 
+0100
@@ -19,7 +19,7 @@
               one_rr_per_rrset : Optional[bool] = False,
               ignore_trailing : Optional[bool] = False,
               sock : Optional[asyncbackend.DatagramSocket] = None,
-              backend : Optional[asyncbackend.Backend]) -> message.Message:
+              backend : Optional[asyncbackend.Backend] = None) -> 
message.Message:
     pass
 
 async def tcp(q : message.Message, where : str, timeout : float = None, 
port=53,
@@ -28,7 +28,7 @@
         one_rr_per_rrset : Optional[bool] = False,
         ignore_trailing : Optional[bool] = False,
         sock : Optional[asyncbackend.StreamSocket] = None,
-        backend : Optional[asyncbackend.Backend]) -> message.Message:
+        backend : Optional[asyncbackend.Backend] = None) -> message.Message:
     pass
 
 async def tls(q : message.Message, where : str,
@@ -37,7 +37,7 @@
               one_rr_per_rrset : Optional[bool] = False,
               ignore_trailing : Optional[bool] = False,
               sock : Optional[asyncbackend.StreamSocket] = None,
-              backend : Optional[asyncbackend.Backend],
+              backend : Optional[asyncbackend.Backend] = None,
               ssl_context: Optional[ssl.SSLContext] = None,
               server_hostname: Optional[str] = None) -> message.Message:
     pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/dnssec.py 
new/dnspython-2.2.1/dns/dnssec.py
--- old/dnspython-2.2.0/dns/dnssec.py   2022-01-18 14:24:20.384198000 +0100
+++ new/dnspython-2.2.1/dns/dnssec.py   2022-03-07 00:22:16.667302400 +0100
@@ -108,7 +108,7 @@
         return total & 0xffff
 
 class DSDigest(dns.enum.IntEnum):
-    """DNSSEC Delgation Signer Digest Algorithm"""
+    """DNSSEC Delegation Signer Digest Algorithm"""
 
     SHA1 = 1
     SHA256 = 2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/exception.py 
new/dnspython-2.2.1/dns/exception.py
--- old/dnspython-2.2.0/dns/exception.py        2022-01-18 14:24:20.384895600 
+0100
+++ new/dnspython-2.2.1/dns/exception.py        2022-03-07 00:22:16.668151900 
+0100
@@ -125,7 +125,7 @@
 class Timeout(DNSException):
     """The DNS operation timed out."""
     supp_kwargs = {'timeout'}
-    fmt = "The DNS operation timed out after {timeout} seconds"
+    fmt = "The DNS operation timed out after {timeout:.3f} seconds"
 
 
 class ExceptionWrapper:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/exception.pyi 
new/dnspython-2.2.1/dns/exception.pyi
--- old/dnspython-2.2.0/dns/exception.pyi       2022-01-18 14:24:20.384949700 
+0100
+++ new/dnspython-2.2.1/dns/exception.pyi       2022-03-07 00:22:16.668414800 
+0100
@@ -8,3 +8,5 @@
 class SyntaxError(DNSException): ...
 class FormError(DNSException): ...
 class Timeout(DNSException): ...
+class TooBig(DNSException): ...
+class UnexpectedEnd(SyntaxError): ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/message.py 
new/dnspython-2.2.1/dns/message.py
--- old/dnspython-2.2.0/dns/message.py  2022-01-18 14:24:20.385894500 +0100
+++ new/dnspython-2.2.1/dns/message.py  2022-03-07 00:22:16.669144400 +0100
@@ -509,7 +509,7 @@
         expected to return a key.
 
         *keyname*, a ``dns.name.Name``, ``str`` or ``None``, the name of
-        thes TSIG key to use; defaults to ``None``.  If *keyring* is a
+        this TSIG key to use; defaults to ``None``.  If *keyring* is a
         ``dict``, the key must be defined in it.  If *keyring* is a
         ``dns.tsig.Key``, this is ignored.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/query.py 
new/dnspython-2.2.1/dns/query.py
--- old/dnspython-2.2.0/dns/query.py    2022-01-18 14:24:20.386944500 +0100
+++ new/dnspython-2.2.1/dns/query.py    2022-03-07 00:22:16.670580600 +0100
@@ -1085,10 +1085,10 @@
 
     *udp_mode*, a ``dns.query.UDPMode``, determines how UDP is used
     for IXFRs.  The default is ``dns.UDPMode.NEVER``, i.e. only use
-    TCP.  Other possibilites are ``dns.UDPMode.TRY_FIRST``, which
+    TCP.  Other possibilities are ``dns.UDPMode.TRY_FIRST``, which
     means "try UDP but fallback to TCP if needed", and
     ``dns.UDPMode.ONLY``, which means "try UDP and raise
-    ``dns.xfr.UseTCP`` if it does not succeeed.
+    ``dns.xfr.UseTCP`` if it does not succeed.
 
     Raises on errors.
     """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/rdata.py 
new/dnspython-2.2.1/dns/rdata.py
--- old/dnspython-2.2.0/dns/rdata.py    2022-01-18 14:24:20.387400200 +0100
+++ new/dnspython-2.2.1/dns/rdata.py    2022-03-07 00:22:16.671085400 +0100
@@ -557,7 +557,7 @@
             raise dns.exception.SyntaxError(
                 r'generic rdata does not start with \#')
         length = tok.get_int()
-        hex = tok.concatenate_remaining_identifiers().encode()
+        hex = tok.concatenate_remaining_identifiers(True).encode()
         data = binascii.unhexlify(hex)
         if len(data) != length:
             raise dns.exception.SyntaxError(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/rdataset.py 
new/dnspython-2.2.1/dns/rdataset.py
--- old/dnspython-2.2.0/dns/rdataset.py 2022-01-18 14:24:20.387832200 +0100
+++ new/dnspython-2.2.1/dns/rdataset.py 2022-03-07 00:22:16.671743600 +0100
@@ -312,7 +312,7 @@
     def processing_order(self):
         """Return rdatas in a valid processing order according to the type's
         specification.  For example, MX records are in preference order from
-        lowest to highest preferences, with items of the same perference
+        lowest to highest preferences, with items of the same preference
         shuffled.
 
         For types that do not define a processing order, the rdatas are
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/rdtypes/ANY/TKEY.py 
new/dnspython-2.2.1/dns/rdtypes/ANY/TKEY.py
--- old/dnspython-2.2.0/dns/rdtypes/ANY/TKEY.py 2022-01-18 14:24:20.394349300 
+0100
+++ new/dnspython-2.2.1/dns/rdtypes/ANY/TKEY.py 2022-03-07 00:22:16.677906800 
+0100
@@ -63,7 +63,7 @@
         error = tok.get_uint16()
         key_b64 = tok.get_string().encode()
         key = base64.b64decode(key_b64)
-        other_b64 = tok.concatenate_remaining_identifiers().encode()
+        other_b64 = tok.concatenate_remaining_identifiers(True).encode()
         other = base64.b64decode(other_b64)
 
         return cls(rdclass, rdtype, algorithm, inception, expiration, mode,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/rdtypes/ANY/__init__.py 
new/dnspython-2.2.1/dns/rdtypes/ANY/__init__.py
--- old/dnspython-2.2.0/dns/rdtypes/ANY/__init__.py     2022-01-18 
14:24:20.395202600 +0100
+++ new/dnspython-2.2.1/dns/rdtypes/ANY/__init__.py     2022-03-07 
00:22:16.678971300 +0100
@@ -37,8 +37,12 @@
     'HINFO',
     'HIP',
     'ISDN',
+    'L32',
+    'L64',
     'LOC',
+    'LP',
     'MX',
+    'NID',
     'NINFO',
     'NS',
     'NSEC',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/rdtypes/svcbbase.py 
new/dnspython-2.2.1/dns/rdtypes/svcbbase.py
--- old/dnspython-2.2.0/dns/rdtypes/svcbbase.py 2022-01-18 14:24:20.397728200 
+0100
+++ new/dnspython-2.2.1/dns/rdtypes/svcbbase.py 2022-03-07 00:22:16.682216000 
+0100
@@ -435,7 +435,7 @@
             if not isinstance(v, Param) and v is not None:
                 raise ValueError("not a Param")
         self.params = dns.immutable.Dict(params)
-        # Make sure any paramater listed as mandatory is present in the
+        # Make sure any parameter listed as mandatory is present in the
         # record.
         mandatory = params.get(ParamKey.MANDATORY)
         if mandatory:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/rdtypes/txtbase.pyi 
new/dnspython-2.2.1/dns/rdtypes/txtbase.pyi
--- old/dnspython-2.2.0/dns/rdtypes/txtbase.pyi 2022-01-18 14:24:20.398018800 
+0100
+++ new/dnspython-2.2.1/dns/rdtypes/txtbase.pyi 2022-03-07 00:22:16.682589000 
+0100
@@ -1,6 +1,12 @@
+import typing
 from .. import rdata
 
 class TXTBase(rdata.Rdata):
-    ...
+    strings: typing.Tuple[bytes, ...]
+
+    def __init__(self, rdclass: int, rdtype: int, strings: 
typing.Iterable[bytes]) -> None:
+        ...
+    def to_text(self, origin: typing.Any, relativize: bool, **kw: typing.Any) 
-> str:
+        ...
 class TXT(TXTBase):
     ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/renderer.py 
new/dnspython-2.2.1/dns/renderer.py
--- old/dnspython-2.2.0/dns/renderer.py 2022-01-18 14:24:20.398287000 +0100
+++ new/dnspython-2.2.1/dns/renderer.py 2022-03-07 00:22:16.682924500 +0100
@@ -49,8 +49,8 @@
         r.add_rrset(dns.renderer.ANSWER, rrset_2)
         r.add_rrset(dns.renderer.AUTHORITY, ns_rrset)
         r.add_edns(0, 0, 4096)
-        r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_1)
-        r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_2)
+        r.add_rrset(dns.renderer.ADDITIONAL, ad_rrset_1)
+        r.add_rrset(dns.renderer.ADDITIONAL, ad_rrset_2)
         r.write_header()
         r.add_tsig(keyname, secret, 300, 1, 0, '', request_mac)
         wire = r.get_wire()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/resolver.py 
new/dnspython-2.2.1/dns/resolver.py
--- old/dnspython-2.2.0/dns/resolver.py 2022-01-18 14:24:20.398558900 +0100
+++ new/dnspython-2.2.1/dns/resolver.py 2022-03-07 00:22:16.683373000 +0100
@@ -145,7 +145,7 @@
     """The resolution lifetime expired."""
 
     msg = "The resolution lifetime expired."
-    fmt = "%s after {timeout} seconds: {errors}" % msg[:-1]
+    fmt = "%s after {timeout:.3f} seconds: {errors}" % msg[:-1]
     supp_kwargs = {'timeout', 'errors'}
 
     def _fmt_kwargs(self, **kwargs):
@@ -1018,7 +1018,7 @@
         *source_port*, an ``int``, the port from which to send the message.
 
         *lifetime*, a ``float``, how many seconds a query should run
-         before timing out.
+        before timing out.
 
         *search*, a ``bool`` or ``None``, determines whether the
         search list configured in the system's resolver configuration
@@ -1101,7 +1101,7 @@
         """Query nameservers to find the answer to the question.
 
         This method calls resolve() with ``search=True``, and is
-        provided for backwards compatbility with prior versions of
+        provided for backwards compatibility with prior versions of
         dnspython.  See the documentation for the resolve() method for
         further details.
         """
@@ -1200,7 +1200,7 @@
     """Query nameservers to find the answer to the question.
 
     This method calls resolve() with ``search=True``, and is
-    provided for backwards compatbility with prior versions of
+    provided for backwards compatibility with prior versions of
     dnspython.  See the documentation for the resolve() method for
     further details.
     """
@@ -1253,7 +1253,7 @@
     root servers in your network and they are misconfigured.)
 
     Raises ``dns.resolver.LifetimeTimeout`` if the answer could not be
-    found in the alotted lifetime.
+    found in the allotted lifetime.
 
     Returns a ``dns.name.Name``.
     """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/resolver.pyi 
new/dnspython-2.2.1/dns/resolver.pyi
--- old/dnspython-2.2.0/dns/resolver.pyi        2022-01-18 14:24:20.398638500 
+0100
+++ new/dnspython-2.2.1/dns/resolver.pyi        2022-03-07 00:22:16.683576600 
+0100
@@ -25,7 +25,7 @@
           tcp=False, source=None, raise_on_no_answer=True,
           source_port=0, lifetime : Optional[float]=None):
     ...
-def resolve_address(self, ipaddr: str, *args: Any, **kwargs: Optional[Dict]):
+def resolve_address(ipaddr: str, *args: Any, **kwargs: Optional[Dict]):
     ...
 class LRUCache:
     def __init__(self, max_size=1000):
@@ -59,3 +59,8 @@
               raise_on_no_answer=True, source_port : int = 0,
               lifetime : Optional[float]=None):
         ...
+default_resolver: typing.Optional[Resolver]
+def reset_default_resolver() -> None:
+    ...
+def get_default_resolver() -> Resolver:
+    ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/tokenizer.py 
new/dnspython-2.2.1/dns/tokenizer.py
--- old/dnspython-2.2.0/dns/tokenizer.py        2022-01-18 14:24:20.399275000 
+0100
+++ new/dnspython-2.2.1/dns/tokenizer.py        2022-03-07 00:22:16.684173800 
+0100
@@ -600,9 +600,12 @@
                 break
         return tokens
 
-    def concatenate_remaining_identifiers(self):
+    def concatenate_remaining_identifiers(self, allow_empty=False):
         """Read the remaining tokens on the line, which should be identifiers.
 
+        Raises dns.exception.SyntaxError if there are no remaining tokens,
+        unless `allow_empty=True` is given.
+
         Raises dns.exception.SyntaxError if a token is seen that is not an
         identifier.
 
@@ -618,6 +621,8 @@
             if not token.is_identifier():
                 raise dns.exception.SyntaxError
             s += token.value
+        if not (allow_empty or s):
+            raise dns.exception.SyntaxError('expecting another identifier')
         return s
 
     def as_name(self, token, origin=None, relativize=False, 
relativize_to=None):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/transaction.py 
new/dnspython-2.2.1/dns/transaction.py
--- old/dnspython-2.2.0/dns/transaction.py      2022-01-18 14:24:20.399437200 
+0100
+++ new/dnspython-2.2.1/dns/transaction.py      2022-03-07 00:22:16.684280900 
+0100
@@ -389,7 +389,7 @@
             if rdataset.rdclass != self.manager.get_class():
                 raise ValueError(f'{method} has objects of wrong RdataClass')
             if rdataset.rdtype == dns.rdatatype.SOA:
-                (_, _, origin) = self.manager.origin_information()
+                (_, _, origin) = self._origin_information()
                 if name != origin:
                     raise ValueError(f'{method} has non-origin SOA')
             self._raise_if_not_empty(method, args)
@@ -560,7 +560,7 @@
         *commit*, a bool.  If ``True``, commit the transaction, otherwise
         roll it back.
 
-        If committing adn the commit fails, then roll back and raise an
+        If committing and the commit fails, then roll back and raise an
         exception.
         """
         raise NotImplementedError  # pragma: no cover
@@ -585,3 +585,12 @@
         Returns a node or ``None``.
         """
         raise NotImplementedError  # pragma: no cover
+
+    #
+    # Low-level API with a default implementation, in case a subclass needs
+    # to override.
+    #
+
+    def _origin_information(self):
+        # This is only used by _add()
+        return self.manager.origin_information()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/tsigkeyring.py 
new/dnspython-2.2.1/dns/tsigkeyring.py
--- old/dnspython-2.2.0/dns/tsigkeyring.py      2022-01-18 14:24:20.399701600 
+0100
+++ new/dnspython-2.2.1/dns/tsigkeyring.py      2022-03-07 00:22:16.684573200 
+0100
@@ -20,6 +20,7 @@
 import base64
 
 import dns.name
+import dns.tsig
 
 
 def from_text(textring):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/version.py 
new/dnspython-2.2.1/dns/version.py
--- old/dnspython-2.2.0/dns/version.py  2022-01-18 14:24:24.958204300 +0100
+++ new/dnspython-2.2.1/dns/version.py  2022-03-07 00:22:16.685033600 +0100
@@ -22,7 +22,7 @@
 #: MINOR
 MINOR = 2
 #: MICRO
-MICRO = 0
+MICRO = 1
 #: RELEASELEVEL
 RELEASELEVEL = 0x0f
 #: SERIAL
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/versioned.py 
new/dnspython-2.2.1/dns/versioned.py
--- old/dnspython-2.2.0/dns/versioned.py        2022-01-18 14:24:20.400241000 
+0100
+++ new/dnspython-2.2.1/dns/versioned.py        2022-03-07 00:22:16.685115300 
+0100
@@ -131,7 +131,7 @@
             #
             # We only wake one sleeper at a time, so it's important
             # that no event waiter can exit this method (e.g. via
-            # cancelation) without returning a transaction or waking
+            # cancellation) without returning a transaction or waking
             # someone else up.
             #
             # This is not a problem with Threading module threads as
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/dns/zone.py 
new/dnspython-2.2.1/dns/zone.py
--- old/dnspython-2.2.0/dns/zone.py     2022-01-18 14:24:20.400757800 +0100
+++ new/dnspython-2.2.1/dns/zone.py     2022-03-07 00:22:16.685707000 +0100
@@ -183,6 +183,11 @@
                     "name parameter must be a subdomain of the zone origin")
             if self.relativize:
                 name = name.relativize(self.origin)
+        elif not self.relativize:
+            # We have a relative name in a non-relative zone, so derelativize.
+            if self.origin is None:
+                raise KeyError('no zone origin is defined')
+            name = name.derelativize(self.origin)
         return name
 
     def __getitem__(self, key):
@@ -870,11 +875,20 @@
 
     def _validate_name(self, name):
         if name.is_absolute():
-            if not name.is_subdomain(self.zone.origin):
+            if self.origin is None:
+                # This should probably never happen as other code (e.g.
+                # _rr_line) will notice the lack of an origin before us, but
+                # we check just in case!
+                raise KeyError('no zone origin is defined')
+            if not name.is_subdomain(self.origin):
                 raise KeyError("name is not a subdomain of the zone origin")
             if self.zone.relativize:
-                # XXXRTH should it be an error if self.origin is still None?
                 name = name.relativize(self.origin)
+        elif not self.zone.relativize:
+            # We have a relative name in a non-relative zone, so derelativize.
+            if self.origin is None:
+                raise KeyError('no zone origin is defined')
+            name = name.derelativize(self.origin)
         return name
 
     def get_node(self, name):
@@ -1030,6 +1044,18 @@
     def _get_node(self, name):
         return self.version.get_node(name)
 
+    def _origin_information(self):
+        (absolute, relativize, effective) = self.manager.origin_information()
+        if absolute is None and self.version.origin is not None:
+            # No origin has been committed yet, but we've learned one as part 
of
+            # this txn.  Use it.
+            absolute = self.version.origin
+            if relativize:
+                effective = dns.name.empty
+            else:
+                effective = absolute
+        return (absolute, relativize, effective)
+
 
 def from_text(text, origin=None, rdclass=dns.rdataclass.IN,
               relativize=True, zone_factory=Zone, filename=None,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/pyproject.toml 
new/dnspython-2.2.1/pyproject.toml
--- old/dnspython-2.2.0/pyproject.toml  2022-01-18 14:24:24.958942700 +0100
+++ new/dnspython-2.2.1/pyproject.toml  2022-03-07 00:22:16.695105000 +0100
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "dnspython"
-version = "2.2.0"
+version = "2.2.1"
 description = "DNS toolkit"
 authors = ["Bob Halley <hal...@dnspython.org>"]
 license = "ISC"
@@ -27,6 +27,13 @@
     "**/.DS_Store",
     "**/__pycache__/**",
 ]
+readme = "README.md"
+homepage = "https://www.dnspython.org";
+repository = "https://github.com/rthalley/dnspython.git";
+documentation = "https://dnspython.readthedocs.io/en/stable/";
+
+[tool.poetry.urls]
+"Bug Tracker" = "https://github.com/rthalley/dnspython/issues";
 
 [tool.poetry.dependencies]
 python = "^3.6"
@@ -42,8 +49,7 @@
 wmi = {version="^1.5.1", optional=true}
 
 [tool.poetry.dev-dependencies]
-mypy = "^0.920"
-pytest = ">=5.4.1,<7"
+pytest = ">=5.4.1,<8"
 pytest-cov = "^3.0.0"
 flake8 = "^4.0.1"
 sphinx = "^4.0.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/setup.cfg 
new/dnspython-2.2.1/setup.cfg
--- old/dnspython-2.2.0/setup.cfg       2022-01-18 14:24:20.406987700 +0100
+++ new/dnspython-2.2.1/setup.cfg       2022-03-07 00:22:16.695211400 +0100
@@ -6,6 +6,10 @@
 license_file = LICENSE
 description = DNS toolkit
 url = http://www.dnspython.org
+project_urls =
+    Bug Tracker = https://github.com/rthalley/dnspython/issues
+    Documentation = https://dnspython.readthedocs.io/en/stable/
+    Source Code = https://github.com/rthalley/dnspython
 long_description = dnspython is a DNS toolkit for Python. It supports almost 
all
     record types. It can be used for queries, zone transfers, and dynamic
     updates.  It supports TSIG authenticated messages and EDNS0.
@@ -48,7 +52,7 @@
 DOH = httpx>=0.21.1; h2>=4.1.0; requests; requests-toolbelt
 IDNA = idna>=2.1
 DNSSEC = cryptography>=2.6
-trio = trio>=0.14.0; sniffio>=1.1
+trio = trio>=0.14.0
 curio = curio>=1.2; sniffio>=1.1
 wmi = wmi>=1.5.1
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/setup.py new/dnspython-2.2.1/setup.py
--- old/dnspython-2.2.0/setup.py        2022-01-18 14:25:28.352760000 +0100
+++ new/dnspython-2.2.1/setup.py        2022-03-07 00:23:06.537358000 +0100
@@ -18,14 +18,14 @@
 
 setup_kwargs = {
     'name': 'dnspython',
-    'version': '2.2.0',
+    'version': '2.2.1',
     'description': 'DNS toolkit',
-    'long_description': None,
+    'long_description': "# dnspython\n\n[![Build 
Status](https://github.com/rthalley/dnspython/actions/workflows/python-package.yml/badge.svg)](https://github.com/rthalley/dnspython/actions/)\n[![Documentation
 
Status](https://readthedocs.org/projects/dnspython/badge/?version=latest)](https://dnspython.readthedocs.io/en/latest/?badge=latest)\n[![PyPI
 
version](https://badge.fury.io/py/dnspython.svg)](https://badge.fury.io/py/dnspython)\n[![License:
 
ISC](https://img.shields.io/badge/License-ISC-brightgreen.svg)](https://opensource.org/licenses/ISC)\n\n##
 INTRODUCTION\n\ndnspython is a DNS toolkit for Python. It supports almost all 
record types. It\ncan be used for queries, zone transfers, and dynamic updates. 
It supports TSIG\nauthenticated messages and EDNS0.\n\ndnspython provides both 
high and low level access to DNS. The high level classes\nperform queries for 
data of a given name, type, and class, and return an answer\nset. The low level 
classes allow direct manipulation of DNS zon
 es, messages,\nnames, and records.\n\nTo see a few of the ways dnspython can 
be used, look in the `examples/`\ndirectory.\n\ndnspython is a utility to work 
with DNS, `/etc/hosts` is thus not used. For\nsimple forward DNS lookups, it's 
better to use `socket.getaddrinfo()` or\n`socket.gethostbyname()`.\n\ndnspython 
originated at Nominum where it was developed\nto facilitate the testing of DNS 
software.\n\n## ABOUT THIS RELEASE\n\nThis is dnspython 2.2.1\nPlease 
read\n[What's New](https://dnspython.readthedocs.io/en/stable/whatsnew.html) 
for\ninformation about the changes in this release.\n\n## INSTALLATION\n\n* 
Many distributions have dnspython packaged for you, so you should\n  check 
there first.\n* If you have pip installed, you can do `pip install 
dnspython`\n* If not just download the source file and unzip it, then run\n  
`sudo python setup.py install`\n* To install the latest from the master branch, 
run `pip install git+https://github.com/rthalley/dnspython.git`\n\nDnspython's 
de
 fault installation does not depend on any modules other than\nthose in the 
Python standard library.  To use some features, additional modules\nmust be 
installed.  For convenience, pip options are defined for the 
requirements.\n\nIf you want to use DNS-over-HTTPS, run\n`pip install 
dnspython[doh]`.\n\nIf you want to use DNSSEC functionality, run\n`pip install 
dnspython[dnssec]`.\n\nIf you want to use internationalized domain names 
(IDNA)\nfunctionality, you must run\n`pip install dnspython[idna]`\n\nIf you 
want to use the Trio asynchronous I/O package, run\n`pip install 
dnspython[trio]`.\n\nIf you want to use the Curio asynchronous I/O package, 
run\n`pip install dnspython[curio]`.\n\nIf you want to use WMI on Windows to 
determine the active DNS settings\ninstead of the default registry scanning 
method, run\n`pip install dnspython[wmi]`.\n\nNote that you can install any 
combination of the above, e.g.:\n`pip install 
dnspython[doh,dnssec,idna]`\n\n### Notices\n\nPython 2.x support ended
  with the release of 1.16.0.  Dnspython 2.0.0 through\n2.2.x support Python 
3.6 and later.  As of dnspython 2.3.0, the minimum\nsupported Python version 
will be 3.7.  We plan to align future support with the\nlifetime of the Python 
3 versions.\n\nDocumentation has moved 
to\n[dnspython.readthedocs.io](https://dnspython.readthedocs.io).\n\nThe 
ChangeLog has been discontinued.  Please see the github project page\nand git 
history for detailed change information.\n",
     'author': 'Bob Halley',
     'author_email': 'hal...@dnspython.org',
     'maintainer': None,
     'maintainer_email': None,
-    'url': None,
+    'url': 'https://www.dnspython.org',
     'packages': packages,
     'package_data': package_data,
     'extras_require': extras_require,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/tests/nanonameserver.py 
new/dnspython-2.2.1/tests/nanonameserver.py
--- old/dnspython-2.2.0/tests/nanonameserver.py 2022-01-18 14:24:20.408140400 
+0100
+++ new/dnspython-2.2.1/tests/nanonameserver.py 2022-03-07 00:22:16.697165500 
+0100
@@ -215,7 +215,7 @@
             except Exception:
                 # We could try to make a response from only the header
                 # if dnspython had a header_only option to
-                # from_wire(), or if we truncated wire outselves, but
+                # from_wire(), or if we truncated wire ourselves, but
                 # for now we just drop.
                 return
         try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/tests/test_dnssec.py 
new/dnspython-2.2.1/tests/test_dnssec.py
--- old/dnspython-2.2.0/tests/test_dnssec.py    2022-01-18 14:24:20.409108200 
+0100
+++ new/dnspython-2.2.1/tests/test_dnssec.py    2022-03-07 00:22:16.698422700 
+0100
@@ -533,7 +533,8 @@
         dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.CDS, f'0 0 0 00')
 
         test_records = {
-            'digest length inconsistent with digest type': ['0 0 0', '0 0 0 
0000'],
+            'expecting another identifier': ['0 0 0', '0 0 0 '],
+            'digest length inconsistent with digest type': ['0 0 0 0000'],
             'Odd-length string': ['0 0 0 0', '0 0 0 000'],
         }
         for msg, records in test_records.items():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/tests/test_message.py 
new/dnspython-2.2.1/tests/test_message.py
--- old/dnspython-2.2.0/tests/test_message.py   2022-01-18 14:24:20.410071800 
+0100
+++ new/dnspython-2.2.1/tests/test_message.py   2022-03-07 00:22:16.699801000 
+0100
@@ -468,7 +468,7 @@
         self.assertEqual(te.message(), q)
 
     def test_bad_opt(self):
-        # Not in addtional
+        # Not in additional
         q = dns.message.Message(id=1)
         opt = dns.rdtypes.ANY.OPT.OPT(1200, dns.rdatatype.OPT, ())
         rrs = dns.rrset.from_rdata(dns.name.root, 0, opt)
@@ -494,7 +494,7 @@
 
     def test_bad_tsig(self):
         keyname = dns.name.from_text('key.')
-        # Not in addtional
+        # Not in additional
         q = dns.message.Message(id=1)
         tsig = dns.rdtypes.ANY.TSIG.TSIG(dns.rdataclass.ANY, 
dns.rdatatype.TSIG,
                                          dns.tsig.HMAC_SHA256, 0, 300, b'1234',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/tests/test_rdata.py 
new/dnspython-2.2.1/tests/test_rdata.py
--- old/dnspython-2.2.0/tests/test_rdata.py     2022-01-18 14:24:20.411121100 
+0100
+++ new/dnspython-2.2.1/tests/test_rdata.py     2022-03-07 00:22:16.700973500 
+0100
@@ -539,6 +539,9 @@
         with self.assertRaises(dns.exception.SyntaxError):
             dns.rdata.from_text('in', 'type45678', '\\# 6 000a03666f6f00')
 
+    def test_empty_generic(self):
+        dns.rdata.from_text('in', 'type45678', r'\# 0')
+
     def test_covered_repr(self):
         text = 'NSEC 1 3 3600 20190101000000 20030101000000 ' + \
             '2143 foo Ym9ndXM='
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/tests/test_tokenizer.py 
new/dnspython-2.2.1/tests/test_tokenizer.py
--- old/dnspython-2.2.0/tests/test_tokenizer.py 2022-01-18 14:24:20.412985600 
+0100
+++ new/dnspython-2.2.1/tests/test_tokenizer.py 2022-03-07 00:22:16.703254500 
+0100
@@ -325,7 +325,7 @@
 
     def testBadConcatenateRemaining(self):
         with self.assertRaises(dns.exception.SyntaxError):
-            tok = dns.tokenizer.Tokenizer('a b "not an identifer" c')
+            tok = dns.tokenizer.Tokenizer('a b "not an identifier" c')
             tok.concatenate_remaining_identifiers()
 
     def testStdinFilename(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dnspython-2.2.0/tests/test_zone.py 
new/dnspython-2.2.1/tests/test_zone.py
--- old/dnspython-2.2.0/tests/test_zone.py      2022-01-18 14:24:20.414135200 
+0100
+++ new/dnspython-2.2.1/tests/test_zone.py      2022-03-07 00:22:16.704584000 
+0100
@@ -499,6 +499,13 @@
         rds = z.get_rdataset('@', 'loc')
         self.assertTrue(rds is None)
 
+    def testGetRdatasetWithRelativeNameFromAbsoluteZone(self):
+        z = dns.zone.from_text(example_text, 'example.', relativize=False)
+        rds = z.get_rdataset(dns.name.empty, 'soa')
+        self.assertIsNotNone(rds)
+        exrds = dns.rdataset.from_text('IN', 'SOA', 300, 'foo.example. 
bar.example. 1 2 3 4 5')
+        self.assertEqual(rds, exrds)
+
     def testGetRRset1(self):
         z = dns.zone.from_text(example_text, 'example.', relativize=True)
         rrs = z.get_rrset('@', 'soa')
@@ -801,7 +808,7 @@
         self.assertEqual(rrs[0].target, n2008)
 
     def testZoneMiscCases(self):
-        # test that leading whitespace folllowed by EOL is treated like
+        # test that leading whitespace followed by EOL is treated like
         # a blank line, and that out-of-zone names are dropped.
         z1 = dns.zone.from_text(misc_cases_input, 'example.')
         z2 = dns.zone.from_text(misc_cases_expected, 'example.')
@@ -1012,6 +1019,20 @@
             rds = txn.get('example.', 'soa')
             self.assertEqual(rds[0].serial, 1)
 
+    def testNoRelativizeReaderOriginInText(self):
+        z = dns.zone.from_text(example_text, relativize=False,
+                               zone_factory=dns.versioned.Zone)
+        with z.reader(serial=1) as txn:
+            rds = txn.get('example.', 'soa')
+            self.assertEqual(rds[0].serial, 1)
+
+    def testNoRelativizeReaderAbsoluteGet(self):
+        z = dns.zone.from_text(example_text, 'example.', relativize=False,
+                               zone_factory=dns.versioned.Zone)
+        with z.reader(serial=1) as txn:
+            rds = txn.get(dns.name.empty, 'soa')
+            self.assertEqual(rds[0].serial, 1)
+
     def testCnameAndOtherDataAddOther(self):
         z = dns.zone.from_text(example_cname, 'example.', relativize=True,
                                zone_factory=dns.versioned.Zone)

Reply via email to