diff --git a/BUILD.bazel b/BUILD.bazel index 33b8bad1..304527a7 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,19 +1,36 @@ -load("@rules_python//python/pip_install:requirements.bzl", "compile_pip_requirements") -load("@rules_python//python:defs.bzl", "py_runtime", "py_runtime_pair") load("@bazel_gazelle//:def.bzl", "gazelle", "gazelle_binary") +load("@pypi//:requirements.bzl", "all_whl_requirements") +load("@rules_python//gazelle:def.bzl", "GAZELLE_PYTHON_RUNTIME_DEPS") +load("@rules_python//gazelle/manifest:defs.bzl", "gazelle_python_manifest") +load("@rules_python//gazelle/modules_mapping:def.bzl", "modules_mapping") +load("@rules_python//python:defs.bzl", "py_runtime", "py_runtime_pair") +load("@rules_python//python/pip_install:requirements.bzl", "compile_pip_requirements") # gazelle:exclude internal_python_deps.bzl # gazelle:exclude internal_deps.bzl # gazelle:exclude py/tests/ +# gazelle:exclude examples/django + +gazelle_python_manifest( + name = "gazelle_python_manifest", + modules_mapping = ":modules_map", + pip_repository_incremental = True, + pip_repository_name = "pypi", + requirements = "requirements.txt", +) gazelle_binary( name = "gazelle_bin", - languages = ["@bazel_skylib//gazelle/bzl"], + languages = [ + "@bazel_skylib//gazelle/bzl", + "@rules_python//gazelle", + ], ) gazelle( name = "gazelle", - gazelle = "gazelle_bin", + data = GAZELLE_PYTHON_RUNTIME_DEPS, + gazelle = ":gazelle_bin", ) compile_pip_requirements( @@ -23,6 +40,11 @@ compile_pip_requirements( requirements_txt = "requirements.txt", ) +modules_mapping( + name = "modules_map", + wheels = all_whl_requirements, +) + py_runtime( name = "container_py3_runtime", interpreter_path = "/usr/bin/python", diff --git a/WORKSPACE b/WORKSPACE index ff498910..fc4261e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -59,10 +59,14 @@ load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") go_rules_dependencies() -go_register_toolchains(version = "1.17.2") +go_register_toolchains(version = "1.19.3") gazelle_dependencies() +load("@rules_python//gazelle:deps.bzl", _py_gazelle_deps = "gazelle_deps") + +_py_gazelle_deps() + ############################################ # rules_docker dependencies for containers load( diff --git a/docs/rules.md b/docs/rules.md index b69e99a6..bb40f8ef 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -67,6 +67,26 @@ Wrapper macro for the py_library rule, setting a default for imports | kwargs | see [py_library attributes](./py_library) | none | + + +## py_pytest_main + +
+py_pytest_main(name, py_library, kwargs) ++ +py_pytest_main wraps the template rendering target and the final py_library. + +**PARAMETERS** + + +| Name | Description | Default Value | +| :------------- | :------------- | :------------- | +| name | The name of the runable target that updates the test entry file. | none | +| py_library | Use this attribute to override the default py_library rule. |
|
+| kwargs | The extra arguments passed to the template rendering target. | none |
+
+
## py_test
diff --git a/examples/pytest/BUILD.bazel b/examples/pytest/BUILD.bazel
new file mode 100644
index 00000000..93984361
--- /dev/null
+++ b/examples/pytest/BUILD.bazel
@@ -0,0 +1,18 @@
+load("@rules_python//python:defs.bzl", "py_test")
+load("@//py:defs.bzl", "py_pytest_main")
+
+py_pytest_main(name = "__test__")
+
+py_test(
+ name = "pytest_test",
+ srcs = [
+ "foo_test.py",
+ ":__test__",
+ ],
+ imports = ["../.."],
+ main = ":__test__.py",
+ deps = [
+ ":__test__",
+ "@pypi_pytest//:pkg",
+ ],
+)
diff --git a/examples/pytest/README.md b/examples/pytest/README.md
new file mode 100644
index 00000000..65050265
--- /dev/null
+++ b/examples/pytest/README.md
@@ -0,0 +1,19 @@
+# A pytest entrypoint for Bazel's py_test
+
+With Bazel `py_test`, it requires a single file as the entry point. This repository contains a
+template that gets rendered for a particular package and will discover tests automatically in the
+same way the `pytest` command-line does.
+
+## How to use
+
+After importing this repository into your `WORKSPACE`, add to your Bazel packages containing
+`_test.py` files the following:
+
+```python
+load("@aspect_rules_py//py:defs.bzl", "py_pytest_main")
+
+py_pytest_main(name = "__test__")
+```
+
+When using this repository together with the Gazelle extension for Python from rules_python, Gazelle
+will detect the `__test__` target and produce a `py_test` compatible with it.
diff --git a/examples/pytest/foo_test.py b/examples/pytest/foo_test.py
new file mode 100644
index 00000000..0c309f86
--- /dev/null
+++ b/examples/pytest/foo_test.py
@@ -0,0 +1,5 @@
+import pytest
+
+
+def test_add():
+ assert 1 + 1 == 2, "Expected 1 + 1 to equal 2"
diff --git a/gazelle_python.yaml b/gazelle_python.yaml
new file mode 100644
index 00000000..1bbf0c26
--- /dev/null
+++ b/gazelle_python.yaml
@@ -0,0 +1,1268 @@
+# GENERATED FILE - DO NOT EDIT!
+#
+# To update this file, run:
+# bazel run //:gazelle_python_manifest.update
+
+manifest:
+ modules_mapping:
+ _pytest: pytest
+ _pytest.__init__: pytest
+ _pytest._argcomplete: pytest
+ _pytest._code: pytest
+ _pytest._code.__init__: pytest
+ _pytest._code.code: pytest
+ _pytest._code.source: pytest
+ _pytest._io: pytest
+ _pytest._io.__init__: pytest
+ _pytest._io.saferepr: pytest
+ _pytest._io.terminalwriter: pytest
+ _pytest._io.wcwidth: pytest
+ _pytest._py: pytest
+ _pytest._py.__init__: pytest
+ _pytest._py.error: pytest
+ _pytest._py.path: pytest
+ _pytest._version: pytest
+ _pytest.assertion: pytest
+ _pytest.assertion.__init__: pytest
+ _pytest.assertion.rewrite: pytest
+ _pytest.assertion.truncate: pytest
+ _pytest.assertion.util: pytest
+ _pytest.cacheprovider: pytest
+ _pytest.capture: pytest
+ _pytest.compat: pytest
+ _pytest.config: pytest
+ _pytest.config.__init__: pytest
+ _pytest.config.argparsing: pytest
+ _pytest.config.compat: pytest
+ _pytest.config.exceptions: pytest
+ _pytest.config.findpaths: pytest
+ _pytest.debugging: pytest
+ _pytest.deprecated: pytest
+ _pytest.doctest: pytest
+ _pytest.faulthandler: pytest
+ _pytest.fixtures: pytest
+ _pytest.freeze_support: pytest
+ _pytest.helpconfig: pytest
+ _pytest.hookspec: pytest
+ _pytest.junitxml: pytest
+ _pytest.legacypath: pytest
+ _pytest.logging: pytest
+ _pytest.main: pytest
+ _pytest.mark: pytest
+ _pytest.mark.__init__: pytest
+ _pytest.mark.expression: pytest
+ _pytest.mark.structures: pytest
+ _pytest.monkeypatch: pytest
+ _pytest.nodes: pytest
+ _pytest.nose: pytest
+ _pytest.outcomes: pytest
+ _pytest.pastebin: pytest
+ _pytest.pathlib: pytest
+ _pytest.pytester: pytest
+ _pytest.pytester_assertions: pytest
+ _pytest.python: pytest
+ _pytest.python_api: pytest
+ _pytest.python_path: pytest
+ _pytest.recwarn: pytest
+ _pytest.reports: pytest
+ _pytest.runner: pytest
+ _pytest.scope: pytest
+ _pytest.setuponly: pytest
+ _pytest.setupplan: pytest
+ _pytest.skipping: pytest
+ _pytest.stash: pytest
+ _pytest.stepwise: pytest
+ _pytest.terminal: pytest
+ _pytest.threadexception: pytest
+ _pytest.timing: pytest
+ _pytest.tmpdir: pytest
+ _pytest.unittest: pytest
+ _pytest.unraisableexception: pytest
+ _pytest.warning_types: pytest
+ _pytest.warnings: pytest
+ asgiref: asgiref
+ asgiref.__init__: asgiref
+ asgiref.compatibility: asgiref
+ asgiref.current_thread_executor: asgiref
+ asgiref.local: asgiref
+ asgiref.server: asgiref
+ asgiref.sync: asgiref
+ asgiref.testing: asgiref
+ asgiref.timeout: asgiref
+ asgiref.typing: asgiref
+ asgiref.wsgi: asgiref
+ attr: attrs
+ attr.__init__: attrs
+ attr._cmp: attrs
+ attr._compat: attrs
+ attr._config: attrs
+ attr._funcs: attrs
+ attr._make: attrs
+ attr._next_gen: attrs
+ attr._version_info: attrs
+ attr.converters: attrs
+ attr.exceptions: attrs
+ attr.filters: attrs
+ attr.setters: attrs
+ attr.validators: attrs
+ attrs: attrs
+ attrs.__init__: attrs
+ attrs.converters: attrs
+ attrs.exceptions: attrs
+ attrs.filters: attrs
+ attrs.setters: attrs
+ attrs.validators: attrs
+ click: click
+ click.__init__: click
+ click._compat: click
+ click._termui_impl: click
+ click._textwrap: click
+ click._winconsole: click
+ click.core: click
+ click.decorators: click
+ click.exceptions: click
+ click.formatting: click
+ click.globals: click
+ click.parser: click
+ click.shell_completion: click
+ click.termui: click
+ click.testing: click
+ click.types: click
+ click.utils: click
+ colorama: colorama
+ colorama.__init__: colorama
+ colorama.ansi: colorama
+ colorama.ansitowin32: colorama
+ colorama.initialise: colorama
+ colorama.win32: colorama
+ colorama.winterm: colorama
+ django: Django
+ django.__init__: Django
+ django.__main__: Django
+ django.apps: Django
+ django.apps.__init__: Django
+ django.apps.config: Django
+ django.apps.registry: Django
+ django.conf: Django
+ django.conf.__init__: Django
+ django.conf.global_settings: Django
+ django.conf.locale: Django
+ django.conf.locale.__init__: Django
+ django.conf.locale.ar: Django
+ django.conf.locale.ar.__init__: Django
+ django.conf.locale.ar.formats: Django
+ django.conf.locale.ar_DZ: Django
+ django.conf.locale.ar_DZ.__init__: Django
+ django.conf.locale.ar_DZ.formats: Django
+ django.conf.locale.az: Django
+ django.conf.locale.az.__init__: Django
+ django.conf.locale.az.formats: Django
+ django.conf.locale.bg: Django
+ django.conf.locale.bg.__init__: Django
+ django.conf.locale.bg.formats: Django
+ django.conf.locale.bn: Django
+ django.conf.locale.bn.__init__: Django
+ django.conf.locale.bn.formats: Django
+ django.conf.locale.bs: Django
+ django.conf.locale.bs.__init__: Django
+ django.conf.locale.bs.formats: Django
+ django.conf.locale.ca: Django
+ django.conf.locale.ca.__init__: Django
+ django.conf.locale.ca.formats: Django
+ django.conf.locale.cs: Django
+ django.conf.locale.cs.__init__: Django
+ django.conf.locale.cs.formats: Django
+ django.conf.locale.cy: Django
+ django.conf.locale.cy.__init__: Django
+ django.conf.locale.cy.formats: Django
+ django.conf.locale.da: Django
+ django.conf.locale.da.__init__: Django
+ django.conf.locale.da.formats: Django
+ django.conf.locale.de: Django
+ django.conf.locale.de.__init__: Django
+ django.conf.locale.de.formats: Django
+ django.conf.locale.de_CH: Django
+ django.conf.locale.de_CH.__init__: Django
+ django.conf.locale.de_CH.formats: Django
+ django.conf.locale.el: Django
+ django.conf.locale.el.__init__: Django
+ django.conf.locale.el.formats: Django
+ django.conf.locale.en: Django
+ django.conf.locale.en.__init__: Django
+ django.conf.locale.en.formats: Django
+ django.conf.locale.en_AU: Django
+ django.conf.locale.en_AU.__init__: Django
+ django.conf.locale.en_AU.formats: Django
+ django.conf.locale.en_GB: Django
+ django.conf.locale.en_GB.__init__: Django
+ django.conf.locale.en_GB.formats: Django
+ django.conf.locale.eo: Django
+ django.conf.locale.eo.__init__: Django
+ django.conf.locale.eo.formats: Django
+ django.conf.locale.es: Django
+ django.conf.locale.es.__init__: Django
+ django.conf.locale.es.formats: Django
+ django.conf.locale.es_AR: Django
+ django.conf.locale.es_AR.__init__: Django
+ django.conf.locale.es_AR.formats: Django
+ django.conf.locale.es_CO: Django
+ django.conf.locale.es_CO.__init__: Django
+ django.conf.locale.es_CO.formats: Django
+ django.conf.locale.es_MX: Django
+ django.conf.locale.es_MX.__init__: Django
+ django.conf.locale.es_MX.formats: Django
+ django.conf.locale.es_NI: Django
+ django.conf.locale.es_NI.__init__: Django
+ django.conf.locale.es_NI.formats: Django
+ django.conf.locale.es_PR: Django
+ django.conf.locale.es_PR.__init__: Django
+ django.conf.locale.es_PR.formats: Django
+ django.conf.locale.et: Django
+ django.conf.locale.et.__init__: Django
+ django.conf.locale.et.formats: Django
+ django.conf.locale.eu: Django
+ django.conf.locale.eu.__init__: Django
+ django.conf.locale.eu.formats: Django
+ django.conf.locale.fa: Django
+ django.conf.locale.fa.__init__: Django
+ django.conf.locale.fa.formats: Django
+ django.conf.locale.fi: Django
+ django.conf.locale.fi.__init__: Django
+ django.conf.locale.fi.formats: Django
+ django.conf.locale.fr: Django
+ django.conf.locale.fr.__init__: Django
+ django.conf.locale.fr.formats: Django
+ django.conf.locale.fy: Django
+ django.conf.locale.fy.__init__: Django
+ django.conf.locale.fy.formats: Django
+ django.conf.locale.ga: Django
+ django.conf.locale.ga.__init__: Django
+ django.conf.locale.ga.formats: Django
+ django.conf.locale.gd: Django
+ django.conf.locale.gd.__init__: Django
+ django.conf.locale.gd.formats: Django
+ django.conf.locale.gl: Django
+ django.conf.locale.gl.__init__: Django
+ django.conf.locale.gl.formats: Django
+ django.conf.locale.he: Django
+ django.conf.locale.he.__init__: Django
+ django.conf.locale.he.formats: Django
+ django.conf.locale.hi: Django
+ django.conf.locale.hi.__init__: Django
+ django.conf.locale.hi.formats: Django
+ django.conf.locale.hr: Django
+ django.conf.locale.hr.__init__: Django
+ django.conf.locale.hr.formats: Django
+ django.conf.locale.hu: Django
+ django.conf.locale.hu.__init__: Django
+ django.conf.locale.hu.formats: Django
+ django.conf.locale.id: Django
+ django.conf.locale.id.__init__: Django
+ django.conf.locale.id.formats: Django
+ django.conf.locale.ig: Django
+ django.conf.locale.ig.__init__: Django
+ django.conf.locale.ig.formats: Django
+ django.conf.locale.is: Django
+ django.conf.locale.is.__init__: Django
+ django.conf.locale.is.formats: Django
+ django.conf.locale.it: Django
+ django.conf.locale.it.__init__: Django
+ django.conf.locale.it.formats: Django
+ django.conf.locale.ja: Django
+ django.conf.locale.ja.__init__: Django
+ django.conf.locale.ja.formats: Django
+ django.conf.locale.ka: Django
+ django.conf.locale.ka.__init__: Django
+ django.conf.locale.ka.formats: Django
+ django.conf.locale.km: Django
+ django.conf.locale.km.__init__: Django
+ django.conf.locale.km.formats: Django
+ django.conf.locale.kn: Django
+ django.conf.locale.kn.__init__: Django
+ django.conf.locale.kn.formats: Django
+ django.conf.locale.ko: Django
+ django.conf.locale.ko.__init__: Django
+ django.conf.locale.ko.formats: Django
+ django.conf.locale.ky: Django
+ django.conf.locale.ky.__init__: Django
+ django.conf.locale.ky.formats: Django
+ django.conf.locale.lt: Django
+ django.conf.locale.lt.__init__: Django
+ django.conf.locale.lt.formats: Django
+ django.conf.locale.lv: Django
+ django.conf.locale.lv.__init__: Django
+ django.conf.locale.lv.formats: Django
+ django.conf.locale.mk: Django
+ django.conf.locale.mk.__init__: Django
+ django.conf.locale.mk.formats: Django
+ django.conf.locale.ml: Django
+ django.conf.locale.ml.__init__: Django
+ django.conf.locale.ml.formats: Django
+ django.conf.locale.mn: Django
+ django.conf.locale.mn.__init__: Django
+ django.conf.locale.mn.formats: Django
+ django.conf.locale.ms: Django
+ django.conf.locale.ms.__init__: Django
+ django.conf.locale.ms.formats: Django
+ django.conf.locale.nb: Django
+ django.conf.locale.nb.__init__: Django
+ django.conf.locale.nb.formats: Django
+ django.conf.locale.nl: Django
+ django.conf.locale.nl.__init__: Django
+ django.conf.locale.nl.formats: Django
+ django.conf.locale.nn: Django
+ django.conf.locale.nn.__init__: Django
+ django.conf.locale.nn.formats: Django
+ django.conf.locale.pl: Django
+ django.conf.locale.pl.__init__: Django
+ django.conf.locale.pl.formats: Django
+ django.conf.locale.pt: Django
+ django.conf.locale.pt.__init__: Django
+ django.conf.locale.pt.formats: Django
+ django.conf.locale.pt_BR: Django
+ django.conf.locale.pt_BR.__init__: Django
+ django.conf.locale.pt_BR.formats: Django
+ django.conf.locale.ro: Django
+ django.conf.locale.ro.__init__: Django
+ django.conf.locale.ro.formats: Django
+ django.conf.locale.ru: Django
+ django.conf.locale.ru.__init__: Django
+ django.conf.locale.ru.formats: Django
+ django.conf.locale.sk: Django
+ django.conf.locale.sk.__init__: Django
+ django.conf.locale.sk.formats: Django
+ django.conf.locale.sl: Django
+ django.conf.locale.sl.__init__: Django
+ django.conf.locale.sl.formats: Django
+ django.conf.locale.sq: Django
+ django.conf.locale.sq.__init__: Django
+ django.conf.locale.sq.formats: Django
+ django.conf.locale.sr: Django
+ django.conf.locale.sr.__init__: Django
+ django.conf.locale.sr.formats: Django
+ django.conf.locale.sr_Latn: Django
+ django.conf.locale.sr_Latn.__init__: Django
+ django.conf.locale.sr_Latn.formats: Django
+ django.conf.locale.sv: Django
+ django.conf.locale.sv.__init__: Django
+ django.conf.locale.sv.formats: Django
+ django.conf.locale.ta: Django
+ django.conf.locale.ta.__init__: Django
+ django.conf.locale.ta.formats: Django
+ django.conf.locale.te: Django
+ django.conf.locale.te.__init__: Django
+ django.conf.locale.te.formats: Django
+ django.conf.locale.tg: Django
+ django.conf.locale.tg.__init__: Django
+ django.conf.locale.tg.formats: Django
+ django.conf.locale.th: Django
+ django.conf.locale.th.__init__: Django
+ django.conf.locale.th.formats: Django
+ django.conf.locale.tk: Django
+ django.conf.locale.tk.__init__: Django
+ django.conf.locale.tk.formats: Django
+ django.conf.locale.tr: Django
+ django.conf.locale.tr.__init__: Django
+ django.conf.locale.tr.formats: Django
+ django.conf.locale.uk: Django
+ django.conf.locale.uk.__init__: Django
+ django.conf.locale.uk.formats: Django
+ django.conf.locale.uz: Django
+ django.conf.locale.uz.__init__: Django
+ django.conf.locale.uz.formats: Django
+ django.conf.locale.vi: Django
+ django.conf.locale.vi.__init__: Django
+ django.conf.locale.vi.formats: Django
+ django.conf.locale.zh_Hans: Django
+ django.conf.locale.zh_Hans.__init__: Django
+ django.conf.locale.zh_Hans.formats: Django
+ django.conf.locale.zh_Hant: Django
+ django.conf.locale.zh_Hant.__init__: Django
+ django.conf.locale.zh_Hant.formats: Django
+ django.conf.urls: Django
+ django.conf.urls.__init__: Django
+ django.conf.urls.i18n: Django
+ django.conf.urls.static: Django
+ django.contrib: Django
+ django.contrib.__init__: Django
+ django.contrib.admin: Django
+ django.contrib.admin.__init__: Django
+ django.contrib.admin.actions: Django
+ django.contrib.admin.apps: Django
+ django.contrib.admin.checks: Django
+ django.contrib.admin.decorators: Django
+ django.contrib.admin.exceptions: Django
+ django.contrib.admin.filters: Django
+ django.contrib.admin.forms: Django
+ django.contrib.admin.helpers: Django
+ django.contrib.admin.migrations: Django
+ django.contrib.admin.migrations.0001_initial: Django
+ django.contrib.admin.migrations.0002_logentry_remove_auto_add: Django
+ django.contrib.admin.migrations.0003_logentry_add_action_flag_choices: Django
+ django.contrib.admin.migrations.__init__: Django
+ django.contrib.admin.models: Django
+ django.contrib.admin.options: Django
+ django.contrib.admin.sites: Django
+ django.contrib.admin.templatetags: Django
+ django.contrib.admin.templatetags.__init__: Django
+ django.contrib.admin.templatetags.admin_list: Django
+ django.contrib.admin.templatetags.admin_modify: Django
+ django.contrib.admin.templatetags.admin_urls: Django
+ django.contrib.admin.templatetags.base: Django
+ django.contrib.admin.templatetags.log: Django
+ django.contrib.admin.tests: Django
+ django.contrib.admin.utils: Django
+ django.contrib.admin.views: Django
+ django.contrib.admin.views.__init__: Django
+ django.contrib.admin.views.autocomplete: Django
+ django.contrib.admin.views.decorators: Django
+ django.contrib.admin.views.main: Django
+ django.contrib.admin.widgets: Django
+ django.contrib.admindocs: Django
+ django.contrib.admindocs.__init__: Django
+ django.contrib.admindocs.apps: Django
+ django.contrib.admindocs.middleware: Django
+ django.contrib.admindocs.urls: Django
+ django.contrib.admindocs.utils: Django
+ django.contrib.admindocs.views: Django
+ django.contrib.auth: Django
+ django.contrib.auth.__init__: Django
+ django.contrib.auth.admin: Django
+ django.contrib.auth.apps: Django
+ django.contrib.auth.backends: Django
+ django.contrib.auth.base_user: Django
+ django.contrib.auth.checks: Django
+ django.contrib.auth.context_processors: Django
+ django.contrib.auth.decorators: Django
+ django.contrib.auth.forms: Django
+ django.contrib.auth.handlers: Django
+ django.contrib.auth.handlers.__init__: Django
+ django.contrib.auth.handlers.modwsgi: Django
+ django.contrib.auth.hashers: Django
+ django.contrib.auth.management: Django
+ django.contrib.auth.management.__init__: Django
+ django.contrib.auth.management.commands: Django
+ django.contrib.auth.management.commands.__init__: Django
+ django.contrib.auth.management.commands.changepassword: Django
+ django.contrib.auth.management.commands.createsuperuser: Django
+ django.contrib.auth.middleware: Django
+ django.contrib.auth.migrations: Django
+ django.contrib.auth.migrations.0001_initial: Django
+ django.contrib.auth.migrations.0002_alter_permission_name_max_length: Django
+ django.contrib.auth.migrations.0003_alter_user_email_max_length: Django
+ django.contrib.auth.migrations.0004_alter_user_username_opts: Django
+ django.contrib.auth.migrations.0005_alter_user_last_login_null: Django
+ django.contrib.auth.migrations.0006_require_contenttypes_0002: Django
+ django.contrib.auth.migrations.0007_alter_validators_add_error_messages: Django
+ django.contrib.auth.migrations.0008_alter_user_username_max_length: Django
+ django.contrib.auth.migrations.0009_alter_user_last_name_max_length: Django
+ django.contrib.auth.migrations.0010_alter_group_name_max_length: Django
+ django.contrib.auth.migrations.0011_update_proxy_permissions: Django
+ django.contrib.auth.migrations.0012_alter_user_first_name_max_length: Django
+ django.contrib.auth.migrations.__init__: Django
+ django.contrib.auth.mixins: Django
+ django.contrib.auth.models: Django
+ django.contrib.auth.password_validation: Django
+ django.contrib.auth.signals: Django
+ django.contrib.auth.tokens: Django
+ django.contrib.auth.urls: Django
+ django.contrib.auth.validators: Django
+ django.contrib.auth.views: Django
+ django.contrib.contenttypes: Django
+ django.contrib.contenttypes.__init__: Django
+ django.contrib.contenttypes.admin: Django
+ django.contrib.contenttypes.apps: Django
+ django.contrib.contenttypes.checks: Django
+ django.contrib.contenttypes.fields: Django
+ django.contrib.contenttypes.forms: Django
+ django.contrib.contenttypes.management: Django
+ django.contrib.contenttypes.management.__init__: Django
+ django.contrib.contenttypes.management.commands: Django
+ django.contrib.contenttypes.management.commands.__init__: Django
+ django.contrib.contenttypes.management.commands.remove_stale_contenttypes: Django
+ django.contrib.contenttypes.migrations: Django
+ django.contrib.contenttypes.migrations.0001_initial: Django
+ django.contrib.contenttypes.migrations.0002_remove_content_type_name: Django
+ django.contrib.contenttypes.migrations.__init__: Django
+ django.contrib.contenttypes.models: Django
+ django.contrib.contenttypes.views: Django
+ django.contrib.flatpages: Django
+ django.contrib.flatpages.__init__: Django
+ django.contrib.flatpages.admin: Django
+ django.contrib.flatpages.apps: Django
+ django.contrib.flatpages.forms: Django
+ django.contrib.flatpages.middleware: Django
+ django.contrib.flatpages.migrations: Django
+ django.contrib.flatpages.migrations.0001_initial: Django
+ django.contrib.flatpages.migrations.__init__: Django
+ django.contrib.flatpages.models: Django
+ django.contrib.flatpages.sitemaps: Django
+ django.contrib.flatpages.templatetags: Django
+ django.contrib.flatpages.templatetags.__init__: Django
+ django.contrib.flatpages.templatetags.flatpages: Django
+ django.contrib.flatpages.urls: Django
+ django.contrib.flatpages.views: Django
+ django.contrib.gis: Django
+ django.contrib.gis.__init__: Django
+ django.contrib.gis.admin: Django
+ django.contrib.gis.admin.__init__: Django
+ django.contrib.gis.admin.options: Django
+ django.contrib.gis.admin.widgets: Django
+ django.contrib.gis.apps: Django
+ django.contrib.gis.db: Django
+ django.contrib.gis.db.__init__: Django
+ django.contrib.gis.db.backends: Django
+ django.contrib.gis.db.backends.__init__: Django
+ django.contrib.gis.db.backends.base: Django
+ django.contrib.gis.db.backends.base.__init__: Django
+ django.contrib.gis.db.backends.base.adapter: Django
+ django.contrib.gis.db.backends.base.features: Django
+ django.contrib.gis.db.backends.base.models: Django
+ django.contrib.gis.db.backends.base.operations: Django
+ django.contrib.gis.db.backends.mysql: Django
+ django.contrib.gis.db.backends.mysql.__init__: Django
+ django.contrib.gis.db.backends.mysql.base: Django
+ django.contrib.gis.db.backends.mysql.features: Django
+ django.contrib.gis.db.backends.mysql.introspection: Django
+ django.contrib.gis.db.backends.mysql.operations: Django
+ django.contrib.gis.db.backends.mysql.schema: Django
+ django.contrib.gis.db.backends.oracle: Django
+ django.contrib.gis.db.backends.oracle.__init__: Django
+ django.contrib.gis.db.backends.oracle.adapter: Django
+ django.contrib.gis.db.backends.oracle.base: Django
+ django.contrib.gis.db.backends.oracle.features: Django
+ django.contrib.gis.db.backends.oracle.introspection: Django
+ django.contrib.gis.db.backends.oracle.models: Django
+ django.contrib.gis.db.backends.oracle.operations: Django
+ django.contrib.gis.db.backends.oracle.schema: Django
+ django.contrib.gis.db.backends.postgis: Django
+ django.contrib.gis.db.backends.postgis.__init__: Django
+ django.contrib.gis.db.backends.postgis.adapter: Django
+ django.contrib.gis.db.backends.postgis.base: Django
+ django.contrib.gis.db.backends.postgis.const: Django
+ django.contrib.gis.db.backends.postgis.features: Django
+ django.contrib.gis.db.backends.postgis.introspection: Django
+ django.contrib.gis.db.backends.postgis.models: Django
+ django.contrib.gis.db.backends.postgis.operations: Django
+ django.contrib.gis.db.backends.postgis.pgraster: Django
+ django.contrib.gis.db.backends.postgis.schema: Django
+ django.contrib.gis.db.backends.spatialite: Django
+ django.contrib.gis.db.backends.spatialite.__init__: Django
+ django.contrib.gis.db.backends.spatialite.adapter: Django
+ django.contrib.gis.db.backends.spatialite.base: Django
+ django.contrib.gis.db.backends.spatialite.client: Django
+ django.contrib.gis.db.backends.spatialite.features: Django
+ django.contrib.gis.db.backends.spatialite.introspection: Django
+ django.contrib.gis.db.backends.spatialite.models: Django
+ django.contrib.gis.db.backends.spatialite.operations: Django
+ django.contrib.gis.db.backends.spatialite.schema: Django
+ django.contrib.gis.db.backends.utils: Django
+ django.contrib.gis.db.models: Django
+ django.contrib.gis.db.models.__init__: Django
+ django.contrib.gis.db.models.aggregates: Django
+ django.contrib.gis.db.models.fields: Django
+ django.contrib.gis.db.models.functions: Django
+ django.contrib.gis.db.models.lookups: Django
+ django.contrib.gis.db.models.proxy: Django
+ django.contrib.gis.db.models.sql: Django
+ django.contrib.gis.db.models.sql.__init__: Django
+ django.contrib.gis.db.models.sql.conversion: Django
+ django.contrib.gis.feeds: Django
+ django.contrib.gis.forms: Django
+ django.contrib.gis.forms.__init__: Django
+ django.contrib.gis.forms.fields: Django
+ django.contrib.gis.forms.widgets: Django
+ django.contrib.gis.gdal: Django
+ django.contrib.gis.gdal.__init__: Django
+ django.contrib.gis.gdal.base: Django
+ django.contrib.gis.gdal.datasource: Django
+ django.contrib.gis.gdal.driver: Django
+ django.contrib.gis.gdal.envelope: Django
+ django.contrib.gis.gdal.error: Django
+ django.contrib.gis.gdal.feature: Django
+ django.contrib.gis.gdal.field: Django
+ django.contrib.gis.gdal.geometries: Django
+ django.contrib.gis.gdal.geomtype: Django
+ django.contrib.gis.gdal.layer: Django
+ django.contrib.gis.gdal.libgdal: Django
+ django.contrib.gis.gdal.prototypes: Django
+ django.contrib.gis.gdal.prototypes.__init__: Django
+ django.contrib.gis.gdal.prototypes.ds: Django
+ django.contrib.gis.gdal.prototypes.errcheck: Django
+ django.contrib.gis.gdal.prototypes.generation: Django
+ django.contrib.gis.gdal.prototypes.geom: Django
+ django.contrib.gis.gdal.prototypes.raster: Django
+ django.contrib.gis.gdal.prototypes.srs: Django
+ django.contrib.gis.gdal.raster: Django
+ django.contrib.gis.gdal.raster.__init__: Django
+ django.contrib.gis.gdal.raster.band: Django
+ django.contrib.gis.gdal.raster.base: Django
+ django.contrib.gis.gdal.raster.const: Django
+ django.contrib.gis.gdal.raster.source: Django
+ django.contrib.gis.gdal.srs: Django
+ django.contrib.gis.geoip2: Django
+ django.contrib.gis.geoip2.__init__: Django
+ django.contrib.gis.geoip2.base: Django
+ django.contrib.gis.geoip2.resources: Django
+ django.contrib.gis.geometry: Django
+ django.contrib.gis.geos: Django
+ django.contrib.gis.geos.__init__: Django
+ django.contrib.gis.geos.base: Django
+ django.contrib.gis.geos.collections: Django
+ django.contrib.gis.geos.coordseq: Django
+ django.contrib.gis.geos.error: Django
+ django.contrib.gis.geos.factory: Django
+ django.contrib.gis.geos.geometry: Django
+ django.contrib.gis.geos.io: Django
+ django.contrib.gis.geos.libgeos: Django
+ django.contrib.gis.geos.linestring: Django
+ django.contrib.gis.geos.mutable_list: Django
+ django.contrib.gis.geos.point: Django
+ django.contrib.gis.geos.polygon: Django
+ django.contrib.gis.geos.prepared: Django
+ django.contrib.gis.geos.prototypes: Django
+ django.contrib.gis.geos.prototypes.__init__: Django
+ django.contrib.gis.geos.prototypes.coordseq: Django
+ django.contrib.gis.geos.prototypes.errcheck: Django
+ django.contrib.gis.geos.prototypes.geom: Django
+ django.contrib.gis.geos.prototypes.io: Django
+ django.contrib.gis.geos.prototypes.misc: Django
+ django.contrib.gis.geos.prototypes.predicates: Django
+ django.contrib.gis.geos.prototypes.prepared: Django
+ django.contrib.gis.geos.prototypes.threadsafe: Django
+ django.contrib.gis.geos.prototypes.topology: Django
+ django.contrib.gis.management: Django
+ django.contrib.gis.management.__init__: Django
+ django.contrib.gis.management.commands: Django
+ django.contrib.gis.management.commands.__init__: Django
+ django.contrib.gis.management.commands.inspectdb: Django
+ django.contrib.gis.management.commands.ogrinspect: Django
+ django.contrib.gis.measure: Django
+ django.contrib.gis.ptr: Django
+ django.contrib.gis.serializers: Django
+ django.contrib.gis.serializers.__init__: Django
+ django.contrib.gis.serializers.geojson: Django
+ django.contrib.gis.shortcuts: Django
+ django.contrib.gis.sitemaps: Django
+ django.contrib.gis.sitemaps.__init__: Django
+ django.contrib.gis.sitemaps.kml: Django
+ django.contrib.gis.sitemaps.views: Django
+ django.contrib.gis.utils: Django
+ django.contrib.gis.utils.__init__: Django
+ django.contrib.gis.utils.layermapping: Django
+ django.contrib.gis.utils.ogrinfo: Django
+ django.contrib.gis.utils.ogrinspect: Django
+ django.contrib.gis.utils.srs: Django
+ django.contrib.gis.views: Django
+ django.contrib.humanize: Django
+ django.contrib.humanize.__init__: Django
+ django.contrib.humanize.apps: Django
+ django.contrib.humanize.templatetags: Django
+ django.contrib.humanize.templatetags.__init__: Django
+ django.contrib.humanize.templatetags.humanize: Django
+ django.contrib.messages: Django
+ django.contrib.messages.__init__: Django
+ django.contrib.messages.api: Django
+ django.contrib.messages.apps: Django
+ django.contrib.messages.constants: Django
+ django.contrib.messages.context_processors: Django
+ django.contrib.messages.middleware: Django
+ django.contrib.messages.storage: Django
+ django.contrib.messages.storage.__init__: Django
+ django.contrib.messages.storage.base: Django
+ django.contrib.messages.storage.cookie: Django
+ django.contrib.messages.storage.fallback: Django
+ django.contrib.messages.storage.session: Django
+ django.contrib.messages.utils: Django
+ django.contrib.messages.views: Django
+ django.contrib.postgres: Django
+ django.contrib.postgres.__init__: Django
+ django.contrib.postgres.aggregates: Django
+ django.contrib.postgres.aggregates.__init__: Django
+ django.contrib.postgres.aggregates.general: Django
+ django.contrib.postgres.aggregates.mixins: Django
+ django.contrib.postgres.aggregates.statistics: Django
+ django.contrib.postgres.apps: Django
+ django.contrib.postgres.constraints: Django
+ django.contrib.postgres.expressions: Django
+ django.contrib.postgres.fields: Django
+ django.contrib.postgres.fields.__init__: Django
+ django.contrib.postgres.fields.array: Django
+ django.contrib.postgres.fields.citext: Django
+ django.contrib.postgres.fields.hstore: Django
+ django.contrib.postgres.fields.jsonb: Django
+ django.contrib.postgres.fields.ranges: Django
+ django.contrib.postgres.fields.utils: Django
+ django.contrib.postgres.forms: Django
+ django.contrib.postgres.forms.__init__: Django
+ django.contrib.postgres.forms.array: Django
+ django.contrib.postgres.forms.hstore: Django
+ django.contrib.postgres.forms.ranges: Django
+ django.contrib.postgres.functions: Django
+ django.contrib.postgres.indexes: Django
+ django.contrib.postgres.lookups: Django
+ django.contrib.postgres.operations: Django
+ django.contrib.postgres.search: Django
+ django.contrib.postgres.serializers: Django
+ django.contrib.postgres.signals: Django
+ django.contrib.postgres.utils: Django
+ django.contrib.postgres.validators: Django
+ django.contrib.redirects: Django
+ django.contrib.redirects.__init__: Django
+ django.contrib.redirects.admin: Django
+ django.contrib.redirects.apps: Django
+ django.contrib.redirects.middleware: Django
+ django.contrib.redirects.migrations: Django
+ django.contrib.redirects.migrations.0001_initial: Django
+ django.contrib.redirects.migrations.0002_alter_redirect_new_path_help_text: Django
+ django.contrib.redirects.migrations.__init__: Django
+ django.contrib.redirects.models: Django
+ django.contrib.sessions: Django
+ django.contrib.sessions.__init__: Django
+ django.contrib.sessions.apps: Django
+ django.contrib.sessions.backends: Django
+ django.contrib.sessions.backends.__init__: Django
+ django.contrib.sessions.backends.base: Django
+ django.contrib.sessions.backends.cache: Django
+ django.contrib.sessions.backends.cached_db: Django
+ django.contrib.sessions.backends.db: Django
+ django.contrib.sessions.backends.file: Django
+ django.contrib.sessions.backends.signed_cookies: Django
+ django.contrib.sessions.base_session: Django
+ django.contrib.sessions.exceptions: Django
+ django.contrib.sessions.management: Django
+ django.contrib.sessions.management.__init__: Django
+ django.contrib.sessions.management.commands: Django
+ django.contrib.sessions.management.commands.__init__: Django
+ django.contrib.sessions.management.commands.clearsessions: Django
+ django.contrib.sessions.middleware: Django
+ django.contrib.sessions.migrations: Django
+ django.contrib.sessions.migrations.0001_initial: Django
+ django.contrib.sessions.migrations.__init__: Django
+ django.contrib.sessions.models: Django
+ django.contrib.sessions.serializers: Django
+ django.contrib.sitemaps: Django
+ django.contrib.sitemaps.__init__: Django
+ django.contrib.sitemaps.apps: Django
+ django.contrib.sitemaps.management: Django
+ django.contrib.sitemaps.management.__init__: Django
+ django.contrib.sitemaps.management.commands: Django
+ django.contrib.sitemaps.management.commands.__init__: Django
+ django.contrib.sitemaps.management.commands.ping_google: Django
+ django.contrib.sitemaps.views: Django
+ django.contrib.sites: Django
+ django.contrib.sites.__init__: Django
+ django.contrib.sites.admin: Django
+ django.contrib.sites.apps: Django
+ django.contrib.sites.checks: Django
+ django.contrib.sites.management: Django
+ django.contrib.sites.managers: Django
+ django.contrib.sites.middleware: Django
+ django.contrib.sites.migrations: Django
+ django.contrib.sites.migrations.0001_initial: Django
+ django.contrib.sites.migrations.0002_alter_domain_unique: Django
+ django.contrib.sites.migrations.__init__: Django
+ django.contrib.sites.models: Django
+ django.contrib.sites.requests: Django
+ django.contrib.sites.shortcuts: Django
+ django.contrib.staticfiles: Django
+ django.contrib.staticfiles.__init__: Django
+ django.contrib.staticfiles.apps: Django
+ django.contrib.staticfiles.checks: Django
+ django.contrib.staticfiles.finders: Django
+ django.contrib.staticfiles.handlers: Django
+ django.contrib.staticfiles.management: Django
+ django.contrib.staticfiles.management.__init__: Django
+ django.contrib.staticfiles.management.commands: Django
+ django.contrib.staticfiles.management.commands.__init__: Django
+ django.contrib.staticfiles.management.commands.collectstatic: Django
+ django.contrib.staticfiles.management.commands.findstatic: Django
+ django.contrib.staticfiles.management.commands.runserver: Django
+ django.contrib.staticfiles.storage: Django
+ django.contrib.staticfiles.testing: Django
+ django.contrib.staticfiles.urls: Django
+ django.contrib.staticfiles.utils: Django
+ django.contrib.staticfiles.views: Django
+ django.contrib.syndication: Django
+ django.contrib.syndication.__init__: Django
+ django.contrib.syndication.apps: Django
+ django.contrib.syndication.views: Django
+ django.core: Django
+ django.core.__init__: Django
+ django.core.asgi: Django
+ django.core.cache: Django
+ django.core.cache.__init__: Django
+ django.core.cache.backends: Django
+ django.core.cache.backends.__init__: Django
+ django.core.cache.backends.base: Django
+ django.core.cache.backends.db: Django
+ django.core.cache.backends.dummy: Django
+ django.core.cache.backends.filebased: Django
+ django.core.cache.backends.locmem: Django
+ django.core.cache.backends.memcached: Django
+ django.core.cache.backends.redis: Django
+ django.core.cache.utils: Django
+ django.core.checks: Django
+ django.core.checks.__init__: Django
+ django.core.checks.async_checks: Django
+ django.core.checks.caches: Django
+ django.core.checks.compatibility: Django
+ django.core.checks.compatibility.__init__: Django
+ django.core.checks.compatibility.django_4_0: Django
+ django.core.checks.database: Django
+ django.core.checks.files: Django
+ django.core.checks.messages: Django
+ django.core.checks.model_checks: Django
+ django.core.checks.registry: Django
+ django.core.checks.security: Django
+ django.core.checks.security.__init__: Django
+ django.core.checks.security.base: Django
+ django.core.checks.security.csrf: Django
+ django.core.checks.security.sessions: Django
+ django.core.checks.templates: Django
+ django.core.checks.translation: Django
+ django.core.checks.urls: Django
+ django.core.exceptions: Django
+ django.core.files: Django
+ django.core.files.__init__: Django
+ django.core.files.base: Django
+ django.core.files.images: Django
+ django.core.files.locks: Django
+ django.core.files.move: Django
+ django.core.files.storage: Django
+ django.core.files.temp: Django
+ django.core.files.uploadedfile: Django
+ django.core.files.uploadhandler: Django
+ django.core.files.utils: Django
+ django.core.handlers: Django
+ django.core.handlers.__init__: Django
+ django.core.handlers.asgi: Django
+ django.core.handlers.base: Django
+ django.core.handlers.exception: Django
+ django.core.handlers.wsgi: Django
+ django.core.mail: Django
+ django.core.mail.__init__: Django
+ django.core.mail.backends: Django
+ django.core.mail.backends.__init__: Django
+ django.core.mail.backends.base: Django
+ django.core.mail.backends.console: Django
+ django.core.mail.backends.dummy: Django
+ django.core.mail.backends.filebased: Django
+ django.core.mail.backends.locmem: Django
+ django.core.mail.backends.smtp: Django
+ django.core.mail.message: Django
+ django.core.mail.utils: Django
+ django.core.management: Django
+ django.core.management.__init__: Django
+ django.core.management.base: Django
+ django.core.management.color: Django
+ django.core.management.commands: Django
+ django.core.management.commands.__init__: Django
+ django.core.management.commands.check: Django
+ django.core.management.commands.compilemessages: Django
+ django.core.management.commands.createcachetable: Django
+ django.core.management.commands.dbshell: Django
+ django.core.management.commands.diffsettings: Django
+ django.core.management.commands.dumpdata: Django
+ django.core.management.commands.flush: Django
+ django.core.management.commands.inspectdb: Django
+ django.core.management.commands.loaddata: Django
+ django.core.management.commands.makemessages: Django
+ django.core.management.commands.makemigrations: Django
+ django.core.management.commands.migrate: Django
+ django.core.management.commands.runserver: Django
+ django.core.management.commands.sendtestemail: Django
+ django.core.management.commands.shell: Django
+ django.core.management.commands.showmigrations: Django
+ django.core.management.commands.sqlflush: Django
+ django.core.management.commands.sqlmigrate: Django
+ django.core.management.commands.sqlsequencereset: Django
+ django.core.management.commands.squashmigrations: Django
+ django.core.management.commands.startapp: Django
+ django.core.management.commands.startproject: Django
+ django.core.management.commands.test: Django
+ django.core.management.commands.testserver: Django
+ django.core.management.sql: Django
+ django.core.management.templates: Django
+ django.core.management.utils: Django
+ django.core.paginator: Django
+ django.core.serializers: Django
+ django.core.serializers.__init__: Django
+ django.core.serializers.base: Django
+ django.core.serializers.json: Django
+ django.core.serializers.jsonl: Django
+ django.core.serializers.python: Django
+ django.core.serializers.pyyaml: Django
+ django.core.serializers.xml_serializer: Django
+ django.core.servers: Django
+ django.core.servers.__init__: Django
+ django.core.servers.basehttp: Django
+ django.core.signals: Django
+ django.core.signing: Django
+ django.core.validators: Django
+ django.core.wsgi: Django
+ django.db: Django
+ django.db.__init__: Django
+ django.db.backends: Django
+ django.db.backends.__init__: Django
+ django.db.backends.base: Django
+ django.db.backends.base.__init__: Django
+ django.db.backends.base.base: Django
+ django.db.backends.base.client: Django
+ django.db.backends.base.creation: Django
+ django.db.backends.base.features: Django
+ django.db.backends.base.introspection: Django
+ django.db.backends.base.operations: Django
+ django.db.backends.base.schema: Django
+ django.db.backends.base.validation: Django
+ django.db.backends.ddl_references: Django
+ django.db.backends.dummy: Django
+ django.db.backends.dummy.__init__: Django
+ django.db.backends.dummy.base: Django
+ django.db.backends.dummy.features: Django
+ django.db.backends.mysql: Django
+ django.db.backends.mysql.__init__: Django
+ django.db.backends.mysql.base: Django
+ django.db.backends.mysql.client: Django
+ django.db.backends.mysql.compiler: Django
+ django.db.backends.mysql.creation: Django
+ django.db.backends.mysql.features: Django
+ django.db.backends.mysql.introspection: Django
+ django.db.backends.mysql.operations: Django
+ django.db.backends.mysql.schema: Django
+ django.db.backends.mysql.validation: Django
+ django.db.backends.oracle: Django
+ django.db.backends.oracle.__init__: Django
+ django.db.backends.oracle.base: Django
+ django.db.backends.oracle.client: Django
+ django.db.backends.oracle.creation: Django
+ django.db.backends.oracle.features: Django
+ django.db.backends.oracle.functions: Django
+ django.db.backends.oracle.introspection: Django
+ django.db.backends.oracle.operations: Django
+ django.db.backends.oracle.schema: Django
+ django.db.backends.oracle.utils: Django
+ django.db.backends.oracle.validation: Django
+ django.db.backends.postgresql: Django
+ django.db.backends.postgresql.__init__: Django
+ django.db.backends.postgresql.base: Django
+ django.db.backends.postgresql.client: Django
+ django.db.backends.postgresql.creation: Django
+ django.db.backends.postgresql.features: Django
+ django.db.backends.postgresql.introspection: Django
+ django.db.backends.postgresql.operations: Django
+ django.db.backends.postgresql.schema: Django
+ django.db.backends.signals: Django
+ django.db.backends.sqlite3: Django
+ django.db.backends.sqlite3.__init__: Django
+ django.db.backends.sqlite3.base: Django
+ django.db.backends.sqlite3.client: Django
+ django.db.backends.sqlite3.creation: Django
+ django.db.backends.sqlite3.features: Django
+ django.db.backends.sqlite3.introspection: Django
+ django.db.backends.sqlite3.operations: Django
+ django.db.backends.sqlite3.schema: Django
+ django.db.backends.utils: Django
+ django.db.migrations: Django
+ django.db.migrations.__init__: Django
+ django.db.migrations.autodetector: Django
+ django.db.migrations.exceptions: Django
+ django.db.migrations.executor: Django
+ django.db.migrations.graph: Django
+ django.db.migrations.loader: Django
+ django.db.migrations.migration: Django
+ django.db.migrations.operations: Django
+ django.db.migrations.operations.__init__: Django
+ django.db.migrations.operations.base: Django
+ django.db.migrations.operations.fields: Django
+ django.db.migrations.operations.models: Django
+ django.db.migrations.operations.special: Django
+ django.db.migrations.optimizer: Django
+ django.db.migrations.questioner: Django
+ django.db.migrations.recorder: Django
+ django.db.migrations.serializer: Django
+ django.db.migrations.state: Django
+ django.db.migrations.utils: Django
+ django.db.migrations.writer: Django
+ django.db.models: Django
+ django.db.models.__init__: Django
+ django.db.models.aggregates: Django
+ django.db.models.base: Django
+ django.db.models.constants: Django
+ django.db.models.constraints: Django
+ django.db.models.deletion: Django
+ django.db.models.enums: Django
+ django.db.models.expressions: Django
+ django.db.models.fields: Django
+ django.db.models.fields.__init__: Django
+ django.db.models.fields.files: Django
+ django.db.models.fields.json: Django
+ django.db.models.fields.mixins: Django
+ django.db.models.fields.proxy: Django
+ django.db.models.fields.related: Django
+ django.db.models.fields.related_descriptors: Django
+ django.db.models.fields.related_lookups: Django
+ django.db.models.fields.reverse_related: Django
+ django.db.models.functions: Django
+ django.db.models.functions.__init__: Django
+ django.db.models.functions.comparison: Django
+ django.db.models.functions.datetime: Django
+ django.db.models.functions.math: Django
+ django.db.models.functions.mixins: Django
+ django.db.models.functions.text: Django
+ django.db.models.functions.window: Django
+ django.db.models.indexes: Django
+ django.db.models.lookups: Django
+ django.db.models.manager: Django
+ django.db.models.options: Django
+ django.db.models.query: Django
+ django.db.models.query_utils: Django
+ django.db.models.signals: Django
+ django.db.models.sql: Django
+ django.db.models.sql.__init__: Django
+ django.db.models.sql.compiler: Django
+ django.db.models.sql.constants: Django
+ django.db.models.sql.datastructures: Django
+ django.db.models.sql.query: Django
+ django.db.models.sql.subqueries: Django
+ django.db.models.sql.where: Django
+ django.db.models.utils: Django
+ django.db.transaction: Django
+ django.db.utils: Django
+ django.dispatch: Django
+ django.dispatch.__init__: Django
+ django.dispatch.dispatcher: Django
+ django.forms: Django
+ django.forms.__init__: Django
+ django.forms.boundfield: Django
+ django.forms.fields: Django
+ django.forms.forms: Django
+ django.forms.formsets: Django
+ django.forms.models: Django
+ django.forms.renderers: Django
+ django.forms.utils: Django
+ django.forms.widgets: Django
+ django.http: Django
+ django.http.__init__: Django
+ django.http.cookie: Django
+ django.http.multipartparser: Django
+ django.http.request: Django
+ django.http.response: Django
+ django.middleware: Django
+ django.middleware.__init__: Django
+ django.middleware.cache: Django
+ django.middleware.clickjacking: Django
+ django.middleware.common: Django
+ django.middleware.csrf: Django
+ django.middleware.gzip: Django
+ django.middleware.http: Django
+ django.middleware.locale: Django
+ django.middleware.security: Django
+ django.shortcuts: Django
+ django.template: Django
+ django.template.__init__: Django
+ django.template.autoreload: Django
+ django.template.backends: Django
+ django.template.backends.__init__: Django
+ django.template.backends.base: Django
+ django.template.backends.django: Django
+ django.template.backends.dummy: Django
+ django.template.backends.jinja2: Django
+ django.template.backends.utils: Django
+ django.template.base: Django
+ django.template.context: Django
+ django.template.context_processors: Django
+ django.template.defaultfilters: Django
+ django.template.defaulttags: Django
+ django.template.engine: Django
+ django.template.exceptions: Django
+ django.template.library: Django
+ django.template.loader: Django
+ django.template.loader_tags: Django
+ django.template.loaders: Django
+ django.template.loaders.__init__: Django
+ django.template.loaders.app_directories: Django
+ django.template.loaders.base: Django
+ django.template.loaders.cached: Django
+ django.template.loaders.filesystem: Django
+ django.template.loaders.locmem: Django
+ django.template.response: Django
+ django.template.smartif: Django
+ django.template.utils: Django
+ django.templatetags: Django
+ django.templatetags.__init__: Django
+ django.templatetags.cache: Django
+ django.templatetags.i18n: Django
+ django.templatetags.l10n: Django
+ django.templatetags.static: Django
+ django.templatetags.tz: Django
+ django.test: Django
+ django.test.__init__: Django
+ django.test.client: Django
+ django.test.html: Django
+ django.test.runner: Django
+ django.test.selenium: Django
+ django.test.signals: Django
+ django.test.testcases: Django
+ django.test.utils: Django
+ django.urls: Django
+ django.urls.__init__: Django
+ django.urls.base: Django
+ django.urls.conf: Django
+ django.urls.converters: Django
+ django.urls.exceptions: Django
+ django.urls.resolvers: Django
+ django.urls.utils: Django
+ django.utils: Django
+ django.utils.__init__: Django
+ django.utils._os: Django
+ django.utils.archive: Django
+ django.utils.asyncio: Django
+ django.utils.autoreload: Django
+ django.utils.baseconv: Django
+ django.utils.cache: Django
+ django.utils.connection: Django
+ django.utils.crypto: Django
+ django.utils.datastructures: Django
+ django.utils.dateformat: Django
+ django.utils.dateparse: Django
+ django.utils.dates: Django
+ django.utils.datetime_safe: Django
+ django.utils.deconstruct: Django
+ django.utils.decorators: Django
+ django.utils.deprecation: Django
+ django.utils.duration: Django
+ django.utils.encoding: Django
+ django.utils.feedgenerator: Django
+ django.utils.formats: Django
+ django.utils.functional: Django
+ django.utils.hashable: Django
+ django.utils.html: Django
+ django.utils.http: Django
+ django.utils.inspect: Django
+ django.utils.ipv6: Django
+ django.utils.itercompat: Django
+ django.utils.jslex: Django
+ django.utils.log: Django
+ django.utils.lorem_ipsum: Django
+ django.utils.module_loading: Django
+ django.utils.numberformat: Django
+ django.utils.regex_helper: Django
+ django.utils.safestring: Django
+ django.utils.termcolors: Django
+ django.utils.text: Django
+ django.utils.timesince: Django
+ django.utils.timezone: Django
+ django.utils.topological_sort: Django
+ django.utils.translation: Django
+ django.utils.translation.__init__: Django
+ django.utils.translation.reloader: Django
+ django.utils.translation.template: Django
+ django.utils.translation.trans_null: Django
+ django.utils.translation.trans_real: Django
+ django.utils.tree: Django
+ django.utils.version: Django
+ django.utils.xmlutils: Django
+ django.views: Django
+ django.views.__init__: Django
+ django.views.csrf: Django
+ django.views.debug: Django
+ django.views.decorators: Django
+ django.views.decorators.__init__: Django
+ django.views.decorators.cache: Django
+ django.views.decorators.clickjacking: Django
+ django.views.decorators.common: Django
+ django.views.decorators.csrf: Django
+ django.views.decorators.debug: Django
+ django.views.decorators.gzip: Django
+ django.views.decorators.http: Django
+ django.views.decorators.vary: Django
+ django.views.defaults: Django
+ django.views.generic: Django
+ django.views.generic.__init__: Django
+ django.views.generic.base: Django
+ django.views.generic.dates: Django
+ django.views.generic.detail: Django
+ django.views.generic.edit: Django
+ django.views.generic.list: Django
+ django.views.i18n: Django
+ django.views.static: Django
+ exceptiongroup: exceptiongroup
+ exceptiongroup.__init__: exceptiongroup
+ exceptiongroup._catch: exceptiongroup
+ exceptiongroup._exceptions: exceptiongroup
+ exceptiongroup._formatting: exceptiongroup
+ exceptiongroup._version: exceptiongroup
+ iniconfig: iniconfig
+ iniconfig.__init__: iniconfig
+ packaging: packaging
+ packaging.__about__: packaging
+ packaging.__init__: packaging
+ packaging._manylinux: packaging
+ packaging._musllinux: packaging
+ packaging._structures: packaging
+ packaging.markers: packaging
+ packaging.requirements: packaging
+ packaging.specifiers: packaging
+ packaging.tags: packaging
+ packaging.utils: packaging
+ packaging.version: packaging
+ pluggy: pluggy
+ pluggy.__init__: pluggy
+ pluggy._callers: pluggy
+ pluggy._hooks: pluggy
+ pluggy._manager: pluggy
+ pluggy._result: pluggy
+ pluggy._tracing: pluggy
+ pluggy._version: pluggy
+ py: pytest
+ pyparsing: pyparsing
+ pyparsing.__init__: pyparsing
+ pyparsing.actions: pyparsing
+ pyparsing.common: pyparsing
+ pyparsing.core: pyparsing
+ pyparsing.diagram: pyparsing
+ pyparsing.diagram.__init__: pyparsing
+ pyparsing.exceptions: pyparsing
+ pyparsing.helpers: pyparsing
+ pyparsing.results: pyparsing
+ pyparsing.testing: pyparsing
+ pyparsing.unicode: pyparsing
+ pyparsing.util: pyparsing
+ pytest: pytest
+ pytest.__init__: pytest
+ pytest.__main__: pytest
+ sqlparse: sqlparse
+ sqlparse.__init__: sqlparse
+ sqlparse.__main__: sqlparse
+ sqlparse.cli: sqlparse
+ sqlparse.compat: sqlparse
+ sqlparse.engine: sqlparse
+ sqlparse.engine.__init__: sqlparse
+ sqlparse.engine.filter_stack: sqlparse
+ sqlparse.engine.grouping: sqlparse
+ sqlparse.engine.statement_splitter: sqlparse
+ sqlparse.exceptions: sqlparse
+ sqlparse.filters: sqlparse
+ sqlparse.filters.__init__: sqlparse
+ sqlparse.filters.aligned_indent: sqlparse
+ sqlparse.filters.others: sqlparse
+ sqlparse.filters.output: sqlparse
+ sqlparse.filters.reindent: sqlparse
+ sqlparse.filters.right_margin: sqlparse
+ sqlparse.filters.tokens: sqlparse
+ sqlparse.formatter: sqlparse
+ sqlparse.keywords: sqlparse
+ sqlparse.lexer: sqlparse
+ sqlparse.sql: sqlparse
+ sqlparse.tokens: sqlparse
+ sqlparse.utils: sqlparse
+ tomli: tomli
+ tomli.__init__: tomli
+ tomli._parser: tomli
+ tomli._re: tomli
+ tomli._types: tomli
+ pip_repository:
+ name: pypi
+ incremental: true
+integrity: 18ace45bc5c693f3675cf6cef31a53dfdc36bc326d61822a673f31b0ebbe900e
diff --git a/py/BUILD.bazel b/py/BUILD.bazel
index a7110a7e..c4810430 100644
--- a/py/BUILD.bazel
+++ b/py/BUILD.bazel
@@ -21,6 +21,7 @@ bzl_library(
deps = [
"//py/private:py_binary",
"//py/private:py_library",
+ "//py/private:py_pytest_main",
"//py/private:py_wheel",
],
)
diff --git a/py/defs.bzl b/py/defs.bzl
index cda345cd..22cb275b 100644
--- a/py/defs.bzl
+++ b/py/defs.bzl
@@ -1,9 +1,10 @@
"Public API re-exports"
-load("//py/private/venv:venv.bzl", _py_venv = "py_venv")
load("//py/private:py_binary.bzl", _py_binary = "py_binary", _py_test = "py_test")
load("//py/private:py_library.bzl", _py_library = "py_library")
+load("//py/private:py_pytest_main.bzl", _py_pytest_main = "py_pytest_main")
load("//py/private:py_wheel.bzl", "py_wheel_lib")
+load("//py/private/venv:venv.bzl", _py_venv = "py_venv")
def py_library(name, imports = ["."], **kwargs):
"""Wrapper macro for the py_library rule, setting a default for imports
@@ -69,3 +70,5 @@ py_wheel = rule(
attrs = py_wheel_lib.attrs,
provides = py_wheel_lib.provides,
)
+
+py_pytest_main = _py_pytest_main
diff --git a/py/private/BUILD.bazel b/py/private/BUILD.bazel
index 5c466675..65679e67 100644
--- a/py/private/BUILD.bazel
+++ b/py/private/BUILD.bazel
@@ -3,6 +3,7 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
exports_files(
[
"entry.tmpl.sh",
+ "pytest.py.tmpl",
],
visibility = ["//visibility:public"],
)
@@ -47,6 +48,13 @@ bzl_library(
deps = [":providers"],
)
+bzl_library(
+ name = "py_pytest_main",
+ srcs = ["py_pytest_main.bzl"],
+ visibility = ["//py:__subpackages__"],
+ deps = ["@rules_python//python:defs"],
+)
+
bzl_library(
name = "providers",
srcs = ["providers.bzl"],
diff --git a/py/private/py_pytest_main.bzl b/py/private/py_pytest_main.bzl
new file mode 100644
index 00000000..0a536b74
--- /dev/null
+++ b/py/private/py_pytest_main.bzl
@@ -0,0 +1,80 @@
+# Copyright 2022 Aspect Build Systems, Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""py_test entrypoint generation.
+"""
+
+load("@rules_python//python:defs.bzl", default_py_library = "py_library")
+
+def _py_pytest_main_impl(ctx):
+ substitutions = {
+ "$$FLAGS$$": ", ".join(['"{}"'.format(f) for f in ctx.attr.args]).strip(),
+ "$$CHDIR$$": "os.chdir('{}')".format(ctx.attr.chdir) if ctx.attr.chdir else "",
+ }
+
+ ctx.actions.expand_template(
+ template = ctx.file.template,
+ output = ctx.outputs.out,
+ substitutions = dict(substitutions, **ctx.var),
+ is_executable = False,
+ )
+
+_py_pytest_main = rule(
+ implementation = _py_pytest_main_impl,
+ attrs = {
+ "args": attr.string_list(
+ doc = "Additional arguments to pass to pytest.",
+ ),
+ "chdir": attr.string(
+ doc = "A path to a directory to chdir when the test starts.",
+ mandatory = False,
+ ),
+ "out": attr.output(
+ doc = "The output file.",
+ mandatory = True,
+ ),
+ "template": attr.label(
+ allow_single_file = True,
+ default = Label("//py/private:pytest.py.tmpl"),
+ ),
+ },
+)
+
+def py_pytest_main(name, py_library = default_py_library, **kwargs):
+ """py_pytest_main wraps the template rendering target and the final py_library.
+
+ Args:
+ name: The name of the runable target that updates the test entry file.
+ py_library: Use this attribute to override the default py_library rule.
+ **kwargs: The extra arguments passed to the template rendering target.
+ """
+
+ test_main = name + ".py"
+ tags = kwargs.pop("tags", [])
+ visibility = kwargs.pop("visibility", [])
+
+ _py_pytest_main(
+ name = "%s_template" % name,
+ out = test_main,
+ tags = tags,
+ visibility = visibility,
+ **kwargs
+ )
+
+ py_library(
+ name = name,
+ srcs = [test_main],
+ tags = tags,
+ visibility = visibility,
+ )
diff --git a/py/private/pytest.py.tmpl b/py/private/pytest.py.tmpl
new file mode 100644
index 00000000..8b9b9cbf
--- /dev/null
+++ b/py/private/pytest.py.tmpl
@@ -0,0 +1,55 @@
+# Copyright 2022 Aspect Build Systems, Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import sys
+import os
+
+import pytest
+
+if __name__ == "__main__":
+ $$CHDIR$$
+
+ os.environ["ENV"] = "testing"
+
+ args = [
+ "--verbose",
+ "--ignore=external/",
+ # Avoid loading of the plugin "cacheprovider".
+ "-p",
+ "no:cacheprovider",
+ ]
+
+ junit_xml_out = os.environ.get("XML_OUTPUT_FILE")
+ if junit_xml_out is not None:
+ args.append(f"--junitxml={junit_xml_out}")
+
+ test_filter = os.environ.get("TESTBRIDGE_TEST_ONLY")
+ if test_filter is not None:
+ args.append(f"-k={test_filter}")
+
+ user_args = [$$FLAGS$$]
+ if len(user_args) > 0:
+ args.extend(user_args)
+
+ cli_args = sys.argv[1:]
+ if len(cli_args) > 0:
+ args.extend(cli_args)
+
+ exit_code = pytest.main(args)
+
+ if exit_code != 0:
+ print("Pytest exit code: " + str(exit_code), file=sys.stderr)
+ print("Ran pytest.main with " + str(args), file=sys.stderr)
+
+ sys.exit(exit_code)
diff --git a/py/repositories.bzl b/py/repositories.bzl
index 3d1ae6fb..ce587053 100644
--- a/py/repositories.bzl
+++ b/py/repositories.bzl
@@ -40,7 +40,24 @@ def rules_py_dependencies():
http_archive(
name = "rules_python",
- sha256 = "cdf6b84084aad8f10bf20b46b77cb48d83c319ebe6458a18e9d2cebf57807cdd",
- strip_prefix = "rules_python-0.8.1",
- url = "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.8.1.tar.gz",
+ patch_cmds = ["""\
+cat >> python/BUILD <