tests: Bump Django ModuleFinder test cases

Preperation for Python 3.11 support
pull/1016/head
Alex Willmer 1 year ago
parent 6258365df6
commit 98d110ed16

@ -0,0 +1,186 @@
{
"find_related_imports": {
"django.db": [
"django",
"django.core",
"django.core.signals",
"django.db.utils"
],
"django.db.models": [
"django",
"django.core.exceptions",
"django.db",
"django.db.models",
"django.db.models.aggregates",
"django.db.models.base",
"django.db.models.deletion",
"django.db.models.expressions",
"django.db.models.fields",
"django.db.models.fields.files",
"django.db.models.fields.proxy",
"django.db.models.fields.related",
"django.db.models.indexes",
"django.db.models.lookups",
"django.db.models.manager",
"django.db.models.query",
"django.db.models.signals"
]
},
"find_related": {
"django.db": [
"django",
"django.conf",
"django.conf.global_settings",
"django.core",
"django.core.exceptions",
"django.core.signals",
"django.db.utils",
"django.dispatch",
"django.dispatch.dispatcher",
"django.dispatch.weakref_backports",
"django.utils",
"django.utils._os",
"django.utils.deprecation",
"django.utils.encoding",
"django.utils.functional",
"django.utils.inspect",
"django.utils.lru_cache",
"django.utils.module_loading",
"django.utils.six",
"django.utils.version"
],
"django.db.models": [
"django",
"django.apps",
"django.apps.config",
"django.apps.registry",
"django.conf",
"django.conf.global_settings",
"django.core",
"django.core.cache",
"django.core.cache.backends",
"django.core.cache.backends.base",
"django.core.checks",
"django.core.checks.caches",
"django.core.checks.compatibility",
"django.core.checks.compatibility.django_1_10",
"django.core.checks.compatibility.django_1_8_0",
"django.core.checks.database",
"django.core.checks.messages",
"django.core.checks.model_checks",
"django.core.checks.registry",
"django.core.checks.security",
"django.core.checks.security.base",
"django.core.checks.security.csrf",
"django.core.checks.security.sessions",
"django.core.checks.templates",
"django.core.checks.urls",
"django.core.checks.utils",
"django.core.exceptions",
"django.core.files",
"django.core.files.base",
"django.core.files.images",
"django.core.files.locks",
"django.core.files.move",
"django.core.files.storage",
"django.core.files.utils",
"django.core.signals",
"django.core.validators",
"django.db",
"django.db.backends",
"django.db.backends.utils",
"django.db.models.aggregates",
"django.db.models.base",
"django.db.models.constants",
"django.db.models.deletion",
"django.db.models.expressions",
"django.db.models.fields",
"django.db.models.fields.files",
"django.db.models.fields.proxy",
"django.db.models.fields.related",
"django.db.models.fields.related_descriptors",
"django.db.models.fields.related_lookups",
"django.db.models.fields.reverse_related",
"django.db.models.functions",
"django.db.models.functions.base",
"django.db.models.functions.datetime",
"django.db.models.indexes",
"django.db.models.lookups",
"django.db.models.manager",
"django.db.models.options",
"django.db.models.query",
"django.db.models.query_utils",
"django.db.models.signals",
"django.db.models.sql",
"django.db.models.sql.constants",
"django.db.models.sql.datastructures",
"django.db.models.sql.query",
"django.db.models.sql.subqueries",
"django.db.models.sql.where",
"django.db.models.utils",
"django.db.transaction",
"django.db.utils",
"django.dispatch",
"django.dispatch.dispatcher",
"django.dispatch.weakref_backports",
"django.forms",
"django.forms.boundfield",
"django.forms.fields",
"django.forms.forms",
"django.forms.formsets",
"django.forms.models",
"django.forms.renderers",
"django.forms.utils",
"django.forms.widgets",
"django.template",
"django.template.backends",
"django.template.backends.base",
"django.template.backends.django",
"django.template.base",
"django.template.context",
"django.template.engine",
"django.template.exceptions",
"django.template.library",
"django.template.loader",
"django.template.utils",
"django.templatetags",
"django.templatetags.static",
"django.utils",
"django.utils._os",
"django.utils.crypto",
"django.utils.datastructures",
"django.utils.dateformat",
"django.utils.dateparse",
"django.utils.dates",
"django.utils.datetime_safe",
"django.utils.deconstruct",
"django.utils.decorators",
"django.utils.deprecation",
"django.utils.duration",
"django.utils.encoding",
"django.utils.formats",
"django.utils.functional",
"django.utils.html",
"django.utils.html_parser",
"django.utils.http",
"django.utils.inspect",
"django.utils.ipv6",
"django.utils.itercompat",
"django.utils.lru_cache",
"django.utils.module_loading",
"django.utils.numberformat",
"django.utils.safestring",
"django.utils.six",
"django.utils.text",
"django.utils.timezone",
"django.utils.translation",
"django.utils.tree",
"django.utils.version",
"pytz",
"pytz.exceptions",
"pytz.lazy",
"pytz.tzfile",
"pytz.tzinfo"
]
}
}

