# Package ######################################################################
[project]
name = "torch_npu"
dynamic = [
"classifiers",
"entry-points",
"dependencies",
"scripts",
"version",
"description",
"readme",
"license",
]
# Linter tools #################################################################
[tool.isort]
src_paths = ["torch_npu", "torchnpugen", "test"]
extra_standard_library = ["typing_extensions"]
skip_gitignore = true
skip_glob = ["third_party/*"]
atomic = true
profile = "black"
indent = 4
line_length = 88
lines_after_imports = 2
multi_line_output = 3
include_trailing_comma = true
combine_as_imports = true
[tool.usort]
preserve_inline_comments = true
collapse_blank_lines_in_category = false
[tool.usort.known]
first_party = ["torch_npu", "torchnpugen", "test"]
standard_library = ["typing_extensions"]
[tool.ruff]
line-length = 88
src = ["caffe2", "torch", "torchgen", "functorch", "test"]
extend-exclude = ["third_party", "test/dynamo/cpython", "test/npu/test_fault_mode.py"]
[tool.ruff.per-file-target-version]
"**/py312_intrinsics.py" = "py312"
[tool.ruff.format]
docstring-code-format = true
quote-style = "double"
[tool.ruff.lint]
# NOTE: Synchoronize the ignores with .flake8
external = [
"B001",
"B902",
"B950",
"E121",
"E122",
"E128",
"E131",
"E704",
"E723",
"F723",
"F812",
"P201",
"P204",
"T484",
"TOR901",
]
ignore = [
# these ignores are from flake8-bugbear; please fix!
"B007", "B008", "B017",
"B018", # Useless expression
"B023",
"B028", # No explicit `stacklevel` keyword argument found
"E402",
"C408", # C408 ignored because we like the dict keyword argument syntax
"E501", # E501 is not flexible enough, we're using B950 instead
"E741",
"EXE001",
"F405",
"FURB122", # writelines
# these ignores are from ruff NPY; please fix!
"NPY002",
# these ignores are from ruff PERF; please fix!
"PERF203",
"PERF401",
# these ignores are from PYI; please fix!
"PYI024",
"PYI036",
"PYI041",
"PYI056",
"SIM102", "SIM103", "SIM112", # flake8-simplify code styles
"SIM105", # these ignores are from flake8-simplify. please fix or ignore with commented reason
"SIM108", # SIM108 ignored because we prefer if-else-block instead of ternary expression
"SIM110", # Checks for for loops that can be replaced with a builtin function, like any or all.
"SIM114", # Combine `if` branches using logical `or` operator
"SIM116", # Disable Use a dictionary instead of consecutive `if` statements
"SIM117",
"SIM300", # Yoda condition detected
"TC006",
# TODO: Remove Python-3.10 specific suppressions
"B905",
]
select = [
"B",
"B904", # Re-raised error without specifying the cause via the from keyword
"C4",
"G",
"E",
"EXE",
"F",
"SIM",
"W",
# Not included in flake8
"FURB",
"LOG",
"NPY",
"PERF",
"PGH004",
"PIE",
"PLC0131", # type bivariance
"PLC0132", # type param mismatch
"PLC1802", # len({expression}) used as condition without comparison
"PLC0205", # string as __slots__
"PLC3002", # unnecessary-direct-lambda-call
"PLC0414", # Import alias does not rename original package
"PLE",
"PLR0133", # constant comparison
"PLR0206", # property with params
"PLR1722", # use sys exit
"PLR1736", # unnecessary list index
"PLW0127", # Self-assignment of variable
"PLW0129", # assert on string literal
"PLW0131", # named expr without context
"PLW0133", # useless exception statement
"PLW0245", # super without brackets
"PLW0406", # import self
"PLW0711", # binary op exception
"PLW1501", # bad open mode
"PLW1507", # shallow copy os.environ
"PLW1509", # preexec_fn not safe with threads
"PLW2101", # useless lock statement
"PLW3301", # nested min max
"PT006", # TODO: enable more PT rules
"PT014", # duplicate parameterize case
"PT022",
"PT023",
"PT024",
"PT025",
"PT026",
"PYI",
"Q003", # avoidable escaped quote
"Q004", # unnecessary escaped quote
"RSE",
"RUF007", # pairwise over zip
"RUF008", # mutable dataclass default
"RUF013", # ban implicit optional
"RUF015", # access first ele in constant time
"RUF016", # type error non-integer index
"RUF017",
"RUF018", # no assignment in assert
"RUF019", # unnecessary-key-check
"RUF020", # never union
"RUF024", # from keys mutable
"RUF026", # default factory kwarg
"RUF030", # No print statement in assert
"RUF033", # default values __post_init__ dataclass
"RUF041", # simplify nested Literal
"RUF048", # properly parse `__version__`
"RUF200", # validate pyproject.toml
"S324", # for hashlib FIPS compliance
"SLOT",
"TC",
"TRY002", # ban vanilla raise (todo fix NOQAs)
"TRY203",
"TRY401", # verbose-log-message
"UP",
"YTT",
"S101",
]
[tool.ruff.lint.per-file-ignores]
"torch_npu/distributed/fsdp/_add_fsdp_patch.py" = [
"UP007",
"UP045",
]
"__init__.py" = [
"F401",
]
"*.pyi" = [
"PYI011", # typed-argument-default-in-stub
"PYI021", # docstring-in-stub
"PYI053", # string-or-bytes-too-long
]
# upstream community path (not present in torch_npu)
# "functorch/docs/source/tutorials/**" = [
# "F401",
# ]
# upstream community path (not present in torch_npu)
# "test/export/**" = [
# "PGH004",
# ]
# upstream community path (not present in torch_npu)
# "test/typing/**" = [
# "PGH004"
# ]
# upstream community path (not present in torch_npu)
# "test/typing/reveal/**" = [
# "F821",
# ]
# upstream community path (not present in torch_npu)
# "test/torch_np/numpy_tests/**" = [
# "F821",
# "NPY201",
# ]
# upstream community path (not present in torch_npu)
# "test/dynamo/test_bytecode_utils.py" = [
# "F821",
# ]
"test/dynamo/test_debug_utils.py" = [
"UP037",
]
"test/dynamo/test_misc.py" = [
"PGH004",
]
"test/jit/**" = [
"PLR0133", # tests require this for JIT
"PYI",
"RUF015",
"UP", # We don't want to modify the jit test as they test specify syntax
]
"test/test_jit.py" = [
"PLR0133", # tests require this for JIT
"PYI",
"RUF015",
"UP", # We don't want to modify the jit test as they test specify syntax
]
"test/**" = ["S101"]
# upstream community path (not present in torch_npu)
# "test/inductor/s429861_repro.py" = [
# "PGH004",
# ]
# upstream community path (not present in torch_npu)
# "test/inductor/test_torchinductor.py" = [
# "UP037",
# ]
# autogenerated #TODO figure out why file level noqa is ignored
# upstream community paths (not present in torch_npu)
# "torch/_appdirs.py" = ["PGH004"]
# "torch/jit/_shape_functions.py" = ["PGH004"]
# "torch/_inductor/fx_passes/serialized_patterns/**" = ["F401", "F501"]
# "torch/_inductor/autoheuristic/artifacts/**" = ["F401", "F501"]
"torch_npu/_inductor/codegen/**" = [
"PGH004"
]
# upstream community path (not present in torch_npu)
# "torchgen/api/types/__init__.py" = [
# "F401",
# "F403",
# ]
"torch_npu/utils/collect_env.py" = [
"UP", # collect_env.py needs to work with older versions of Python
]
# upstream community path (not present in torch_npu)
# "torch/_vendor/**" = [
# "UP", # No need to mess with _vendor
# ]
"tools/linter/**" = [
"LOG015" # please fix
]
# torch_npu/ folders still needing S101 migration
# upstream community path (not present in torch_npu)
# "torch/_dynamo/**" = ["S101"]
"torch_npu/_inductor/**" = ["S101"]
[tool.codespell]
ignore-words = "tools/linter/dictionary.txt"
[tool.spin]
package = 'torch_npu'
[tool.spin.commands]
# upstream community paths (`.spin/cmds.py` not present in torch_npu)
"Build" = [
".spin/cmds.py:lint",
".spin/cmds.py:fixlint",
".spin/cmds.py:quicklint",
".spin/cmds.py:quickfix",
]
"Regenerate" = [
".spin/cmds.py:regenerate_version",
".spin/cmds.py:regenerate_type_stubs",
".spin/cmds.py:regenerate_clangtidy_files",
".spin/cmds.py:regenerate_github_workflows",
]