{
  lib,
  osConfig,
  ...
}: let
  inherit (lib) mkIf;

  cfg = osConfig.myOptions.home-manager.programs.coding.python;
in {
  config = mkIf cfg.enable {
    programs.ruff = {
      enable = true;

      settings = {
        line-length = 119;
        lint = {
          select = [
            "F" # Pyflakes
            "E" # Pycodestyle (errors)
            "W" # Pycodestyle (warnigns)
            "N" # pep8-naming
            "D" # pydocstyle
            "UP" # pyupgrade
            "YTT" # flake8-2020
            "ANN" # flake8-annotations
            "ASYNC" # flake8-async
            "S" # flake8-bandit
            "BLE" # flake8-blind-except
            "B" # flake8-bugbear
            "A" # flake8-builtins
            "COM" # flake8-commas
            "C4" # flake8-comprehensions
            "DTZ" # flake8-datetimez
            "T10" # flake8-debugger
            "EM" # flake8-errmsg
            "EXE" # flake8-executable
            "FA" # flake8-future-annotations
            "ISC" # flake8-implicit-str-concat
            "ICN" # flake8-import-conventions
            "LOG" # flake8-logging
            "G" # flake8-logging-format
            "INP" # flake8-no-pep420
            "PIE" # flake8-pie
            "T20" # flake8-print
            "PYI" # flake8-pyi
            "PT" # flake8-pytest-style
            "Q" # flake8-quotes
            "RSE" # flake8-raise
            "RET" # flake8-return
            "SLOT" # flake8-slots
            "SIM" # flake8-simplify
            "TID" # flake8-tidy-imports
            "TCH" # flake8-type-checking
            "INT" # flake8-gettext
            "PTH" # flake8-use-pathlib
            "TD" # flake8-todos
            "ERA" # flake8-eradicate
            "PGH" # pygrep-hooks
            "PL" # pylint
            "TRY" # tryceratops
            "FLY" # flynt
            "PERF" # perflint
            "RUF" # ruff-specific rules
          ];
          ignore = [
            "D100" # Missing docstring in public module
            "D104" # Missing docstring in public package
            "D105" # Missing docstring in magic method
            "D107" # Missing docstring in __init__
            "D203" # Blank line required before class docstring
            "D213" # Multi-line summary should start at second line (incompatible with D212)
            "D301" # Use r""" if any backslashes in a docstring
            "D405" # Section name should be properly capitalized
            "D406" # Section name should end with a newline
            "D407" # Missing dashed underline after section
            "D408" # Section underline should be in the line following the section's name
            "D409" # Section underline should match the length of its name
            "D410" # Missing blank line after section
            "D411" # Missing blank line before section
            "D412" # No blank lines allowed between a section header and its content
            "D413" # Missing blank line after last section
            "D414" # Section has no content
            "D416" # Section name should end with a colon
            "D417" # Missing argument descrition in the docstring

            "ANN002" # Missing type annotation for *args
            "ANN003" # Missing type annotation for **kwargs
            "ANN101" # Missing type annotation for self in method
            "ANN102" # Missing type annotation for cls in classmethod
            "ANN204" # Missing return type annotation for special method
            "ANN401" # Dynamically typed expressions (typing.Any) disallowed

            "SIM102" # use a single if statement instead of nested if statements
            "SIM108" # Use ternary operator {contents} instead of if-else-block

            "TCH001" # Move application imports used only for annotations into a type-checking block
            "TCH002" # Move 3rd-party imports used only for annotations into a type-checking block
            "TCH003" # Move standard library imports used only for annotations into a type-checking block

            "TD002" # Missing author in TODO
            "TD003" # Missing issue link on the line following this TODO

            "PT011" # pytest.raises without match parameter is too broad # TODO: Unignore this
            "TRY003" # No f-strings in raise statements
            "EM101" # No string literals in exception init
            "EM102" # No f-strings in exception init
            "UP024" # Using errors that alias OSError
            "PLR2004" # Using unnamed numerical constants
            "PGH003" # Using specific rule codes in type ignores
            "E731" # Don't asign a lambda expression, use a def

            # Redundant rules with ruff-format:
            "E111" # Indentation of a non-multiple of 4 spaces
            "E114" # Comment with indentation  of a non-multiple of 4 spaces
            "E117" # Cheks for over-indented code
            "D206" # Checks for docstrings indented with tabs
            "D300" # Checks for docstring that use ''' instead of """
            "Q000" # Checks of inline strings that use wrong quotes (' instead of ")
            "Q001" # Multiline string that use wrong quotes (''' instead of """)
            "Q002" # Checks for docstrings that use wrong quotes (''' instead of """)
            "Q003" # Checks for avoidable escaped quotes ("\"" -> '"')
            "COM812" # Missing trailing comma (in multi-line lists/tuples/...)
            "COM819" # Prohibited trailing comma (in single-line lists/tuples/...)
            "ISC001" # Single line implicit string concatenation ("hi" "hey" -> "hihey")
            "ISC002" # Multi line implicit string concatenation
          ];
          extend-per-file-ignores = {
            "tests/*" = [
              "ANN" # flake8-annotations
              "S101" # Use of assert
            ];
            "docs/conf.py" = [
              "INP" # allow implicit namespace (pep 420)
            ];
          };
          isort = {
            order-by-type = false;
            case-sensitive = true;
            combine-as-imports = true;

            # Redundant rules with ruff-format
            force-single-line = false; # forces all imports to appear on their own line
            force-wrap-aliases = false; # Split imports with multiple members and at least one alias
            lines-after-imports = -1; # The number of blank lines to place after imports
            lines-between-types = 0; # Number of lines to place between "direct" and import from imports
            split-on-trailing-comma = false; # if last member of multiline import has a comma, don't fold it to single line
          };
          pylint = {
            max-args = 20;
            max-branches = 20;
            max-returns = 20;
            max-statements = 250;
          };
          flake8-tidy-imports = {
            ban-relative-imports = "all";
          };
        };
        format = {
          line-ending = "lf";
        };
      };
    };
  };
}