@ -0,0 +1,209 @@
{
"find_related_imports": {
"django.db": [
"django",
"django.core",
"django.core.signals",
"django.db.utils",
"django.utils.connection"
],
"django.db.models": [
"django",
"django.core.exceptions",
"django.db",
"django.db.models",
"django.db.models.aggregates",
"django.db.models.base",
"django.db.models.constraints",
"django.db.models.deletion",
"django.db.models.enums",
"django.db.models.expressions",
"django.db.models.fields",
"django.db.models.fields.files",
"django.db.models.fields.json",
"django.db.models.fields.proxy",
"django.db.models.fields.related",
"django.db.models.indexes",
"django.db.models.lookups",
"django.db.models.manager",
"django.db.models.query",
"django.db.models.query_utils",
"django.db.models.signals"
]
},
"find_related": {
"django.db": [
"asgiref",
"asgiref.compatibility",
"asgiref.current_thread_executor",
"asgiref.local",
"asgiref.sync",
"django",
"django.conf",
"django.conf.global_settings",
"django.core",
"django.core.exceptions",
"django.core.signals",
"django.db.utils",
"django.dispatch",
"django.dispatch.dispatcher",
"django.utils",
"django.utils.connection",
"django.utils.deprecation",
"django.utils.functional",
"django.utils.hashable",
"django.utils.inspect",
"django.utils.itercompat",
"django.utils.module_loading",
"django.utils.regex_helper",
"django.utils.version"
],
"django.db.models": [
"asgiref",
"asgiref.compatibility",
"asgiref.current_thread_executor",
"asgiref.local",
"asgiref.sync",
"django",
"django.apps",
"django.apps.config",
"django.apps.registry",
"django.conf",
"django.conf.global_settings",
"django.conf.locale",
"django.core",
"django.core.cache",
"django.core.cache.backends",
"django.core.cache.backends.base",
"django.core.cache.backends.filebased",
"django.core.checks",
"django.core.checks.async_checks",
"django.core.checks.caches",
"django.core.checks.database",
"django.core.checks.messages",
"django.core.checks.model_checks",
"django.core.checks.registry",
"django.core.checks.security",
"django.core.checks.security.base",
"django.core.checks.security.csrf",
"django.core.checks.security.sessions",
"django.core.checks.templates",
"django.core.checks.translation",
"django.core.checks.urls",
"django.core.exceptions",
"django.core.files",
"django.core.files.base",
"django.core.files.images",
"django.core.files.locks",
"django.core.files.move",
"django.core.files.storage",
"django.core.files.utils",
"django.core.signals",
"django.core.validators",
"django.db",
"django.db.backends",
"django.db.backends.utils",
"django.db.models.aggregates",
"django.db.models.base",
"django.db.models.constants",
"django.db.models.constraints",
"django.db.models.deletion",
"django.db.models.enums",
"django.db.models.expressions",
"django.db.models.fields",
"django.db.models.fields.files",
"django.db.models.fields.json",
"django.db.models.fields.mixins",
"django.db.models.fields.proxy",
"django.db.models.fields.related",
"django.db.models.fields.related_descriptors",
"django.db.models.fields.related_lookups",
"django.db.models.fields.reverse_related",
"django.db.models.functions",
"django.db.models.functions.comparison",
"django.db.models.functions.datetime",
"django.db.models.functions.math",
"django.db.models.functions.mixins",
"django.db.models.functions.text",
"django.db.models.functions.window",
"django.db.models.indexes",
"django.db.models.lookups",
"django.db.models.manager",
"django.db.models.options",
"django.db.models.query",
"django.db.models.query_utils",
"django.db.models.signals",
"django.db.models.sql",
"django.db.models.sql.constants",
"django.db.models.sql.datastructures",
"django.db.models.sql.query",
"django.db.models.sql.subqueries",
"django.db.models.sql.where",
"django.db.models.utils",
"django.db.transaction",
"django.db.utils",
"django.dispatch",
"django.dispatch.dispatcher",
"django.forms",
"django.forms.boundfield",
"django.forms.fields",
"django.forms.forms",
"django.forms.formsets",
"django.forms.models",
"django.forms.renderers",
"django.forms.utils",
"django.forms.widgets",
"django.template",
"django.template.backends",
"django.template.backends.base",
"django.template.backends.django",
"django.template.base",
"django.template.context",
"django.template.engine",
"django.template.exceptions",
"django.template.library",
"django.template.loader",
"django.template.utils",
"django.templatetags",
"django.templatetags.static",
"django.utils",
"django.utils._os",
"django.utils.autoreload",
"django.utils.connection",
"django.utils.crypto",
"django.utils.datastructures",
"django.utils.dateformat",
"django.utils.dateparse",
"django.utils.dates",
"django.utils.datetime_safe",
"django.utils.deconstruct",
"django.utils.deprecation",
"django.utils.duration",
"django.utils.encoding",
"django.utils.formats",
"django.utils.functional",
"django.utils.hashable",
"django.utils.html",
"django.utils.http",
"django.utils.inspect",
"django.utils.ipv6",
"django.utils.itercompat",
"django.utils.module_loading",
"django.utils.numberformat",
"django.utils.regex_helper",
"django.utils.safestring",
"django.utils.text",
"django.utils.timezone",
"django.utils.topological_sort",
"django.utils.translation",
"django.utils.translation.trans_real",
"django.utils.tree",
"django.utils.version",
"pytz",
"pytz.exceptions",
"pytz.lazy",
"pytz.tzfile",
"pytz.tzinfo"
]
}
}

