content: # build requirements
  [build-system]
  requires = ["setuptools < 78.0.2"]
  build-backend = "setuptools.build_meta"
  
  # iSort
  [tool.isort]
  multi_line_output = 0
  line_length = 120
  skip = [ "env", "wandb", "runs", "build", "node_modules" ]
  known_third_party = ["wandb"]
  include_trailing_comma = true
  split_on_trailing_comma = true
  
  [tool.ruff.lint]
  select = [
      "C4",
      # TODO port pydocstyle
      # "D", # pydocstyle
      "LOG",
      "PERF",
      "PLE",
      "COM812",
      "UP006",
      "F401",
  ]
  extend-safe-fixes = [
      "UP006",
  ]
  ignore = [
      "C408",
      "PERF2",
      "PERF4",
  ]
  
  [tool.ruff]
  target-version = "py39"
  exclude = [
      "build/**",
      "docs/**",
      "node_modules/**",
  ]
  
  # Pyright
  [tool.pyright]
  include = [
      "composer/**",
      "tests/**",
      "examples/**",
  ]
  exclude = [
      "build/**",
      "node_modules/**",
      'composer/trainer/mosaic_fsdp_utils.py'
  ]
  # Disable checks for missing imports, as a conditional install of composer will not include them
  # Any incorrect imports will be discovered through test cases
  reportMissingImports="none"
  # Sometimes for code validation or readability we want redundant isinstance checks.
  reportUnnecessaryIsInstance = "none"
  reportMissingTypeStubs = "none"
  # forward() and initailize_object() have incompatible method overrides
  reportIncompatibleMethodOverride = "none"
  reportIncompatibleVariableOverride = "error"
  reportUnusedImport = "error"
  reportUnusedClass = "error"
  reportUnusedFunction = "error"
  reportUnusedVariable = "error"
  reportDuplicateImport = "error"
  reportWildcardImportFromLibrary = "error"
  reportUntypedFunctionDecorator = "error"
  # Pyright sometimes marks public imports as private
  reportPrivateImportUsage = "none"
  reportUndefinedVariable = "error"
  strictParameterNoneValue = true
  reportPropertyTypeMismatch = "error"
  reportUntypedNamedTuple = "error"
  reportUnnecessaryCast = "error"
  reportInvalidTypeVarUse = "error"
  reportOverlappingOverload = "error"
  reportUninitializedInstanceVariable = "error"
  reportInvalidStringEscapeSequence = "error"
  reportMissingParameterType = "none"  # TODO: make this an error. Many tests are missing parameter types.
  reportCallInDefaultInitializer = "error"
  reportUnnecessaryComparison = "error"
  reportSelfClsParameterName = "error"
  # Need to ensure all implict string concatinations are wrapped with an extra set of paranethesis.
  reportImplicitStringConcatenation = "none"  # TODO: make this an error.
  reportInvalidStubStatement = "error"
  reportIncompleteStub = "error"
  reportUnsupportedDunderAll = "error"
  reportUnusedCoroutine = "error"
  
  # Pytest
  [tool.pytest.ini_options]
  # By default, do not run gpu, vision, docs, notebook, or daily tests
  addopts = "--codeblocks --strict-markers -m 'not gpu and not doctest and not daily and not remote' --color=yes"
  
  markers = [
      # Tests that require a world_size of two should be annotated with `@pytest.mark.world_size(2)`.
      # If not specified, the test will be assumed to have a world-size of one, which is
      # equivalent to `@pytest.mark.world_size(1)`
      "world_size(val)",
      # Tests that require a gpu should be annotated with `@pytest.mark.gpu`
      "gpu",
      # Tests which are run as part of the documentation build
      "doctest",
      # Should be run during daily regression
      "daily",
      # Whether the test will be reading data from a remote source, and may require credentials
      "remote",
  ]
  filterwarnings = [
      "error",  # Mark all warnings as errors
  
      # Treat the warnings that python usually would ignore as warnings, not errors.
      "default::DeprecationWarning",
      'default::PendingDeprecationWarning',
      'default::ImportWarning',
      'ignore::ResourceWarning',  # Ignore these -- they are from errors like CPU OOMs
  
      # Ignore the following warnings
      'ignore:Deterministic mode is activated:UserWarning',  # All tests run with deterministic mode
      'ignore:SubsetNumBatchesWarning',  # SubsetNumBatches is used extensively in testing
      # ignore lambda warnings
      'ignore:Running code eval locally may be insecure.*:UserWarning', # All tests run w/o lambdas at the moment
      # allow training metrics
      'ignore:Computing model evaluation metrics during training doubles the number of forward passes:UserWarning',
      'ignore:No optimizer was specified.:UserWarning',  # OK to not specify an optimizer in the tests
      # Ignore a bug in the pytorch dataloader
      '''ignore:Exception ignored in. <function _MultiProcessingDataLoaderIter.__del__:pytest.PytestUnraisableExceptionWarning''',
      # Ignore torchvision complaining about no c libraries (happens in the conda build)
      'ignore:Failed to load image Python extension:UserWarning',
      # Ignore a deprecation warning in the conda build
      'ignore:distutils Version classes are deprecated:DeprecationWarning',
      # Ignore a UserWarning from TorchMetrics about potentially large memory usage when batch sizes are extremely large
      'ignore:Metric `SpearmanCorrcoef` will save all targets and predictions in the buffer:UserWarning:torchmetrics',
      # Ignore a private function warnings for torch distributed collectives
      'ignore:torch.distributed._all_gather_base is a private function and will be deprecated.*:UserWarning',
      'ignore:torch.distributed._reduce_scatter_base is a private function and will be deprecated.*:UserWarning',
      # Ignore tensorboard deprecation warnings
      'ignore:Call to deprecated create function Descriptor().*:DeprecationWarning:tensorboard',
      'ignore:Call to deprecated create function EnumDescriptor().*:DeprecationWarning:tensorboard',
      'ignore:Call to deprecated create function EnumValueDescriptor().*:DeprecationWarning:tensorboard',
      'ignore:Call to deprecated create function FieldDescriptor().*:DeprecationWarning:tensorboard',
      'ignore:Call to deprecated create function FileDescriptor().*:DeprecationWarning:tensorboard',
      # Ignore TracerWarnings for operations potentially unsupported by model tracing
      'ignore:.*might cause the trace to be incorrect.*:Warning',
      'ignore:save_weights_only=True only saves weights for now, but will changed to also save metadata.*:UserWarning',
      # Ignore has_cuda is deprecated warning please use torch.backends.cuda.is_build
      '''ignore:'has_cuda' is deprecated, please use 'torch.backends.cuda.is_built():UserWarning''',
      # Ignore has_cudnn is deprecated warning please use torch.backends.cudnn.is_available
      '''ignore:'has_cudnn' is deprecated, please use 'torch.backends.cudnn.is_available():UserWarning''',
      # Ignore has_mps is deprecated warning please use torch.backends.mps.is_built
      '''ignore:'has_mps' is deprecated, please use 'torch.backends.mps.is_built():UserWarning''',
      # Ignore has_mkldnn is deprecated warning please use torch.backends.mkldnn.is_available
      '''ignore:'has_mkldnn' is deprecated, please use 'torch.backends.mkldnn.is_available():UserWarning''',
      # Ignore torch distributed deprecated warnings
      '''ignore:torch.distributed.reduce_op is deprecated, please use torch.distributed.ReduceOp instead:UserWarning''',
      # Ignore torch sharded tensor deprecated warnings
      '''ignore:Please use DTensor instead and we are deprecating ShardedTensor.:UserWarning''',
      # Ignore torch pytree deprecated warnings
      '''ignore:torch.utils._pytree._register_pytree_node is deprecated.*:UserWarning''',
      # Ignore save_state_dict / load_state_dict deprecation warnings
      '''ignore:'.*_state_dict' is deprecated and will be removed in future versions.*:UserWarning''',
      # Ignore mlflow warnings about transformers versions,
      '''ignore:The 'transformers' MLflow Models integration.*:UserWarning''',
      # Ignore the flash v3 warnings from transformer engine
      '''ignore:To use flash-attn v3*:UserWarning''',
      # Ignore our own deprecation warnings
      '''ignore::composer.utils.warnings.VersionedDeprecationWarning''',
      # Ignore deprecation warning for torch.load
      '''ignore:You are using `torch.load` with `weights_only=False`.*:FutureWarning''',
      # PyTorch uses their own deprecated function
      '''ignore:.*FSDP.state_dict_type.*:FutureWarning''',
      # Ignore PyTorch NO_SHARD deprecation
      '''ignore:.*The `NO_SHARD` sharding strategy is deprecated.*:FutureWarning''',
      # Some unit tests use ShardedTensor, though by default we use DTensor
      '''ignore:.*Please use DTensor instead and we are deprecating.*:FutureWarning''',
      # Ignore Torch load_state_dict warnings, it's used by torch internal, not composer
      '''ignore:.*`load_state_dict` is deprecated and *:FutureWarning''',
      # Ignore NeptuneLogger warnings
      '''ignore:.*NVML Shared Library Not Found. GPU usage metrics may not be reported.*''',
      # Ignore HuggingFace future warnings
      '''ignore:.*`clean_up_tokenization_spaces` was not set.*:FutureWarning''',
      # Ignore _get_pg_default_device deprecation warning, it's used by torch internal, not composer
      '''ignore:.*`_get_pg_default_device` will be deprecated.*:UserWarning''',
      # Ignore ROCMMonitor warnings
      '''ignore:.*ROCMMonitor.__del__:pytest.PytestUnraisableExceptionWarning''',
      # Ignore FSDP2Config deprecation warning
      '''ignore:.*FSDP2 Config/APIs are experimental*:UserWarning''',
  ]
  
  # Coverage
  [tool.coverage.run]
  parallel = true
  branch = true
  relative_files = true
  concurrency = ["thread"]
  include = [
      "composer/*"
  ]
  
  # Yapf
  [tool.yapf]
  # Align closing bracket with visual indentation.
  align_closing_bracket_with_visual_indent = false
  
  # Allow dictionary keys to exist on multiple lines. For example:
  #
  #   x = {
  #       ('this is the first element of a tuple',
  #        'this is the second element of a tuple'):
  #            value,
  #   }
  allow_multiline_dictionary_keys = false
  
  # Allow lambdas to be formatted on more than one line.
  allow_multiline_lambdas = false
  
  # Allow splitting before a default / named assignment in an argument list.
  allow_split_before_default_or_named_assigns = true
  
  # Allow splits before the dictionary value.
  allow_split_before_dict_value = true
  
  #   Let spacing indicate operator precedence. For example:
  #
  #     a = 1 * 2 + 3 / 4
  #     b = 1 / 2 - 3 * 4
  #     c = (1 + 2) * (3 - 4)
  #     d = (1 - 2) / (3 + 4)
  #     e = 1 * 2 - 3
  #     f = 1 + 2 + 3 + 4
  #
  # will be formatted as follows to indicate precedence:
  #
  #     a = 1*2 + 3/4
  #     b = 1/2 - 3*4
  #     c = (1+2) * (3-4)
  #     d = (1-2) / (3+4)
  #     e = 1*2 - 3
  #     f = 1 + 2 + 3 + 4
  #
  arithmetic_precedence_indication = false
  
  # Number of blank lines surrounding top-level function and class
  # definitions.
  blank_lines_around_top_level_definition = 2
  
  # Insert a blank line before a class-level docstring.
  blank_line_before_class_docstring = false
  
  # Insert a blank line before a module docstring.
  blank_line_before_module_docstring = true
  
  # Insert a blank line before a 'def' or 'class' immediately nested
  # within another 'def' or 'class'. For example:
  #
  #   class Foo:
  #                      # <------ this blank line
  #     def method():
  #       ...
  blank_line_before_nested_class_or_def = true
  
  # Do not split consecutive brackets. Only relevant when
  # dedent_closing_brackets is set. For example:
  #
  #    call_func_that_takes_a_dict(
  #        {
  #            'key1': 'value1',
  #            'key2': 'value2',
  #        }
  #    )
  #
  # would reformat to:
  #
  #    call_func_that_takes_a_dict({
  #        'key1': 'value1',
  #        'key2': 'value2',
  #    })
  coalesce_brackets = true
  
  # The column limit.
  column_limit = 120
  
  # The style for continuation alignment. Possible values are:
  #
  # - SPACE: Use spaces for continuation alignment. This is default behavior.
  # - FIXED: Use fixed number (CONTINUATION_INDENT_WIDTH) of columns
  #   (ie: CONTINUATION_INDENT_WIDTH/INDENT_WIDTH tabs or
  #   CONTINUATION_INDENT_WIDTH spaces) for continuation alignment.
  # - VALIGN-RIGHT: Vertically align continuation lines to multiple of
  #   INDENT_WIDTH columns. Slightly right (one tab or a few spaces) if
  #   cannot vertically align continuation lines with indent characters.
  continuation_align_style = 'SPACE'
  
  # Indent width used for line continuations.
  continuation_indent_width = 4
  
  # Put closing brackets on a separate line, dedented, if the bracketed
  # expression can't fit in a single line. Applies to all kinds of brackets,
  # including function definitions and calls. For example:
  #
  #   config = {
  #       'key1': 'value1',
  #       'key2': 'value2',
  #   }        # <--- this bracket is dedented and on a separate line
  #
  #   time_series = self.remote_client.query_entity_counters(
  #       entity='dev3246.region1',
  #       key='dns.query_latency_tcp',
  #       transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
  #       start_ts=now()-timedelta(days=3),
  #       end_ts=now(),
  #   )        # <--- this bracket is dedented and on a separate line
  dedent_closing_brackets = true
  
  # Disable the heuristic which places each list element on a separate line
  # if the list is comma-terminated.
  disable_ending_comma_heuristic = false
  
  # Place each dictionary entry onto its own line.
  each_dict_entry_on_separate_line = true
  
  # Require multiline dictionary even if it would normally fit on one line.
  # For example:
  #
  #   config = {
  #       'key1': 'value1'
  #   }
  force_multiline_dict = false
  
  # The regex for an i18n comment. The presence of this comment stops
  # reformatting of that line, because the comments are required to be
  # next to the string they translate.
  i18n_comment = '#\..*'
  
  # The i18n function call names. The presence of this function stops
  # reformatting on that line, because the string it has cannot be moved
  # away from the i18n comment.
  i18n_function_call = 'N_, _'
  
  # Indent blank lines.
  indent_blank_lines = false
  
  # Put closing brackets on a separate line, indented, if the bracketed
  # expression can't fit in a single line. Applies to all kinds of brackets,
  # including function definitions and calls. For example:
  #
  #   config = {
  #       'key1': 'value1',
  #       'key2': 'value2',
  #       }        # <--- this bracket is indented and on a separate line
  #
  #   time_series = self.remote_client.query_entity_counters(
  #       entity='dev3246.region1',
  #       key='dns.query_latency_tcp',
  #       transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
  #       start_ts=now()-timedelta(days=3),
  #       end_ts=now(),
  #       )        # <--- this bracket is indented and on a separate line
  indent_closing_brackets = false
  
  # Indent the dictionary value if it cannot fit on the same line as the
  # dictionary key. For example:
  #
  #   config = {
  #       'key1':
  #           'value1',
  #       'key2': value1 +
  #               value2,
  #   }
  indent_dictionary_value = true
  
  # The number of columns to use for indentation.
  indent_width = 4
  
  # Join short lines into one line. E.g., single line 'if' statements.
  join_multiple_lines = false
  
  # Do not include spaces around selected binary operators. For example:
  #
  #   1 + 2 * 3 - 4 / 5
  #
  # will be formatted as follows when configured with "*,/":
  #
  #   1 + 2*3 - 4/5
  no_spaces_around_selected_binary_operators = ''
  
  # Use spaces around default or named assigns.
  spaces_around_default_or_named_assign = false
  
  # Adds a space after the opening '{' and before the ending '}' dict delimiters.
  #
  #   {1: 2}
  #
  # will be formatted as:
  #
  #   { 1: 2 }
  spaces_around_dict_delimiters = false
  
  # Adds a space after the opening '[' and before the ending ']' list delimiters.
  #
  #   [1, 2]
  #
  # will be formatted as:
  #
  #   [ 1, 2 ]
  spaces_around_list_delimiters = false
  
  # Use spaces around the power operator.
  spaces_around_power_operator = false
  
  # Use spaces around the subscript / slice operator.  For example:
  #
  #   my_list[1 : 10 : 2]
  spaces_around_subscript_colon = false
  
  # Adds a space after the opening '(' and before the ending ')' tuple delimiters.
  #
  #   (1, 2, 3)
  #
  # will be formatted as:
  #
  #   ( 1, 2, 3 )
  spaces_around_tuple_delimiters = false
  
  # The number of spaces required before a trailing comment.
  # This can be a single value (representing the number of spaces
  # before each trailing comment) or list of values (representing
  # alignment column values; trailing comments within a block will
  # be aligned to the first column value that is greater than the maximum
  # line length within the block). For example:
  #
  # With spaces_before_comment=5:
  #
  #   1 + 1 # Adding values
  #
  # will be formatted as:
  #
  #   1 + 1     # Adding values <-- 5 spaces between the end of the statement and comment
  #
  # With spaces_before_comment = '15, 20:'
  #
  #   1 + 1 # Adding values
  #   two + two # More adding
  #
  #   longer_statement # This is a longer statement
  #   short # This is a shorter statement
  #
  #   a_very_long_statement_that_extends_beyond_the_final_column # Comment
  #   short # This is a shorter statement
  #
  # will be formatted as:
  #
  #   1 + 1          # Adding values <-- end of line comments in block aligned to col 15
  #   two + two      # More adding
  #
  #   longer_statement    # This is a longer statement <-- end of line comments in block aligned to col 20
  #   short               # This is a shorter statement
  #
  #   a_very_long_statement_that_extends_beyond_the_final_column  # Comment <-- the end of line comments are aligned based on the line length
  #   short                                                       # This is a shorter statement
  #
  spaces_before_comment = 2
  
  # Insert a space between the ending comma and closing bracket of a list,
  # etc.
  space_between_ending_comma_and_closing_bracket = false
  
  # Use spaces inside brackets, braces, and parentheses.  For example:
  #
  #   method_call( 1 )
  #   my_dict[ 3 ][ 1 ][ get_index( *args, **kwargs ) ]
  #   my_set = { 1, 2, 3 }
  space_inside_brackets = false
  
  # Split before arguments
  split_all_comma_separated_values = false
  
  # Split before arguments, but do not split all subexpressions recursively
  # (unless needed).
  split_all_top_level_comma_separated_values = false
  
  # Split before arguments if the argument list is terminated by a
  # comma.
  split_arguments_when_comma_terminated = true
  
  # Set to True to prefer splitting before '+', '-', '*', '/', '//', or '@'
  # rather than after.
  split_before_arithmetic_operator = false
  
  # Set to True to prefer splitting before '&', '|' or '^' rather than
  # after.
  split_before_bitwise_operator = false
  
  # Split before the closing bracket if a list or dict literal doesn't fit on
  # a single line.
  split_before_closing_bracket = true
  
  # Split before a dictionary or set generator (comp_for). For example, note
  # the split before the 'for':
  #
  #   foo = {
  #       variable: 'Hello world, have a nice day!'
  #       for variable in bar if variable != 42
  #   }
  split_before_dict_set_generator = false
  
  # Split before the '.' if we need to split a longer expression:
  #
  #   foo = ('This is a really long string: {}, {}, {}, {}'.format(a, b, c, d))
  #
  # would reformat to something like:
  #
  #   foo = ('This is a really long string: {}, {}, {}, {}'
  #          .format(a, b, c, d))
  split_before_dot = false
  
  # Split after the opening paren which surrounds an expression if it doesn't
  # fit on a single line.
  split_before_expression_after_opening_paren = false
  
  # If an argument / parameter list is going to be split, then split before
  # the first argument.
  split_before_first_argument = false
  
  # Set to True to prefer splitting before 'and' or 'or' rather than
  # after.
  split_before_logical_operator = false
  
  # Split named assignments onto individual lines.
  split_before_named_assigns = true
  
  # Set to True to split list comprehensions and generators that have
  # non-trivial expressions and multiple clauses before each of these
  # clauses. For example:
  #
  #   result = [
  #       a_long_var + 100 for a_long_var in xrange(1000)
  #       if a_long_var % 10]
  #
  # would reformat to something like:
  #
  #   result = [
  #       a_long_var + 100
  #       for a_long_var in xrange(1000)
  #       if a_long_var % 10]
  split_complex_comprehension = true
  
  # The penalty for splitting right after the opening bracket.
  split_penalty_after_opening_bracket = 300
  
  # The penalty for splitting the line after a unary operator.
  split_penalty_after_unary_operator = 10000
  
  # The penalty of splitting the line around the '+', '-', '*', '/', '//',
  # ``%``, and '@' operators.
  split_penalty_arithmetic_operator = 300
  
  # The penalty for splitting right before an if expression.
  split_penalty_before_if_expr = 0
  
  # The penalty of splitting the line around the '&', '|', and '^'
  # operators.
  split_penalty_bitwise_operator = 300
  
  # The penalty for splitting a list comprehension or generator
  # expression.
  split_penalty_comprehension = 2100
  
  # The penalty for characters over the column limit.
  split_penalty_excess_character = 7000
  
  # The penalty incurred by adding a line split to the unwrapped line. The
  # more line splits added the higher the penalty.
  split_penalty_for_added_line_split = 20
  
  # The penalty of splitting a list of "import as" names. For example:
  #
  #   from a_very_long_or_indented_module_name_yada_yad import (long_argument_1,
  #                                                             long_argument_2,
  #                                                             long_argument_3)
  #
  # would reformat to something like:
  #
  #   from a_very_long_or_indented_module_name_yada_yad import (
  #       long_argument_1, long_argument_2, long_argument_3)
  split_penalty_import_names = 0
  
  # The penalty of splitting the line around the 'and' and 'or'
  # operators.
  split_penalty_logical_operator = 300
  
  # Use the Tab character for indentation.
  use_tabs = false
  
  # Ignore directories
  [tool.yapfignore]
  ignore_patterns = [
      "runs/**/*.py",
      "wandb/**/*.py",
      "build/**/*.py",
  ]
  
  [tool.pylint.MASTER]
  
  # A comma-separated list of package or module names from where C extensions may
  # be loaded. Extensions are loading into the active Python interpreter and may
  # run arbitrary code.
  extension-pkg-allow-list=""
  
  # A comma-separated list of package or module names from where C extensions may
  # be loaded. Extensions are loading into the active Python interpreter and may
  # run arbitrary code. (This is an alternative name to extension-pkg-allow-list
  # for backward compatibility.)
  extension-pkg-whitelist=""
  
  # Return non-zero exit code if any of these messages/categories are detected,
  # even if score is above --fail-under value. Syntax same as enable. Messages
  # specified are enabled, while categories only check already-enabled messages.
  fail-on=""
  
  # Specify a score threshold to be exceeded before program exits with error.
  # fail-under=10.0
  
  # Files or directories to be skipped. They should be base names, not paths.
  ignore="CVS"
  
  # Add files or directories matching the regex patterns to the ignore-list. The
  # regex matches against paths and can be in Posix or Windows format.
  ignore-paths=""
  
  # Files or directories matching the regex patterns are skipped. The regex
  # matches against base names, not paths.
  ignore-patterns=""
  
  # Python code to execute, usually for sys.path manipulation such as
  # pygtk.require().
  init-hook=""
  
  # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the
  # number of processors available to use.
  jobs=4
  
  # Control the amount of potential inferred values when inferring a single
  # object. This can help the performance when dealing with large functions or
  # complex, nested conditions.
  limit-inference-results=100
  
  # List of plugins (as comma separated values of python module names) to load,
  # usually to register additional checkers.
  # load-plugins=
  
  # Pickle collected data for later comparisons.
  # persistent=yes
  
  # Minimum Python version to use for version dependent checks. Will default to
  # the version used to run pylint.
  py-version=3.10
  
  # When enabled, pylint would attempt to guess common misconfiguration and emit
  # user-friendly hints instead of false-positive error messages.
  suggestion-mode="yes"
  
  # Allow loading of arbitrary C extensions. Extensions are imported into the
  # active Python interpreter and may run arbitrary code.
  unsafe-load-any-extension="no"
  
  
  [tool.pylint.'MESSAGES CONTROL']
  
  # Only show warnings with the listed confidence levels. Leave empty to show
  # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED.
  confidence=""
  
  # 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".
  disable="""raw-checker-failed,
          bad-inline-option,
          locally-disabled,
          file-ignored,
          suppressed-message,
          useless-suppression,
          deprecated-pragma,
          similarities,
          typecheck,
          design,
          missing-module-docstring,
          wrong-import-position,
          use-symbolic-message-instead,
          arguments-differ,
          import-outside-toplevel,
          too-many-nested-block,
          signature-differs,
          useless-import-alias"""
  
  # 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 time (only on the command line, not in the configuration file where
  # it should appear only once). See also the "--disable" option for examples.
  enable="c-extension-no-member"
  
  
  [tool.pylint.'REPORTS']
  
  # Python expression which should return a score less than or equal to 10. You
  # have access to the variables 'error', 'warning', 'refactor', and 'convention'
  # which contain the number of messages in each category, as well as 'statement'
  # which is the total number of statements analyzed. This score is used by the
  # global evaluation report (RP0004).
  # evaluation="10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)"
  
  # Template used to display messages. This is a python new-style format string
  # used to format the message information. See doc for all details.
  #msg-template=
  
  # Set the output format. Available formats are text, parseable, colorized, json
  # and msvs (visual studio). You can also give a reporter class, e.g.
  # mypackage.mymodule.MyReporterClass.
  output-format="colorized"
  
  # Tells whether to display a full report or only the messages.
  reports="no"
  
  # Activate the evaluation score.
  score="no"
  
  
  [tool.pylint.REFACTORING]
  
  # Maximum number of nested blocks for function / method body
  max-nested-blocks=10
  
  # Complete name of functions that never returns. When checking for
  # inconsistent-return-statements if a never returning function is called then
  # it will be considered as an explicit return statement and no message will be
  # printed.
  never-returning-functions="sys.exit,argparse.parse_error"
  
  
  [tool.pylint.STRING]
  
  # This flag controls whether inconsistent-quotes generates a warning when the
  # character used as a quote delimiter is used inconsistently within a module.
  check-quote-consistency="no"
  
  # This flag controls whether the implicit-str-concat should generate a warning
  # on implicit string concatenation in sequences defined over several lines.
  check-str-concat-over-line-jumps="no"
  
  
  [tool.pylint.LOGGING]
  
  # The type of string formatting that logging methods do. `old` means using %
  # formatting, `new` is for `{}` formatting.
  logging-format-style="old"
  
  # Logging modules to check that the string format arguments are in logging
  # function parameter format.
  logging-modules="logging"
  
  
  [tool.pylint.VARIABLES]
  
  # List of additional names supposed to be defined in builtins. Remember that
  # you should avoid defining new builtins when possible.
  additional-builtins=""
  
  # Tells whether unused global variables should be treated as a violation.
  allow-global-unused-variables="yes"
  
  # List of names allowed to shadow builtins
  allowed-redefined-builtins=""
  
  # List of strings which can identify a callback function by name. A callback
  # name must start or end with one of those strings.
  callbacks="cb_,_cb"
  
  # A regular expression matching the name of dummy variables (i.e. expected to
  # not be used).
  dummy-variables-rgx="_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_"
  
  # Argument names that match this expression will be ignored. Default to name
  # with leading underscore.
  ignored-argument-names="_.*|^ignored_|^unused_"
  
  # Tells whether we should check for unused import in __init__ files.
  init-import="no"
  
  # List of qualified module names which can have objects that can redefine
  # builtins.
  redefining-builtins-modules="six.moves,past.builtins,future.builtins,builtins,io"
  
  
  [tool.pylint.MISCELLANEOUS]
  
  # List of note tags to take in consideration, separated by a comma.
  notes=""
  
  # Regular expression of note tags to take in consideration.
  #notes-rgx=
  
  
  [tool.pylint.SPELLING]
  
  # Limits count of emitted suggestions for spelling mistakes.
  max-spelling-suggestions=4
  
  # Spelling dictionary name. Available dictionaries: none. To make it work,
  # install the 'python-enchant' package.
  spelling-dict=""
  
  # List of comma separated words that should be considered directives if they
  # appear and the beginning of a comment and should not be checked.
  spelling-ignore-comment-directives="fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:,pyright:,type:"
  
  # List of comma separated words that should not be checked.
  spelling-ignore-words=""
  
  # A path to a file that contains the private dictionary; one word per line.
  spelling-private-dict-file=""
  
  # Tells whether to store unknown words to the private dictionary (see the
  # --spelling-private-dict-file option) instead of raising a message.
  spelling-store-unknown-words="no"
  
  
  [tool.pylint.BASIC]
  
  # Naming style matching correct argument names.
  argument-naming-style="snake_case"
  
  # Regular expression matching correct argument names. Overrides argument-
  # naming-style.
  #argument-rgx=
  
  # Naming style matching correct attribute names.
  attr-naming-style="snake_case"
  
  # Regular expression matching correct attribute names. Overrides attr-naming-
  # style.
  #attr-rgx=
  
  # Bad variable names which should always be refused, separated by a comma.
  bad-names=""
  
  # Bad variable names regexes, separated by a comma. If names match any regex,
  # they will always be refused
  bad-names-rgxs=""
  
  # Naming style matching correct class attribute names.
  class-attribute-naming-style="any"
  
  # Regular expression matching correct class attribute names. Overrides class-
  # attribute-naming-style.
  #class-attribute-rgx=
  
  # Naming style matching correct class constant names.
  class-const-naming-style="UPPER_CASE"
  
  # Regular expression matching correct class constant names. Overrides class-
  # const-naming-style.
  #class-const-rgx=
  
  # Naming style matching correct class names.
  class-naming-style="PascalCase"
  
  # Regular expression matching correct class names. Overrides class-naming-
  # style.
  #class-rgx=
  
  # Naming style matching correct constant names.
  const-naming-style="UPPER_CASE"
  
  # Regular expression matching correct constant names. Overrides const-naming-
  # style.
  #const-rgx=
  
  # Minimum line length for functions/classes that require docstrings, shorter
  # ones are exempt.
  docstring-min-length=-1
  
  # Naming style matching correct function names.
  function-naming-style="snake_case"
  
  # Regular expression matching correct function names. Overrides function-
  # naming-style.
  #function-rgx=
  
  # Good variable names which should always be accepted, separated by a comma.
  good-names=""
  
  # Good variable names regexes, separated by a comma. If names match any regex,
  # they will always be accepted
  good-names-rgxs="^[_a-z][_a-z0-9]*$"
  
  # Include a hint for the correct naming format with invalid-name.
  include-naming-hint="no"
  
  # Naming style matching correct inline iteration names.
  inlinevar-naming-style="any"
  
  # Regular expression matching correct inline iteration names. Overrides
  # inlinevar-naming-style.
  #inlinevar-rgx=
  
  # Naming style matching correct method names.
  method-naming-style="snake_case"
  
  # Regular expression matching correct method names. Overrides method-naming-
  # style.
  #method-rgx=
  
  # Naming style matching correct module names.
  module-naming-style="snake_case"
  
  # Regular expression matching correct module names. Overrides module-naming-
  # style.
  #module-rgx=
  
  # Colon-delimited sets of names that determine each other's naming style when
  # the name regexes allow several styles.
  name-group=""
  
  # Regular expression which should only match function or class names that do
  # not require a docstring.
  no-docstring-rgx="^_"
  
  # List of decorators that produce properties, such as abc.abstractproperty. Add
  # to this list to register other decorators that produce valid properties.
  # These decorators are taken in consideration only for invalid-name.
  property-classes="abc.abstractproperty"
  
  # Naming style matching correct variable names.
  variable-naming-style="snake_case"
  
  # Regular expression matching correct variable names. Overrides variable-
  # naming-style.
  #variable-rgx=
  
  
  [tool.pylint.SIMILARITIES]
  
  # Comments are removed from the similarity computation
  ignore-comments="yes"
  
  # Docstrings are removed from the similarity computation
  ignore-docstrings="yes"
  
  # Imports are removed from the similarity computation
  ignore-imports="no"
  
  # Signatures are removed from the similarity computation
  ignore-signatures="no"
  
  # Minimum lines number of a similarity.
  min-similarity-lines=4
  
  
  [tool.pylint.FORMAT]
  
  # Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
  expected-line-ending-format=""
  
  # Regexp for a line that is allowed to be longer than the limit.
  ignore-long-lines="^\\s*(# )?<?https?:\\/\\/\\S+>?$"
  
  # Number of spaces of indent required inside a hanging or continued line.
  indent-after-paren=4
  
  # String used as indentation unit. This is usually "    " (4 spaces) or "\t" (1
  # tab).
  indent-string='    '
  
  # Maximum number of characters on a single line.
  max-line-length=120
  
  # Maximum number of lines in a module.
  # max-module-lines=1000
  
  # Allow the body of a class to be on the same line as the declaration if body
  # contains single statement.
  single-line-class-stmt="no"
  
  # Allow the body of an if to be on the same line as the test if there is no
  # else.
  single-line-if-stmt="no"
  
  
  [tool.pylint.IMPORTS]
  
  # List of modules that can be imported at any level, not just the top level
  # one.
  allow-any-import-level=""
  
  # Allow wildcard imports from modules that define __all__.
  allow-wildcard-with-all="no"
  
  # Analyse import fallback blocks. This can be used to support both Python 2 and
  # 3 compatible code, which means that the block might have code that exists
  # only in one or another interpreter, leading to false positives when analysed.
  analyse-fallback-blocks="no"
  
  # Deprecated modules which should not be used, separated by a comma.
  deprecated-modules=""
  
  # Output a graph (.gv or any supported image format) of external dependencies
  # to the given file (report RP0402 must not be disabled).
  ext-import-graph=""
  
  # Output a graph (.gv or any supported image format) of all (i.e. internal and
  # external) dependencies to the given file (report RP0402 must not be
  # disabled).
  import-graph=""
  
  # Output a graph (.gv or any supported image format) of internal dependencies
  # to the given file (report RP0402 must not be disabled).
  int-import-graph=""
  
  # 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="enchant"
  
  # Couples of modules and preferred modules, separated by a comma.
  preferred-modules=""
  
  
  [tool.pylint.CLASSES]
  
  # Warn about protected attribute access inside special methods
  check-protected-access-in-special-methods="no"
  
  # List of method names used to declare (i.e. assign) instance attributes.
  defining-attr-methods="__init__,__new__,setUp,__post_init__"
  
  # List of member names, which should be excluded from the protected access
  # warning.
  exclude-protected="_asdict,_fields,_replace,_source,_make"
  
  # List of valid names for the first argument in a class method.
  valid-classmethod-first-arg="cls"
  
  # List of valid names for the first argument in a metaclass class method.
  valid-metaclass-classmethod-first-arg="cls"
  
  
  [tool.pylint.DESIGN]
  
  # List of regular expressions of class ancestor names to ignore when counting
  # public methods (see R0903)
  exclude-too-few-public-methods=""
  
  # List of qualified class names to ignore when counting class parents (see
  # R0901)
  ignored-parents=""
  
  # Maximum number of arguments for function / method.
  max-args=5
  
  # Maximum number of attributes for a class (see R0902).
  max-attributes=7
  
  # Maximum number of boolean expressions in an if statement (see R0916).
  max-bool-expr=5
  
  # Maximum number of branch for function / method body.
  max-branches=12
  
  # Maximum number of locals for function / method body.
  max-locals=15
  
  # Maximum number of parents for a class (see R0901).
  max-parents=7
  
  # Maximum number of public methods for a class (see R0904).
  max-public-methods=20
  
  # Maximum number of return / yield for function / method body.
  max-returns=6
  
  # Maximum number of statements in function / method body.
  max-statements=50
  
  # Minimum number of public methods for a class (see R0903).
  min-public-methods=2
  
  
  [tool.pylint.EXCEPTIONS]
  
  # Exceptions that will emit a warning when being caught. Defaults to
  # "BaseException, Exception".
  overgeneral-exceptions="BaseException,Exception"
  
  [tool.pydocstyle]
  convention="google"
  add_ignore="D102,D105,D107,D401"
  add_select="D400,D404"
  