# Copyright 2021 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This file is copied Chromium OS platform2, as seen in the following link:
# https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/pylintrc
# Please keep in sync.

# NB: This is a fork of chromite/pylintrc with indent set to 4.
# Everything else is kept the same.

[MASTER]

# Add files or directories matching the regex patterns to the ignore list.
# The regex matches against base names, not paths.
ignore-patterns=
    .*_pb2\.py$,
    .*third_party\/.*.py$


# List of plugins (as comma separated values of python modules names) to load,
# usually to register additional checkers.
load-plugins=
    chromite.cli.cros.lint,
    pylint.extensions.bad_builtin,
    pylint.extensions.docstyle,
    pylint.extensions.redefined_variable_type,
    pylint.extensions.overlapping_exceptions,

# Configure quote preferences.
string-quote = single-avoid-escape
triple-quote = double
docstring-quote = double


[MESSAGES CONTROL]

# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple times.
# eq-without-hash: We omit this as we don't require all objects be hashable.
#   We'll wait for unittest coverage to detect missing __hash__ on objects.
# no-absolute-import: We don't seem to rely on this behavior, so don't enforce
#   using this future import everywhere.
# round-builtin: We omit this as all our usage of round() is OK with either
#   Python 2 or 3 behavior (and probably leans towards 3 anyways).
enable=
    apply-builtin,
    backtick,
    bad-python3-import,
    basestring-builtin,
    buffer-builtin,
    cmp-builtin,
    cmp-method,
    coerce-builtin,
    coerce-method,
    delslice-method,
    deprecated-itertools-function,
    deprecated-str-translate-call,
    deprecated-string-function,
    deprecated-types-field,
    dict-items-not-iterating,
    dict-iter-method,
    dict-keys-not-iterating,
    dict-values-not-iterating,
    dict-view-method,
    div-method,
    exception-message-attribute,
    execfile-builtin,
    file-builtin,
    filter-builtin-not-iterating,
    getslice-method,
    hex-method,
    idiv-method,
    import-star-module-level,
    indexing-exception,
    intern-builtin,
    invalid-str-codec,
    long-builtin,
    long-suffix,
    map-builtin-not-iterating,
    metaclass-assignment,
    next-method-called,
    next-method-defined,
    nonzero-method,
    oct-method,
    old-ne-operator,
    old-octal-literal,
    old-raise-syntax,
    parameter-unpacking,
    print-statement,
    raising-string,
    range-builtin-not-iterating,
    raw_input-builtin,
    rdiv-method,
    reduce-builtin,
    reload-builtin,
    setslice-method,
    standarderror-builtin,
    sys-max-int,
    unichr-builtin,
    unicode-builtin,
    unpacking-in-except,
    using-cmp-argument,
    xrange-builtin,
    zip-builtin-not-iterating,


# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifiers separated by comma (,) or put this
# option multiple times (only on the command line, not in the configuration
# file where it should appear only once). You can also use "--disable=all" to
# disable everything first and then reenable specific checks. For example, if
# you want to run only the similarities checker, you can use "--disable=all
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use "--disable=all --enable=classes
# --disable=W".
# We leave many of the style warnings to judgement/peer review.
# TODO: We need to re-enable broad-except, but requires cleaning up our code.
# TODO: Re-enable redefined-variable-type.
# TODO: Re-enable inconsistent-return-statements.
# TODO: Re-enable keyword-arg-before-vararg once we're on Python 3-only.
# TODO: Re-enable useless-object-inheritance once we're on Python 3-only and
#       we update the style guide.
# TODO: Re-enable import-outside-toplevel.
# TODO: Re-enable unnecessary-comprehension.
# TODO: Re-enable consider-using-dict-comprehension.
# TODO: Re-enable consider-using-set-comprehension.
# TODO: Re-enable consider-using-in.
# TODO: Re-enable try-except-raise.
# TODO: Re-enable chained-comparison.
disable=
    broad-except,
    chained-comparison,
    consider-iterating-dictionary,
    consider-using-dict-comprehension,
    consider-using-in,
    consider-using-set-comprehension,
    fixme,
    file-ignored,
    keyword-arg-before-vararg,
    import-outside-toplevel,
    inconsistent-return-statements,
    invalid-name,
    locally-disabled,
    locally-enabled,
    missing-docstring,
    no-member,
    no-else-break,
    no-else-continue,
    no-else-raise,
    no-else-return,
    no-self-use,
    raise-missing-from,
    redefined-variable-type,
    relative-import,
    super-with-arguments,
    too-few-public-methods,
    too-many-arguments,
    too-many-boolean-expressions,
    too-many-branches,
    too-many-instance-attributes,
    too-many-lines,
    too-many-locals,
    too-many-nested-blocks,
    too-many-public-methods,
    too-many-return-statements,
    too-many-statements,
    try-except-raise,
    unnecessary-comprehension,
    useless-object-inheritance,


[REPORTS]

# Tells whether to display a full report or only the messages
# CHANGE: No report.
reports=no