@ -0,0 +1,209 @@
{
"find_related_imports": {
"django.db": [
"django",
"django.core",
"django.core.signals",
"django.db.utils",
"django.utils.connection"
],
"django.db.models": [
"django",
"django.core.exceptions",
"django.db",
"django.db.models",
"django.db.models.aggregates",
"django.db.models.base",
"django.db.models.constraints",
"django.db.models.deletion",
"django.db.models.enums",
"django.db.models.expressions",
"django.db.models.fields",
"django.db.models.fields.files",
"django.db.models.fields.json",
"django.db.models.fields.proxy",
"django.db.models.fields.related",
"django.db.models.indexes",
"django.db.models.lookups",
"django.db.models.manager",
"django.db.models.query",
"django.db.models.query_utils",
"django.db.models.signals"
]
},
"find_related": {
"django.db": [
"asgiref",
"asgiref.current_thread_executor",
"asgiref.local",
"asgiref.sync",
"django",
"django.conf",
"django.conf.global_settings",
"django.core",
"django.core.exceptions",
"django.core.signals",
"django.db.utils",
"django.dispatch",
"django.dispatch.dispatcher",
"django.utils",
"django.utils.connection",
"django.utils.deprecation",
"django.utils.functional",
"django.utils.hashable",
"django.utils.inspect",
"django.utils.itercompat",
"django.utils.module_loading",
"django.utils.regex_helper",
"django.utils.version"
],
"django.db.models": [
"asgiref",
"asgiref.current_thread_executor",
"asgiref.local",
"asgiref.sync",
"django",
"django.apps",
"django.apps.config",
"django.apps.registry",
"django.conf",
"django.conf.global_settings",
"django.conf.locale",
"django.core",
"django.core.cache",
"django.core.cache.backends",
"django.core.cache.backends.base",
"django.core.cache.backends.filebased",
"django.core.checks",
"django.core.checks.async_checks",
"django.core.checks.caches",
"django.core.checks.database",
"django.core.checks.messages",
"django.core.checks.model_checks",
"django.core.checks.registry",
"django.core.checks.security",
"django.core.checks.security.base",
"django.core.checks.security.csrf",
"django.core.checks.security.sessions",
"django.core.checks.templates",
"django.core.checks.translation",
"django.core.checks.urls",
"django.core.exceptions",
"django.core.files",
"django.core.files.base",
"django.core.files.images",
"django.core.files.locks",
"django.core.files.move",
"django.core.files.storage",
"django.core.files.utils",
"django.core.signals",
"django.core.validators",
"django.db",
"django.db.backends",
"django.db.backends.utils",
"django.db.models.aggregates",
"django.db.models.base",
"django.db.models.constants",
"django.db.models.constraints",
"django.db.models.deletion",
"django.db.models.enums",
"django.db.models.expressions",
"django.db.models.fields",
"django.db.models.fields.files",
"django.db.models.fields.json",
"django.db.models.fields.mixins",
"django.db.models.fields.proxy",
"django.db.models.fields.related",
"django.db.models.fields.related_descriptors",
"django.db.models.fields.related_lookups",
"django.db.models.fields.reverse_related",
"django.db.models.functions",
"django.db.models.functions.comparison",
"django.db.models.functions.datetime",
"django.db.models.functions.math",
"django.db.models.functions.mixins",
"django.db.models.functions.text",
"django.db.models.functions.window",
"django.db.models.indexes",
"django.db.models.lookups",
"django.db.models.manager",
"django.db.models.options",
"django.db.models.query",
"django.db.models.query_utils",
"django.db.models.signals",
"django.db.models.sql",
"django.db.models.sql.constants",
"django.db.models.sql.datastructures",
"django.db.models.sql.query",
"django.db.models.sql.subqueries",
"django.db.models.sql.where",
"django.db.models.utils",
"django.db.transaction",
"django.db.utils",
"django.dispatch",
"django.dispatch.dispatcher",
"django.forms",
"django.forms.boundfield",
"django.forms.fields",
"django.forms.forms",
"django.forms.formsets",
"django.forms.models",
"django.forms.renderers",
"django.forms.utils",
"django.forms.widgets",
"django.template",
"django.template.backends",
"django.template.backends.base",
"django.template.backends.django",
"django.template.base",
"django.template.context",
"django.template.engine",
"django.template.exceptions",
"django.template.library",
"django.template.loader",
"django.template.utils",
"django.templatetags",
"django.templatetags.static",
"django.utils",
"django.utils._os",
"django.utils.autoreload",
"django.utils.connection",
"django.utils.crypto",
"django.utils.datastructures",
"django.utils.dateformat",
"django.utils.dateparse",
"django.utils.dates",
"django.utils.datetime_safe",
"django.utils.deconstruct",
"django.utils.deprecation",
"django.utils.duration",
"django.utils.encoding",
"django.utils.formats",
"django.utils.functional",
"django.utils.hashable",
"django.utils.html",
"django.utils.http",
"django.utils.inspect",
"django.utils.ipv6",
"django.utils.itercompat",
"django.utils.module_loading",
"django.utils.numberformat",
"django.utils.regex_helper",
"django.utils.safestring",
"django.utils.text",
"django.utils.timezone",
"django.utils.topological_sort",
"django.utils.translation",
"django.utils.translation.trans_real",
"django.utils.tree",
"django.utils.version",
"pytz",
"pytz.exceptions",
"pytz.lazy",
"pytz.tzfile",
"pytz.tzinfo",
"zipimport"
]
}
}

