[tool.ruff] # Same as Black. line-length = 127 # Assume Python 3.9 target-version = "py39" [tool.ruff.lint] # See https://beta.ruff.rs/docs/rules/ select = ["E", "F", "B", "UP", "C90", "RUF"] # B028: Ignore explicit stacklevel` # RUF013: Too many false positives (implicit optional) ignore = ["B028", "RUF013"] [tool.ruff.lint.per-file-ignores] # Default implementation in abstract methods "./stable_baselines3/common/callbacks.py" = ["B027"] "./stable_baselines3/common/noise.py" = ["B027"] # ClassVar, implicit optional check not needed for tests "./tests/*.py" = ["RUF012", "RUF013"] [tool.ruff.lint.mccabe] # Unlike Flake8, default to a complexity level of 10. max-complexity = 15 [tool.black] line-length = 127 [tool.mypy] ignore_missing_imports = true follow_imports = "silent" show_error_codes = true exclude = """(?x)( tests/test_logger.py$ | tests/test_train_eval_mode.py$ )""" [tool.pytest.ini_options] # Deterministic ordering for tests; useful for pytest-xdist. env = ["PYTHONHASHSEED=0"] filterwarnings = [ # A2C/PPO on GPU "ignore:You are trying to run (PPO|A2C) on the GPU", # Tensorboard warnings "ignore::DeprecationWarning:tensorboard", # Gymnasium warnings "ignore::UserWarning:gymnasium", # tqdm warning about rich being experimental "ignore:rich is experimental", ] markers = [ "expensive: marks tests as expensive (deselect with '-m \"not expensive\"')", ] [tool.coverage.run] disable_warnings = ["couldnt-parse"] branch = false omit = [ "tests/*", "setup.py", # Require graphical interface "stable_baselines3/common/results_plotter.py", # Require ffmpeg "stable_baselines3/common/vec_env/vec_video_recorder.py", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "raise NotImplementedError()", "if typing.TYPE_CHECKING:", ]