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 json
import os
import sys
import unittest
@ -296,199 +297,65 @@ class FindRelatedTest(testlib.TestCase):
self.assertEqual(set(related), self.SIMPLE_EXPECT)
if sys.version_info > (2, 6):
class DjangoMixin(object):
WEBPROJECT_PATH = os.path.join(testlib.MODS_DIR, 'webproject')
# TODO: rip out Django and replace with a static tree of weird imports
# that don't depend on .. Django! The hack below is because the version
# of Django we need to test against 2.6 doesn't actually run on 3.6.
# But we don't care, we just need to be able to import it.
#
# File "django/utils/html_parser.py", line 12, in <module>
# AttributeError: module 'html.parser' has no attribute
# 'HTMLParseError'
#
from django.utils.six.moves import html_parser as _html_parser
_html_parser.HTMLParseError = Exception
@classmethod
def setUpClass(cls):
super(DjangoMixin, cls).setUpClass()
sys.path.append(cls.WEBPROJECT_PATH)
os.environ['DJANGO_SETTINGS_MODULE'] = 'webproject.settings'
@classmethod
def tearDownClass(cls):
sys.path.remove(cls.WEBPROJECT_PATH)
del os.environ['DJANGO_SETTINGS_MODULE']
super(DjangoMixin, cls).tearDownClass()
class FindRelatedImportsTest(DjangoMixin, testlib.TestCase):
klass = mitogen.master.ModuleFinder
def call(self, fullname):
return self.klass().find_related_imports(fullname)
def test_django_db(self):
import django.db
related = self.call('django.db')
self.assertEqual(related, [
'django',
'django.core',
'django.core.signals',
'django.db.utils',
'django.utils.functional',
])
def test_django_db_models(self):
import django.db.models
related = self.call('django.db.models')
self.maxDiff=None
self.assertEqual(related, [
u'django',
u'django.core.exceptions',
u'django.db',
u'django.db.models',
u'django.db.models.aggregates',
u'django.db.models.base',
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.related',
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',
])
class DjangoMixin(object):
WEBPROJECT_PATH = os.path.join(testlib.MODS_DIR, 'webproject')
@classmethod
def modules_expected_path(cls):
if sys.version_info[0:2] < (3, 0):
modules_expected_filename = 'modules_expected_py2x.json'
elif sys.version_info[0:2] <= (3, 6):
modules_expected_filename = 'modules_expected_py3x-legacy.json'
elif sys.version_info[0:2] >= (3, 10):
modules_expected_filename = 'modules_expected_py3x-new.json'
return os.path.join(cls.WEBPROJECT_PATH, modules_expected_filename)
@classmethod
def setUpClass(cls):
super(DjangoMixin, cls).setUpClass()
sys.path.append(cls.WEBPROJECT_PATH)
os.environ['DJANGO_SETTINGS_MODULE'] = 'webproject.settings'
with open(cls.modules_expected_path(), 'rb') as f:
cls.MODULES_EXPECTED = json.load(f)
@classmethod
def tearDownClass(cls):
sys.path.remove(cls.WEBPROJECT_PATH)
del os.environ['DJANGO_SETTINGS_MODULE']
super(DjangoMixin, cls).tearDownClass()
class DjangoFindRelatedTest(DjangoMixin, testlib.TestCase):
maxDiff = None
def test_django_db(self):
import django.db
module_finder = mitogen.master.ModuleFinder()
related = module_finder.find_related('django.db')
expected = self.MODULES_EXPECTED['find_related']['django.db']
self.assertEqual(related, expected)
def test_django_db_models(self):
import django.db.models
module_finder = mitogen.master.ModuleFinder()
related = module_finder.find_related('django.db.models')
expected = self.MODULES_EXPECTED['find_related']['django.db.models']
self.assertEqual(related, expected)
class DjangoFindRelatedImportsTest(DjangoMixin, testlib.TestCase):
maxDiff = None
def test_django_db(self):
import django.db
module_finder = mitogen.master.ModuleFinder()
related = module_finder.find_related_imports('django.db')
expected = self.MODULES_EXPECTED['find_related_imports']['django.db']
self.assertEqual(related, expected)
def test_django_db_models(self):
import django.db.models
module_finder = mitogen.master.ModuleFinder()
related = module_finder.find_related_imports('django.db.models')
expected = self.MODULES_EXPECTED['find_related_imports']['django.db.models']
self.assertEqual(related, expected)

@ -1,9 +1,9 @@
psutil==5.4.8
coverage==5.5; 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
pytz==2018.5
cffi==1.14.3 # Random pin to try and fix pyparser==2.18 not having effect
pycparser==2.18 # Last version supporting 2.6.
pytest-catchlog==1.2.2

@ -5,16 +5,16 @@
# sudo apt update
# 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
# ==== ======== ========== ======== ========= ========= ========== ======== ======== =========
# 2.4 <= 1.4 <= 1.8 <= 1.1 2.3? <= 3.7.1 <= 2.1.3
# 2.5 <= 1.6.1 <= 1.9.1 <= 1.3.1 ??? <= 3.7.1 <= 2.1.3 <= 2.8.7
# 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.7 <= 3.28 <= 20.3? <= 20 <= 2.11 <= 2.11.3 <= 5.6 <= 4.6.11
# 3.5 <= 3.28 <= 20.15 <= 20 <= 2.11 <= 2.13 <= 2.11.3 <= 5.6 <= 6.1.0
# 3.6 <= 3.28 <= 20.16 <= 21 <= 2.11 <= 3.0.3 <= 6.2 <= 7.0.1
# 3.7 <= 2.12
# 3.8 <= 2.12
# Py A cntrllr A target coverage Django Jinja2 pip psutil pytest tox virtualenv
# ==== ========== ========== ========== ========== ========== ========== ========== ========== ========== ==========
# 2.4 2.3? <= 3.7.1 <= 1.3.7 <= 1.1 <= 2.1.3 <= 1.4 <= 1.8
# 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.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 <= 2.11 <= 5.6 <= 1.11.29 <= 2.11.3 <= 20 <= 4.6.11 <= 3.28 <= 20.3?
# 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 <= 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.2.20
# 3.8 <= 2.12
# Ansible Dependency
# ================== ======================

Loading…
Cancel
Save