@ -1,4 +1,5 @@
import inspect import inspect
import json
import os import os
import sys import sys
import unittest import unittest
@ -296,199 +297,65 @@ class FindRelatedTest(testlib.TestCase):
self.assertEqual(set(related), self.SIMPLE_EXPECT) self.assertEqual(set(related), self.SIMPLE_EXPECT)
if sys.version_info > (2, 6): class DjangoMixin(object):
class DjangoMixin(object): WEBPROJECT_PATH = os.path.join(testlib.MODS_DIR, 'webproject')
WEBPROJECT_PATH = os.path.join(testlib.MODS_DIR, 'webproject')
@classmethod
# TODO: rip out Django and replace with a static tree of weird imports def modules_expected_path(cls):
# that don't depend on .. Django! The hack below is because the version if sys.version_info[0:2] < (3, 0):
# of Django we need to test against 2.6 doesn't actually run on 3.6. modules_expected_filename = 'modules_expected_py2x.json'
# But we don't care, we just need to be able to import it. elif sys.version_info[0:2] <= (3, 6):
# modules_expected_filename = 'modules_expected_py3x-legacy.json'
# File "django/utils/html_parser.py", line 12, in <module> elif sys.version_info[0:2] >= (3, 10):
# AttributeError: module 'html.parser' has no attribute modules_expected_filename = 'modules_expected_py3x-new.json'
# 'HTMLParseError' return os.path.join(cls.WEBPROJECT_PATH, modules_expected_filename)
#
from django.utils.six.moves import html_parser as _html_parser @classmethod
_html_parser.HTMLParseError = Exception def setUpClass(cls):
super(DjangoMixin, cls).setUpClass()
@classmethod sys.path.append(cls.WEBPROJECT_PATH)
def setUpClass(cls): os.environ['DJANGO_SETTINGS_MODULE'] = 'webproject.settings'
super(DjangoMixin, cls).setUpClass() with open(cls.modules_expected_path(), 'rb') as f:
sys.path.append(cls.WEBPROJECT_PATH) cls.MODULES_EXPECTED = json.load(f)
os.environ['DJANGO_SETTINGS_MODULE'] = 'webproject.settings'
@classmethod
@classmethod def tearDownClass(cls):
def tearDownClass(cls): sys.path.remove(cls.WEBPROJECT_PATH)
sys.path.remove(cls.WEBPROJECT_PATH) del os.environ['DJANGO_SETTINGS_MODULE']
del os.environ['DJANGO_SETTINGS_MODULE'] super(DjangoMixin, cls).tearDownClass()
super(DjangoMixin, cls).tearDownClass()
class DjangoFindRelatedTest(DjangoMixin, testlib.TestCase):
class FindRelatedImportsTest(DjangoMixin, testlib.TestCase): maxDiff = None
klass = mitogen.master.ModuleFinder
def test_django_db(self):
def call(self, fullname): import django.db
return self.klass().find_related_imports(fullname) module_finder = mitogen.master.ModuleFinder()
related = module_finder.find_related('django.db')
def test_django_db(self): expected = self.MODULES_EXPECTED['find_related']['django.db']
import django.db self.assertEqual(related, expected)
related = self.call('django.db')
self.assertEqual(related, [ def test_django_db_models(self):
'django', import django.db.models
'django.core', module_finder = mitogen.master.ModuleFinder()
'django.core.signals', related = module_finder.find_related('django.db.models')
'django.db.utils', expected = self.MODULES_EXPECTED['find_related']['django.db.models']
'django.utils.functional', self.assertEqual(related, expected)
])
def test_django_db_models(self): class DjangoFindRelatedImportsTest(DjangoMixin, testlib.TestCase):
import django.db.models maxDiff = None
related = self.call('django.db.models')
self.maxDiff=None def test_django_db(self):
self.assertEqual(related, [ import django.db
u'django', module_finder = mitogen.master.ModuleFinder()
u'django.core.exceptions', related = module_finder.find_related_imports('django.db')
u'django.db', expected = self.MODULES_EXPECTED['find_related_imports']['django.db']
u'django.db.models', self.assertEqual(related, expected)
u'django.db.models.aggregates',
u'django.db.models.base', def test_django_db_models(self):
u'django.db.models.deletion', import django.db.models
u'django.db.models.expressions', module_finder = mitogen.master.ModuleFinder()
u'django.db.models.fields', related = module_finder.find_related_imports('django.db.models')
u'django.db.models.fields.files', expected = self.MODULES_EXPECTED['find_related_imports']['django.db.models']
u'django.db.models.fields.related', self.assertEqual(related, expected)
u'django.db.models.fields.subclassing',
u'django.db.models.loading',
u'django.db.models.manager',
u'django.db.models.query',
u'django.db.models.signals',
])
class DjangoFindRelatedTest(DjangoMixin, testlib.TestCase):
klass = mitogen.master.ModuleFinder
maxDiff = None
def call(self, fullname):
return self.klass().find_related(fullname)
def test_django_db(self):
import django.db
related = self.call('django.db')
self.assertEqual(related, [
u'django',
u'django.conf',
u'django.conf.global_settings',
u'django.core',
u'django.core.exceptions',
u'django.core.signals',
u'django.db.utils',
u'django.dispatch',
u'django.dispatch.dispatcher',
u'django.dispatch.saferef',
u'django.utils',
u'django.utils._os',
u'django.utils.encoding',
u'django.utils.functional',
u'django.utils.importlib',
u'django.utils.module_loading',
u'django.utils.six',
])
@unittest.skipIf(
condition=(sys.version_info >= (3, 0)),
reason='broken due to ancient vendored six.py'
)
def test_django_db_models(self):
import django.db.models
related = self.call('django.db.models')
self.assertEqual(related, [
u'django',
u'django.conf',
u'django.conf.global_settings',
u'django.core',
u'django.core.exceptions',
u'django.core.files',
u'django.core.files.base',
u'django.core.files.images',
u'django.core.files.locks',
u'django.core.files.move',
u'django.core.files.storage',
u'django.core.files.utils',
u'django.core.signals',
u'django.core.validators',
u'django.db',
u'django.db.backends',
u'django.db.backends.signals',
u'django.db.backends.util',
u'django.db.models.aggregates',
u'django.db.models.base',
u'django.db.models.constants',
u'django.db.models.deletion',
u'django.db.models.expressions',
u'django.db.models.fields',
u'django.db.models.fields.files',
u'django.db.models.fields.proxy',
u'django.db.models.fields.related',
u'django.db.models.fields.subclassing',
u'django.db.models.loading',
u'django.db.models.manager',
u'django.db.models.options',
u'django.db.models.query',
u'django.db.models.query_utils',
u'django.db.models.related',
u'django.db.models.signals',
u'django.db.models.sql',
u'django.db.models.sql.aggregates',
u'django.db.models.sql.constants',
u'django.db.models.sql.datastructures',
u'django.db.models.sql.expressions',
u'django.db.models.sql.query',
u'django.db.models.sql.subqueries',
u'django.db.models.sql.where',
u'django.db.transaction',
u'django.db.utils',
u'django.dispatch',
u'django.dispatch.dispatcher',
u'django.dispatch.saferef',
u'django.forms',
u'django.forms.fields',
u'django.forms.forms',
u'django.forms.formsets',
u'django.forms.models',
u'django.forms.util',
u'django.forms.widgets',
u'django.utils',
u'django.utils._os',
u'django.utils.crypto',
u'django.utils.datastructures',
u'django.utils.dateformat',
u'django.utils.dateparse',
u'django.utils.dates',
u'django.utils.datetime_safe',
u'django.utils.decorators',
u'django.utils.deprecation',
u'django.utils.encoding',
u'django.utils.formats',
u'django.utils.functional',
u'django.utils.html',
u'django.utils.html_parser',
u'django.utils.importlib',
u'django.utils.ipv6',
u'django.utils.itercompat',
u'django.utils.module_loading',
u'django.utils.numberformat',
u'django.utils.safestring',
u'django.utils.six',
u'django.utils.text',
u'django.utils.timezone',
u'django.utils.translation',
u'django.utils.tree',
u'django.utils.tzinfo',
u'pytz',
u'pytz.exceptions',
u'pytz.lazy',
u'pytz.tzfile',
u'pytz.tzinfo',
])

