From 23bfc460442b13f21fbb17bd6642abc87605622c Mon Sep 17 00:00:00 2001 From: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> Date: Mon, 7 Nov 2022 12:27:47 -0800 Subject: [PATCH 1/8] feat: add gazelle python extension Signed-off-by: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> --- BUILD.bazel | 30 +- WORKSPACE | 6 +- gazelle_python.yaml | 1122 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1153 insertions(+), 5 deletions(-) create mode 100644 gazelle_python.yaml 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/gazelle_python.yaml b/gazelle_python.yaml new file mode 100644 index 00000000..8868e57a --- /dev/null +++ b/gazelle_python.yaml @@ -0,0 +1,1122 @@ +# GENERATED FILE - DO NOT EDIT! +# +# To update this file, run: +# bazel run //:gazelle_python_manifest.update + +manifest: + modules_mapping: + 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 + 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.__init__: 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.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.__init__: 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.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.__init__: Django + django.contrib.contenttypes.migrations.0001_initial: Django + django.contrib.contenttypes.migrations.0002_remove_content_type_name: 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.__init__: Django + django.contrib.flatpages.migrations.0001_initial: 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.__init__: Django + django.contrib.redirects.migrations.0001_initial: Django + django.contrib.redirects.migrations.0002_alter_redirect_new_path_help_text: 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.__init__: Django + django.contrib.sessions.migrations.0001_initial: 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.__init__: Django + django.contrib.sites.migrations.0001_initial: Django + django.contrib.sites.migrations.0002_alter_domain_unique: 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 + 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 + pip_repository: + name: pypi + incremental: true +integrity: 72c2f742a4478efa5dd8dad0b91be834b72d957b821431d83046b34d4c883519 From 6e555b522b14ec65f3b8d5850ac100f5b27c6325 Mon Sep 17 00:00:00 2001 From: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> Date: Mon, 7 Nov 2022 13:58:41 -0800 Subject: [PATCH 2/8] feat: add py_pytest_main Signed-off-by: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> --- py/defs.bzl | 5 ++- py/private/BUILD.bazel | 1 + py/private/py_pytest_main.bzl | 80 +++++++++++++++++++++++++++++++++++ py/private/pytest.py.tmpl | 55 ++++++++++++++++++++++++ 4 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 py/private/py_pytest_main.bzl create mode 100644 py/private/pytest.py.tmpl 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..d846610a 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"], ) 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) From e90d0fc6cb48f72aa1de0fe4eee0c9f83ddab073 Mon Sep 17 00:00:00 2001 From: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> Date: Mon, 7 Nov 2022 20:49:40 -0800 Subject: [PATCH 3/8] feat: add py_pytest_main example Signed-off-by: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> --- examples/pytest/BUILD.bazel | 18 +++++ examples/pytest/foo_test.py | 5 ++ gazelle_python.yaml | 148 +++++++++++++++++++++++++++++++++++- requirements.in | 3 +- requirements.txt | 32 ++++++++ 5 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 examples/pytest/BUILD.bazel create mode 100644 examples/pytest/foo_test.py 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/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 index 8868e57a..39a3978d 100644 --- a/gazelle_python.yaml +++ b/gazelle_python.yaml @@ -5,6 +5,81 @@ 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 @@ -16,6 +91,27 @@ manifest: 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 @@ -1091,6 +1187,51 @@ manifest: 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 @@ -1116,7 +1257,12 @@ manifest: 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: 72c2f742a4478efa5dd8dad0b91be834b72d957b821431d83046b34d4c883519 +integrity: 51217bb7f6d0438a7e54c2526127bd972656bf8580e0dfc0af685561fccd4f46 diff --git a/requirements.in b/requirements.in index c6444f1d..de36d5fb 100644 --- a/requirements.in +++ b/requirements.in @@ -1,3 +1,4 @@ django~=4.0.0 colorama~=0.4.0 -click \ No newline at end of file +click +pytest diff --git a/requirements.txt b/requirements.txt index 77eb126b..2b1bf3b8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,10 @@ asgiref==3.5.2 \ --hash=sha256:1d2880b792ae8757289136f1db2b7b99100ce959b2aa57fd69dab783d05afac4 \ --hash=sha256:4a29362a6acebe09bf1d6640db38c1dc3d9217c68e6f9f6204d72667fc19a424 # via django +attrs==22.1.0 \ + --hash=sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6 \ + --hash=sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c + # via pytest click==8.1.3 \ --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 @@ -20,7 +24,35 @@ django==4.0.8 \ --hash=sha256:07e6433f263c3839939cfabeb6d7557841e0419e47759a7b7d37f6d44d40adcb \ --hash=sha256:27cb08fa6458c1eff8b97c4c2d03774646fb26feeaa4587dca10c49e6d4fc6a3 # via -r requirements.in +exceptiongroup==1.0.1 \ + --hash=sha256:4d6c0aa6dd825810941c792f53d7b8d71da26f5e5f84f20f9508e8f2d33b140a \ + --hash=sha256:73866f7f842ede6cb1daa42c4af078e2035e5f7607f0e2c762cc51bb31bbe7b2 + # via pytest +iniconfig==1.1.1 \ + --hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \ + --hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32 + # via pytest +packaging==21.3 \ + --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ + --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 + # via pytest +pluggy==1.0.0 \ + --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ + --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3 + # via pytest +pyparsing==3.0.9 \ + --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ + --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc + # via packaging +pytest==7.2.0 \ + --hash=sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71 \ + --hash=sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59 + # via -r requirements.in sqlparse==0.4.2 \ --hash=sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae \ --hash=sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d # via django +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f + # via pytest From b0b0508565323d0db96776b251e357c523acf48a Mon Sep 17 00:00:00 2001 From: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> Date: Mon, 7 Nov 2022 13:59:38 -0800 Subject: [PATCH 4/8] fix: update docs Signed-off-by: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> --- docs/rules.md | 20 ++++++++++++++++++++ py/BUILD.bazel | 1 + py/private/BUILD.bazel | 7 +++++++ py/repositories.bzl | 23 ++++++++++++++++++++--- 4 files changed, 48 insertions(+), 3 deletions(-) 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/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/private/BUILD.bazel b/py/private/BUILD.bazel index d846610a..65679e67 100644 --- a/py/private/BUILD.bazel +++ b/py/private/BUILD.bazel @@ -48,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/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 < Date: Mon, 7 Nov 2022 20:51:01 -0800 Subject: [PATCH 5/8] fix: update requirements after rebase Signed-off-by: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> --- gazelle_python.yaml | 16 ++++++++-------- requirements.txt | 10 +++++----- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/gazelle_python.yaml b/gazelle_python.yaml index 39a3978d..1bbf0c26 100644 --- a/gazelle_python.yaml +++ b/gazelle_python.yaml @@ -396,10 +396,10 @@ manifest: django.contrib.admin.forms: Django django.contrib.admin.helpers: Django django.contrib.admin.migrations: Django - django.contrib.admin.migrations.__init__: 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 @@ -447,7 +447,6 @@ manifest: django.contrib.auth.management.commands.createsuperuser: Django django.contrib.auth.middleware: Django django.contrib.auth.migrations: Django - django.contrib.auth.migrations.__init__: 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 @@ -460,6 +459,7 @@ manifest: 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 @@ -481,9 +481,9 @@ manifest: 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.__init__: 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 @@ -493,8 +493,8 @@ manifest: django.contrib.flatpages.forms: Django django.contrib.flatpages.middleware: Django django.contrib.flatpages.migrations: Django - django.contrib.flatpages.migrations.__init__: 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 @@ -713,9 +713,9 @@ manifest: django.contrib.redirects.apps: Django django.contrib.redirects.middleware: Django django.contrib.redirects.migrations: Django - django.contrib.redirects.migrations.__init__: 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 @@ -737,8 +737,8 @@ manifest: django.contrib.sessions.management.commands.clearsessions: Django django.contrib.sessions.middleware: Django django.contrib.sessions.migrations: Django - django.contrib.sessions.migrations.__init__: 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 @@ -759,9 +759,9 @@ manifest: django.contrib.sites.managers: Django django.contrib.sites.middleware: Django django.contrib.sites.migrations: Django - django.contrib.sites.migrations.__init__: 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 @@ -1265,4 +1265,4 @@ manifest: pip_repository: name: pypi incremental: true -integrity: 51217bb7f6d0438a7e54c2526127bd972656bf8580e0dfc0af685561fccd4f46 +integrity: 18ace45bc5c693f3675cf6cef31a53dfdc36bc326d61822a673f31b0ebbe900e diff --git a/requirements.txt b/requirements.txt index 2b1bf3b8..69d4fba0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile +# This file is autogenerated by pip-compile with python 3.9 # To update, run: # # bazel run //:requirements.update @@ -15,15 +15,15 @@ attrs==22.1.0 \ click==8.1.3 \ --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 - # via -r requirements.in + # via -r ./requirements.in colorama==0.4.5 \ --hash=sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da \ --hash=sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4 - # via -r requirements.in + # via -r ./requirements.in django==4.0.8 \ --hash=sha256:07e6433f263c3839939cfabeb6d7557841e0419e47759a7b7d37f6d44d40adcb \ --hash=sha256:27cb08fa6458c1eff8b97c4c2d03774646fb26feeaa4587dca10c49e6d4fc6a3 - # via -r requirements.in + # via -r ./requirements.in exceptiongroup==1.0.1 \ --hash=sha256:4d6c0aa6dd825810941c792f53d7b8d71da26f5e5f84f20f9508e8f2d33b140a \ --hash=sha256:73866f7f842ede6cb1daa42c4af078e2035e5f7607f0e2c762cc51bb31bbe7b2 @@ -47,7 +47,7 @@ pyparsing==3.0.9 \ pytest==7.2.0 \ --hash=sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71 \ --hash=sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59 - # via -r requirements.in + # via -r ./requirements.in sqlparse==0.4.2 \ --hash=sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae \ --hash=sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d From 014a61a54d814047b96c711d3afc8d53041f8628 Mon Sep 17 00:00:00 2001 From: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> Date: Mon, 7 Nov 2022 20:54:48 -0800 Subject: [PATCH 6/8] fix: update fixture Signed-off-by: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> --- py/tests/external-deps/expected_pathing | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/py/tests/external-deps/expected_pathing b/py/tests/external-deps/expected_pathing index 249f9640..501cb6f4 100644 --- a/py/tests/external-deps/expected_pathing +++ b/py/tests/external-deps/expected_pathing @@ -1,7 +1,7 @@ Python: (pwd)/bazel-out/host/bin/py/tests/external-deps/pathing.runfiles/pathing.venv/bin/python -version: 3.9.10 (main, REDACTED) -[Clang 13.0.1 ] -version info: sys.version_info(major=3, minor=9, micro=10, releaselevel='final', serial=0) +version: 3.9.13 (main, REDACTED) +[Clang 14.0.3 ] +version info: sys.version_info(major=3, minor=9, micro=13, releaselevel='final', serial=0) cwd: (pwd) site-packages folder: ['(pwd)/bazel-out/host/bin/py/tests/external-deps/pathing.runfiles/pathing.venv/lib/python3.9/site-packages'] From 059b9beb45696765468b7854892a6963074ec167 Mon Sep 17 00:00:00 2001 From: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> Date: Tue, 8 Nov 2022 08:43:46 -0800 Subject: [PATCH 7/8] fix: container test Signed-off-by: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> --- py/tests/containers/py_image_test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py/tests/containers/py_image_test.yaml b/py/tests/containers/py_image_test.yaml index 2efeda58..f9d91472 100644 --- a/py/tests/containers/py_image_test.yaml +++ b/py/tests/containers/py_image_test.yaml @@ -4,7 +4,7 @@ fileExistenceTests: - name: __main__ is present path: /app/py/tests/containers/py_image.binary.runfiles/aspect_rules_py/py/tests/containers/__main__.py - name: runfiles dependencies are present - path: /app/py/tests/containers/py_image.binary.runfiles/pypi_colorama/colorama/__init__.py + path: /app/py/tests/containers/py_image.binary.runfiles/pypi_colorama/__init__.py commandTests: - name: can run binary exitCode: 0 From 23faa02d45f22125857208b73afb161ce6311ffe Mon Sep 17 00:00:00 2001 From: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> Date: Tue, 8 Nov 2022 08:51:36 -0800 Subject: [PATCH 8/8] doc: add readme to pytest example Signed-off-by: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> --- examples/pytest/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 examples/pytest/README.md 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.