[MAIN]
load-plugins=
	pylint.extensions.no_self_use,
	pylint.extensions.comparison_placement,
	pylint.extensions.redefined_variable_type,

ignore=
	src/python/grpcio/grpc/beta,
	src/python/grpcio/grpc/framework,
	src/python/grpcio/grpc/framework/common,
	src/python/grpcio/grpc/framework/foundation,
	src/python/grpcio/grpc/framework/interfaces,

[VARIABLES]

# TODO(https://github.com/PyCQA/pylint/issues/1345): How does the inspection
# not include "unused_" and "ignored_" by default?
dummy-variables-rgx=^ignored_|^unused_

[DESIGN]

# NOTE(nathaniel): Not particularly attached to this value; it just seems to
# be what works for us at the moment (excepting the dead-code-walking Beta
# API).
max-args=6

[MISCELLANEOUS]

# NOTE(nathaniel): We are big fans of "TODO(<issue link>): " and
# "NOTE(<username or issue link>): ". We do not allow "TODO:",
# "TODO(<username>):", "FIXME:", or anything else.
notes=FIXME,XXX

[MESSAGES CONTROL]

disable=
	# -- START OF EXAMPLE-SPECIFIC SUPPRESSIONS --
	no-self-use,
	unused-argument,
	unused-variable,
	# -- END OF EXAMPLE-SPECIFIC SUPPRESSIONS --

	# TODO(https://github.com/PyCQA/pylint/issues/59#issuecomment-283774279):
	# Enable cyclic-import after a 1.7-or-later pylint release that
	# recognizes our disable=cyclic-import suppressions.
	cyclic-import,
	# TODO(https://github.com/grpc/grpc/issues/8622): Enable this after the
	# Beta API is removed.
	duplicate-code,
	# TODO(https://github.com/grpc/grpc/issues/261): Doesn't seem to
	# understand enum and concurrent.futures; look into this later with the
	# latest pylint version.
	import-error,
	# TODO(https://github.com/grpc/grpc/issues/261): Enable this one.
	# Should take a little configuration but not much.
	invalid-name,
	# TODO(https://github.com/grpc/grpc/issues/261): This doesn't seem to
	# work for now? Try with a later pylint?
	locally-disabled,
	# NOTE(nathaniel): We don't write doc strings for most private code
	# elements.
	missing-docstring,
	# NOTE(nathaniel): In numeric comparisons it is better to have the
	# lesser (or lesser-or-equal-to) quantity on the left when the
	# expression is true than it is to worry about which is an identifier
	# and which a literal value.
	misplaced-comparison-constant,
	# TODO(https://github.com/grpc/grpc/issues/261): Doesn't yet play
	# nicely with some of our code being implemented in Cython. Maybe in a
	# later version?
	no-name-in-module,
	# TODO(https://github.com/grpc/grpc/issues/261): Suppress these where
	# the odd shape of the authentication portion of the API forces them on
	# us and enable everywhere else.
	protected-access,
	# NOTE(nathaniel): Pylint and I will probably never agree on this.
	too-few-public-methods,
	# NOTE(nathaniel): Pylint and I will probably never agree on this for
	# private classes. For public classes maybe?
	too-many-instance-attributes,
	# NOTE(nathaniel): Some of our modules have a lot of lines... of
	# specification and documentation. Maybe if this were
	# lines-of-code-based we would use it.
	too-many-lines,
	# TODO(https://github.com/grpc/grpc/issues/261): Maybe we could have
	# this one if we extracted just a few more helper functions...
	too-many-nested-blocks,
	# TODO(https://github.com/grpc/grpc/issues/261): Disable unnecessary
	# super-init requirement for abstract class implementations for now.
	super-init-not-called,
	# NOTE(nathaniel): A single statement that always returns program
	# control is better than two statements the first of which sometimes
	# returns program control and the second of which always returns
	# program control. Probably generally, but definitely in the cases of
	# if:/else: and for:/else:.
	useless-else-on-loop,
	no-else-return,
	# NOTE(lidiz): Python 3 make object inheritance default, but not PY2
	useless-object-inheritance,
	# NOTE(lidiz): the import order will be enforced by isort instead
	wrong-import-order,
	# TODO(https://github.com/PyCQA/pylint/issues/3882): Upgrade Pylint
	unsubscriptable-object,
	# NOTE(rbellevi): Pylint doesn't understand .pyi files.
	no-member,

	# NOTE(sergiitk): From here: just to make it work with pylint==2.17.7
	#                 Pylint will be replaced with ruff anyway.
	# Not enforced by ruff:
	consider-using-f-string,
	invalid-overridden-method,  # not found in main
	# Expect to be caught (and fixed) by ruff.
	# https://github.com/astral-sh/ruff/issues/970
	# pylint                              | ruff          |
	# ----------------------------------- | ------------- |
	super-with-arguments,                 # UP008
	raise-missing-from,                   # B904
	unspecified-encoding,                 # PLW1514
	# Found in examples, but not in main:
	consider-using-with,                  # SIM115
	# Found in main, but not in examples:
	# f-string-without-interpolation,       # F541
	# format-string-without-interpolation,  # F541
	# no-else-raise,                        # RET506
	# no-else-continue,                     # RET507
	# unnecessary-lambda-assignment,        # E731
	# unnecessary-dunder-call,              # PLC2801
	# import-outside-toplevel,              # PLC0415
	# broad-exception-raised,               # TRY002
	# no-self-use,                          # PLR6301
	# inconsistent-return-statements,       # RET501, RET502
	# consider-using-dict-items,            # PLC0206
	# use-dict-literal,                     # C406
	# consider-iterating-dictionary,        # SIM118
