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 + +[](https://github.com/rthalley/dnspython/actions/) +[](https://dnspython.readthedocs.io/en/latest/?badge=latest) +[](https://badge.fury.io/py/dnspython) +[](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[](https://github.com/rthalley/dnspython/actions/)\n[](https://dnspython.readthedocs.io/en/latest/?badge=latest)\n[](https://badge.fury.io/py/dnspython)\n[](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)