Hello community, here is the log from the commit of package python-certbot-dns-nsone for openSUSE:Factory checked in at 2020-01-03 17:39:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-certbot-dns-nsone (Old) and /work/SRC/openSUSE:Factory/.python-certbot-dns-nsone.new.6675 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-certbot-dns-nsone" Fri Jan 3 17:39:19 2020 rev:15 rq:760663 version:1.0.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-certbot-dns-nsone/python-certbot-dns-nsone.changes 2019-11-15 00:27:58.351790157 +0100 +++ /work/SRC/openSUSE:Factory/.python-certbot-dns-nsone.new.6675/python-certbot-dns-nsone.changes 2020-01-03 17:39:40.707378643 +0100 @@ -1,0 +2,6 @@ +Fri Jan 3 13:09:57 UTC 2020 - Marketa Calabkova <mcalabk...@suse.com> + +- update to version 1.0.0 + * sync with main certbot package + +------------------------------------------------------------------- Old: ---- certbot-dns-nsone-0.40.1.tar.gz New: ---- certbot-dns-nsone-1.0.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-certbot-dns-nsone.spec ++++++ --- /var/tmp/diff_new_pack.aD1sZD/_old 2020-01-03 17:39:41.199378896 +0100 +++ /var/tmp/diff_new_pack.aD1sZD/_new 2020-01-03 17:39:41.199378896 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-certbot-dns-nsone # -# Copyright (c) 2019 SUSE LLC. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,20 +18,21 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-certbot-dns-nsone -Version: 0.40.1 +Version: 1.0.0 Release: 0 Summary: NS1 Authenticator plugin for Certbot License: Apache-2.0 URL: https://github.com/certbot/certbot Source: https://files.pythonhosted.org/packages/source/c/certbot-dns-nsone/certbot-dns-nsone-%{version}.tar.gz -BuildRequires: %{python_module certbot >= 0.34.0} +BuildRequires: %{python_module certbot >= 1.0.0} BuildRequires: %{python_module dns-lexicon >= 2.2.1} BuildRequires: %{python_module mock} +BuildRequires: %{python_module pytest} BuildRequires: %{python_module setuptools} BuildRequires: fdupes BuildRequires: python-rpm-macros -Requires: python-acme >= 0.29.0 -Requires: python-certbot >= 0.34.0 +Requires: python-acme >= 0.31.0 +Requires: python-certbot >= 1.0.0 Requires: python-dns-lexicon >= 2.2.1 Requires: python-zope.interface BuildArch: noarch ++++++ certbot-dns-nsone-0.40.1.tar.gz -> certbot-dns-nsone-1.0.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/MANIFEST.in new/certbot-dns-nsone-1.0.0/MANIFEST.in --- old/certbot-dns-nsone-0.40.1/MANIFEST.in 2019-11-06 03:24:51.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/MANIFEST.in 2019-12-03 18:20:30.000000000 +0100 @@ -1,3 +1,6 @@ include LICENSE.txt include README.rst recursive-include docs * +recursive-include tests * +global-exclude __pycache__ +global-exclude *.py[cod] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/PKG-INFO new/certbot-dns-nsone-1.0.0/PKG-INFO --- old/certbot-dns-nsone-0.40.1/PKG-INFO 2019-11-06 03:25:20.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/PKG-INFO 2019-12-03 18:21:10.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: certbot-dns-nsone -Version: 0.40.1 +Version: 1.0.0 Summary: NS1 DNS Authenticator plugin for Certbot Home-page: https://github.com/certbot/certbot Author: Certbot Project diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/certbot_dns_nsone/_internal/__init__.py new/certbot-dns-nsone-1.0.0/certbot_dns_nsone/_internal/__init__.py --- old/certbot-dns-nsone-0.40.1/certbot_dns_nsone/_internal/__init__.py 1970-01-01 01:00:00.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/certbot_dns_nsone/_internal/__init__.py 2019-12-03 18:20:30.000000000 +0100 @@ -0,0 +1 @@ +"""Internal implementation of `~certbot_dns_nsone.dns_nsone` plugin.""" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/certbot_dns_nsone/_internal/dns_nsone.py new/certbot-dns-nsone-1.0.0/certbot_dns_nsone/_internal/dns_nsone.py --- old/certbot-dns-nsone-0.40.1/certbot_dns_nsone/_internal/dns_nsone.py 1970-01-01 01:00:00.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/certbot_dns_nsone/_internal/dns_nsone.py 2019-12-03 18:20:30.000000000 +0100 @@ -0,0 +1,85 @@ +"""DNS Authenticator for NS1 DNS.""" +import logging + +import zope.interface +from lexicon.providers import nsone + +from certbot import errors +from certbot import interfaces +from certbot.plugins import dns_common +from certbot.plugins import dns_common_lexicon + +logger = logging.getLogger(__name__) + +ACCOUNT_URL = 'https://my.nsone.net/#/account/settings' + + +@zope.interface.implementer(interfaces.IAuthenticator) +@zope.interface.provider(interfaces.IPluginFactory) +class Authenticator(dns_common.DNSAuthenticator): + """DNS Authenticator for NS1 + + This Authenticator uses the NS1 API to fulfill a dns-01 challenge. + """ + + description = 'Obtain certificates using a DNS TXT record (if you are using NS1 for DNS).' + ttl = 60 + + def __init__(self, *args, **kwargs): + super(Authenticator, self).__init__(*args, **kwargs) + self.credentials = None + + @classmethod + def add_parser_arguments(cls, add): # pylint: disable=arguments-differ + super(Authenticator, cls).add_parser_arguments(add, default_propagation_seconds=30) + add('credentials', help='NS1 credentials file.') + + def more_info(self): # pylint: disable=missing-docstring,no-self-use + return 'This plugin configures a DNS TXT record to respond to a dns-01 challenge using ' + \ + 'the NS1 API.' + + def _setup_credentials(self): + self.credentials = self._configure_credentials( + 'credentials', + 'NS1 credentials file', + { + 'api-key': 'API key for NS1 API, obtained from {0}'.format(ACCOUNT_URL) + } + ) + + def _perform(self, domain, validation_name, validation): + self._get_nsone_client().add_txt_record(domain, validation_name, validation) + + def _cleanup(self, domain, validation_name, validation): + self._get_nsone_client().del_txt_record(domain, validation_name, validation) + + def _get_nsone_client(self): + return _NS1LexiconClient(self.credentials.conf('api-key'), self.ttl) + + +class _NS1LexiconClient(dns_common_lexicon.LexiconClient): + """ + Encapsulates all communication with the NS1 via Lexicon. + """ + + def __init__(self, api_key, ttl): + super(_NS1LexiconClient, self).__init__() + + config = dns_common_lexicon.build_lexicon_config('nsone', { + 'ttl': ttl, + }, { + 'auth_token': api_key, + }) + + self.provider = nsone.Provider(config) + + def _handle_http_error(self, e, domain_name): + if domain_name in str(e) and (str(e).startswith('404 Client Error: Not Found for url:') or \ + str(e).startswith("400 Client Error: Bad Request for url:")): + return None # Expected errors when zone name guess is wrong + hint = None + if str(e).startswith('401 Client Error: Unauthorized for url:'): + hint = 'Is your API key correct?' + + return errors.PluginError('Error determining zone identifier: {0}.{1}' + .format(e, ' ({0})'.format(hint) if hint else '')) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/certbot_dns_nsone/dns_nsone.py new/certbot-dns-nsone-1.0.0/certbot_dns_nsone/dns_nsone.py --- old/certbot-dns-nsone-0.40.1/certbot_dns_nsone/dns_nsone.py 2019-11-06 03:24:51.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/certbot_dns_nsone/dns_nsone.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,85 +0,0 @@ -"""DNS Authenticator for NS1 DNS.""" -import logging - -import zope.interface -from lexicon.providers import nsone - -from certbot import errors -from certbot import interfaces -from certbot.plugins import dns_common -from certbot.plugins import dns_common_lexicon - -logger = logging.getLogger(__name__) - -ACCOUNT_URL = 'https://my.nsone.net/#/account/settings' - - -@zope.interface.implementer(interfaces.IAuthenticator) -@zope.interface.provider(interfaces.IPluginFactory) -class Authenticator(dns_common.DNSAuthenticator): - """DNS Authenticator for NS1 - - This Authenticator uses the NS1 API to fulfill a dns-01 challenge. - """ - - description = 'Obtain certificates using a DNS TXT record (if you are using NS1 for DNS).' - ttl = 60 - - def __init__(self, *args, **kwargs): - super(Authenticator, self).__init__(*args, **kwargs) - self.credentials = None - - @classmethod - def add_parser_arguments(cls, add): # pylint: disable=arguments-differ - super(Authenticator, cls).add_parser_arguments(add, default_propagation_seconds=30) - add('credentials', help='NS1 credentials file.') - - def more_info(self): # pylint: disable=missing-docstring,no-self-use - return 'This plugin configures a DNS TXT record to respond to a dns-01 challenge using ' + \ - 'the NS1 API.' - - def _setup_credentials(self): - self.credentials = self._configure_credentials( - 'credentials', - 'NS1 credentials file', - { - 'api-key': 'API key for NS1 API, obtained from {0}'.format(ACCOUNT_URL) - } - ) - - def _perform(self, domain, validation_name, validation): - self._get_nsone_client().add_txt_record(domain, validation_name, validation) - - def _cleanup(self, domain, validation_name, validation): - self._get_nsone_client().del_txt_record(domain, validation_name, validation) - - def _get_nsone_client(self): - return _NS1LexiconClient(self.credentials.conf('api-key'), self.ttl) - - -class _NS1LexiconClient(dns_common_lexicon.LexiconClient): - """ - Encapsulates all communication with the NS1 via Lexicon. - """ - - def __init__(self, api_key, ttl): - super(_NS1LexiconClient, self).__init__() - - config = dns_common_lexicon.build_lexicon_config('nsone', { - 'ttl': ttl, - }, { - 'auth_token': api_key, - }) - - self.provider = nsone.Provider(config) - - def _handle_http_error(self, e, domain_name): - if domain_name in str(e) and (str(e).startswith('404 Client Error: Not Found for url:') or \ - str(e).startswith("400 Client Error: Bad Request for url:")): - return None # Expected errors when zone name guess is wrong - hint = None - if str(e).startswith('401 Client Error: Unauthorized for url:'): - hint = 'Is your API key correct?' - - return errors.PluginError('Error determining zone identifier: {0}.{1}' - .format(e, ' ({0})'.format(hint) if hint else '')) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/certbot_dns_nsone/dns_nsone_test.py new/certbot-dns-nsone-1.0.0/certbot_dns_nsone/dns_nsone_test.py --- old/certbot-dns-nsone-0.40.1/certbot_dns_nsone/dns_nsone_test.py 2019-11-06 03:24:51.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/certbot_dns_nsone/dns_nsone_test.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,52 +0,0 @@ -"""Tests for certbot_dns_nsone.dns_nsone.""" - -import unittest - -import mock -from requests.exceptions import HTTPError - -from certbot.compat import os -from certbot.plugins import dns_test_common -from certbot.plugins import dns_test_common_lexicon -from certbot.plugins.dns_test_common import DOMAIN -from certbot.tests import util as test_util - -API_KEY = 'foo' - - -class AuthenticatorTest(test_util.TempDirTestCase, - dns_test_common_lexicon.BaseLexiconAuthenticatorTest): - - def setUp(self): - super(AuthenticatorTest, self).setUp() - - from certbot_dns_nsone.dns_nsone import Authenticator - - path = os.path.join(self.tempdir, 'file.ini') - dns_test_common.write({"nsone_api_key": API_KEY}, path) - - self.config = mock.MagicMock(nsone_credentials=path, - nsone_propagation_seconds=0) # don't wait during tests - - self.auth = Authenticator(self.config, "nsone") - - self.mock_client = mock.MagicMock() - # _get_nsone_client | pylint: disable=protected-access - self.auth._get_nsone_client = mock.MagicMock(return_value=self.mock_client) - - -class NS1LexiconClientTest(unittest.TestCase, dns_test_common_lexicon.BaseLexiconClientTest): - DOMAIN_NOT_FOUND = HTTPError('404 Client Error: Not Found for url: {0}.'.format(DOMAIN)) - LOGIN_ERROR = HTTPError('401 Client Error: Unauthorized for url: {0}.'.format(DOMAIN)) - - def setUp(self): - from certbot_dns_nsone.dns_nsone import _NS1LexiconClient - - self.client = _NS1LexiconClient(API_KEY, 0) - - self.provider_mock = mock.MagicMock() - self.client.provider = self.provider_mock - - -if __name__ == "__main__": - unittest.main() # pragma: no cover diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/certbot_dns_nsone.egg-info/PKG-INFO new/certbot-dns-nsone-1.0.0/certbot_dns_nsone.egg-info/PKG-INFO --- old/certbot-dns-nsone-0.40.1/certbot_dns_nsone.egg-info/PKG-INFO 2019-11-06 03:25:20.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/certbot_dns_nsone.egg-info/PKG-INFO 2019-12-03 18:21:10.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: certbot-dns-nsone -Version: 0.40.1 +Version: 1.0.0 Summary: NS1 DNS Authenticator plugin for Certbot Home-page: https://github.com/certbot/certbot Author: Certbot Project diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/certbot_dns_nsone.egg-info/SOURCES.txt new/certbot-dns-nsone-1.0.0/certbot_dns_nsone.egg-info/SOURCES.txt --- old/certbot-dns-nsone-0.40.1/certbot_dns_nsone.egg-info/SOURCES.txt 2019-11-06 03:25:20.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/certbot_dns_nsone.egg-info/SOURCES.txt 2019-12-03 18:21:10.000000000 +0100 @@ -4,18 +4,18 @@ setup.cfg setup.py certbot_dns_nsone/__init__.py -certbot_dns_nsone/dns_nsone.py -certbot_dns_nsone/dns_nsone_test.py certbot_dns_nsone.egg-info/PKG-INFO certbot_dns_nsone.egg-info/SOURCES.txt certbot_dns_nsone.egg-info/dependency_links.txt certbot_dns_nsone.egg-info/entry_points.txt certbot_dns_nsone.egg-info/requires.txt certbot_dns_nsone.egg-info/top_level.txt +certbot_dns_nsone/_internal/__init__.py +certbot_dns_nsone/_internal/dns_nsone.py docs/.gitignore docs/Makefile docs/api.rst docs/conf.py docs/index.rst docs/make.bat -docs/api/dns_nsone.rst \ No newline at end of file +tests/dns_nsone_test.py \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/certbot_dns_nsone.egg-info/entry_points.txt new/certbot-dns-nsone-1.0.0/certbot_dns_nsone.egg-info/entry_points.txt --- old/certbot-dns-nsone-0.40.1/certbot_dns_nsone.egg-info/entry_points.txt 2019-11-06 03:25:20.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/certbot_dns_nsone.egg-info/entry_points.txt 2019-12-03 18:21:10.000000000 +0100 @@ -1,3 +1,3 @@ [certbot.plugins] -dns-nsone = certbot_dns_nsone.dns_nsone:Authenticator +dns-nsone = certbot_dns_nsone._internal.dns_nsone:Authenticator diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/docs/api/dns_nsone.rst new/certbot-dns-nsone-1.0.0/docs/api/dns_nsone.rst --- old/certbot-dns-nsone-0.40.1/docs/api/dns_nsone.rst 2019-11-06 03:24:51.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/docs/api/dns_nsone.rst 1970-01-01 01:00:00.000000000 +0100 @@ -1,5 +0,0 @@ -:mod:`certbot_dns_nsone.dns_nsone` ----------------------------------- - -.. automodule:: certbot_dns_nsone.dns_nsone - :members: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/docs/api.rst new/certbot-dns-nsone-1.0.0/docs/api.rst --- old/certbot-dns-nsone-0.40.1/docs/api.rst 2019-11-06 03:24:51.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/docs/api.rst 2019-12-03 18:20:30.000000000 +0100 @@ -2,7 +2,4 @@ API Documentation ================= -.. toctree:: - :glob: - - api/** +Certbot plugins implement the Certbot plugins API, and do not otherwise have an external API. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/setup.py new/certbot-dns-nsone-1.0.0/setup.py --- old/certbot-dns-nsone-0.40.1/setup.py 2019-11-06 03:24:52.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/setup.py 2019-12-03 18:20:32.000000000 +0100 @@ -1,8 +1,10 @@ from setuptools import setup from setuptools import find_packages +from setuptools.command.test import test as TestCommand +import sys -version = '0.40.1' +version = '1.0.0' # Remember to update local-oldest-requirements.txt when changing the minimum # acme/certbot version. @@ -20,6 +22,20 @@ 'sphinx_rtd_theme', ] +class PyTest(TestCommand): + user_options = [] + + def initialize_options(self): + TestCommand.initialize_options(self) + self.pytest_args = '' + + def run_tests(self): + import shlex + # import here, cause outside the eggs aren't loaded + import pytest + errno = pytest.main(shlex.split(self.pytest_args)) + sys.exit(errno) + setup( name='certbot-dns-nsone', version=version, @@ -60,8 +76,10 @@ }, entry_points={ 'certbot.plugins': [ - 'dns-nsone = certbot_dns_nsone.dns_nsone:Authenticator', + 'dns-nsone = certbot_dns_nsone._internal.dns_nsone:Authenticator', ], }, + tests_require=["pytest"], test_suite='certbot_dns_nsone', + cmdclass={"test": PyTest}, ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/certbot-dns-nsone-0.40.1/tests/dns_nsone_test.py new/certbot-dns-nsone-1.0.0/tests/dns_nsone_test.py --- old/certbot-dns-nsone-0.40.1/tests/dns_nsone_test.py 1970-01-01 01:00:00.000000000 +0100 +++ new/certbot-dns-nsone-1.0.0/tests/dns_nsone_test.py 2019-12-03 18:20:30.000000000 +0100 @@ -0,0 +1,52 @@ +"""Tests for certbot_dns_nsone._internal.dns_nsone.""" + +import unittest + +import mock +from requests.exceptions import HTTPError + +from certbot.compat import os +from certbot.plugins import dns_test_common +from certbot.plugins import dns_test_common_lexicon +from certbot.plugins.dns_test_common import DOMAIN +from certbot.tests import util as test_util + +API_KEY = 'foo' + + +class AuthenticatorTest(test_util.TempDirTestCase, + dns_test_common_lexicon.BaseLexiconAuthenticatorTest): + + def setUp(self): + super(AuthenticatorTest, self).setUp() + + from certbot_dns_nsone._internal.dns_nsone import Authenticator + + path = os.path.join(self.tempdir, 'file.ini') + dns_test_common.write({"nsone_api_key": API_KEY}, path) + + self.config = mock.MagicMock(nsone_credentials=path, + nsone_propagation_seconds=0) # don't wait during tests + + self.auth = Authenticator(self.config, "nsone") + + self.mock_client = mock.MagicMock() + # _get_nsone_client | pylint: disable=protected-access + self.auth._get_nsone_client = mock.MagicMock(return_value=self.mock_client) + + +class NS1LexiconClientTest(unittest.TestCase, dns_test_common_lexicon.BaseLexiconClientTest): + DOMAIN_NOT_FOUND = HTTPError('404 Client Error: Not Found for url: {0}.'.format(DOMAIN)) + LOGIN_ERROR = HTTPError('401 Client Error: Unauthorized for url: {0}.'.format(DOMAIN)) + + def setUp(self): + from certbot_dns_nsone._internal.dns_nsone import _NS1LexiconClient + + self.client = _NS1LexiconClient(API_KEY, 0) + + self.provider_mock = mock.MagicMock() + self.client.provider = self.provider_mock + + +if __name__ == "__main__": + unittest.main() # pragma: no cover