@ -1,9 +1,9 @@
psutil==5.4.8 psutil==5.4.8
coverage==5.5; python_version < '3.7' coverage==5.5; python_version < '3.7'
coverage==6.4.4; python_version >= '3.7' coverage==6.4.4; python_version >= '3.7'
Django==1.6.11 # Last version supporting 2.6. Django==1.11.29; python_version < '3.0'
Django==3.2.20; python_version >= '3.6'
mock==2.0.0 mock==2.0.0
pytz==2018.5
cffi==1.14.3 # Random pin to try and fix pyparser==2.18 not having effect cffi==1.14.3 # Random pin to try and fix pyparser==2.18 not having effect
pycparser==2.18 # Last version supporting 2.6. pycparser==2.18 # Last version supporting 2.6.
pytest-catchlog==1.2.2 pytest-catchlog==1.2.2

@ -5,16 +5,16 @@
# sudo apt update # sudo apt update
# sudo apt install awscli lib{ldap2,sasl2,ssl}-dev python2.7 python3.{6..11} python-is-python3 sshpass tox # sudo apt install awscli lib{ldap2,sasl2,ssl}-dev python2.7 python3.{6..11} python-is-python3 sshpass tox
# Py tox virtualenv pip A cntrllr A target Jinja2 coverage psutil pytest # Py A cntrllr A target coverage Django Jinja2 pip psutil pytest tox virtualenv
# ==== ======== ========== ======== ========= ========= ========== ======== ======== ========= # ==== ========== ========== ========== ========== ========== ========== ========== ========== ========== ==========
# 2.4 <= 1.4 <= 1.8 <= 1.1 2.3? <= 3.7.1 <= 2.1.3 # 2.4 2.3? <= 3.7.1 <= 1.3.7 <= 1.1 <= 2.1.3 <= 1.4 <= 1.8
# 2.5 <= 1.6.1 <= 1.9.1 <= 1.3.1 ??? <= 3.7.1 <= 2.1.3 <= 2.8.7 # 2.5 <= 3.7.1 <= 1.4.22 <= 1.3.1 <= 2.1.3 <= 2.8.7 <= 1.6.1 <= 1.9.1
# 2.6 <= 2.9.1 <= 15.2.0 <= 9.0.3 <= 2.6.20 <= 2.13 <= 2.10.3 <= 4.5.4 <= 5.9.0 <= 3.2.5 # 2.6 <= 2.6.20 <= 2.13 <= 4.5.4 <= 1.6.11 <= 2.10.3 <= 9.0.3 <= 5.9.0 <= 3.2.5 <= 2.9.1 <= 15.2.0
# 2.7 <= 3.28 <= 20.3? <= 20 <= 2.11 <= 2.11.3 <= 5.6 <= 4.6.11 # 2.7 <= 2.11 <= 5.6 <= 1.11.29 <= 2.11.3 <= 20 <= 4.6.11 <= 3.28 <= 20.3?
# 3.5 <= 3.28 <= 20.15 <= 20 <= 2.11 <= 2.13 <= 2.11.3 <= 5.6 <= 6.1.0 # 3.5 <= 2.11 <= 2.13 <= 5.6 <= 2.2.28 <= 2.11.3 <= 20 <= 5.9.5 <= 6.1.0 <= 3.28 <= 20.15
# 3.6 <= 3.28 <= 20.16 <= 21 <= 2.11 <= 3.0.3 <= 6.2 <= 7.0.1 # 3.6 <= 2.11 <= 6.2 <= 3.2.20 <= 3.0.3 <= 21 <= 5.9.5 <= 7.0.1 <= 3.28 <= 20.16
# 3.7 <= 2.12 # 3.7 <= 2.12 <= 3.2.20
# 3.8 <= 2.12 # 3.8 <= 2.12
# Ansible Dependency # Ansible Dependency
# ================== ====================== # ================== ======================

Loading…
Cancel
Save