# Activate the evaluation score.
score=no


[FORMAT]

# Maximum number of characters on a single line.
max-line-length=80

# Disable line length enforcement for import statements or comment lines
# containing URLs.
ignore-long-lines=(^(import|from))|(^\s*(# )?<?https?://\S+>?$)

# Maximum number of lines in a module
#max-module-lines=1000

# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
# tab).
indent-string='    '


[TYPECHECK]

# List of classes names for which member attributes should not be checked
# (useful for classes with attributes dynamically set).
ignored-classes=hashlib,numpy

# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E0201 when accessed.
# CHANGE: Added tempdir for @osutils.TempDirDecorator.
generated-members=REQUEST,acl_users,aq_parent,tempdir

# List of modules for which member attributes should not be checked.
# Modules listed here will not trigger import errors even if the linter can't
# import them.
#
# pytest: Made available by our testing virtualenv and can be assumed exists.
ignored-modules=pytest

[BASIC]

# List of builtins function names that should not be used, separated by a comma.
# exit & quit are for the interactive interpreter shell only.
# https://docs.python.org/3/library/constants.html#constants-added-by-the-site-module
bad-functions=
    apply,
    exit,
    filter,
    map,
    quit,
    reduce,

# Regular expression which should only match correct function names
#
# CHANGE: The ChromiumOS standard is different than PEP-8, so we need to
# redefine this.
#
# Common exceptions to ChromiumOS standard:
# - main: Standard for main function
function-rgx=([A-Z_][a-zA-Z0-9]{2,30}|main)$

# Regular expression which should only match correct method names
#
# CHANGE: The ChromiumOS standard is different than PEP-8, so we need to
# redefine this. Here's what we allow:
# - CamelCaps, starting with a capital letter.  No underscores in function
#   names.  Can also have a "_" prefix (private method) or a "test" prefix
#   (unit test).
# - Methods that look like __xyz__, which are used to do things like
#   __init__, __del__, etc.
# - setUp, tearDown: For unit tests.
method-rgx=((_|test)?[A-Z][a-zA-Z0-9]{2,30}|__[a-z]+__|setUp|tearDown)$


[SIMILARITIES]

# Minimum lines number of a similarity.
min-similarity-lines=20


[VARIABLES]

# A regular expression matching the beginning of the name of dummy variables
# (i.e. not used).
dummy-variables-rgx=_|unused_


[DESIGN]

# Maximum number of parents for a class (see R0901).
max-parents=10


[IMPORTS]

# Deprecated modules which should not be used, separated by a comma.
# __builtin__: Use the 'six.moves.builtins' module instead
#   (or 'builtins' in Python 3).
# apiclient: Use the 'googleapiclient' module instead.
# Bastion: Dropped in Python 3.
# ConfigParser: Use the 'six.moves.configparser' module instead
#   (or 'configparser' in Python 3).
# cookielib: Use the 'six.moves.http_cookiejar' module instead
#   (or 'http.cookiejar' in Python 3).
# cPickle: Use the 'pickle' module instead.
# cStringIO: Use 'io.StringIO' or 'io.BytesIO' instead.
# exceptions: Dropped in Python 3.
# HTMLParser: Use the 'six.moves.html_parser' module instead
#   (or 'html.parser' in Python 3).
# httplib: Use the 'six.moves.http_client' module instead
#   (or 'http.client' in Python 3).
# md5: Use the 'hashlib' module instead.
# mox: Use the 'mock' module instead.
# optparse: Use the 'argparse' module instead.
# Queue: Use the 'six.moves.queue' module instead (or 'queue' in Python 3).
# regsub: Use the 're' module instead.
# rexec: Dropped in Python 3.
# StringIO: Use 'io.StringIO' or 'io.BytesIO' instead.
# TERMIOS: Use the 'termios' module instead.
# urllib2: Use the 'six.moves.urllib' module instead
#   (or 'urllib.request' in Python 3).
# urlparse: Use the 'six.moves.urllib' module instead
#   (or 'urllib.parse' in Python 3).
deprecated-modules=
    __builtin__,
    apiclient,
    Bastion,
    ConfigParser,
    cookielib,
    cPickle,
    cStringIO,
    exceptions,
    HTMLParser,
    httplib,
    md5,
    mock,
    mox,
    optparse,
    Queue,
    regsub,
    rexec,
    StringIO,
    TERMIOS,
    urllib2,
    urlparse,

# Force import order to recognize a module as part of the standard
# compatibility libraries.
known-standard-library=

# Force import order to recognize a module as part of a third party library.
known-third-party=
    _emerge,
    apiclient,
    elftools,
    gcloud,
    google,
    googleapiclient,
    httplib2,
    jinja2,
    jsonschema,
    lddtree,
    magic,
    mock,
    oauth2client,
    portage,
    pylint,
    pytest,
    requests,
    six,
    sqlalchemy,
    yaml,


[LOGGING]

# Apply logging string format checks to calls on these modules.
logging-modules=
    logging,
