content: [project]
  name = "lasso-python"
  description = "An open-source CAE and Machine Learning library."
  license-files = ["LICENSE.md"]
  readme = "README.rst"
  dynamic = ["version"]
  authors = [{ name = "open-lasso-python", email = "open.lasso.python@gmail.com" }]
  classifiers = [
      "Development Status :: 5 - Production/Stable",
      "Topic :: Scientific/Engineering",
      "Intended Audience :: Science/Research",
      "Topic :: Utilities",
      "Operating System :: Microsoft :: Windows",
      "Operating System :: POSIX :: Linux",
      "Programming Language :: Python :: 3",
      "Programming Language :: Python :: 3.11",
      "Programming Language :: Python :: 3.12",
  ]
  
  requires-python = ">=3.11"
  dependencies = [
      "h5py==3.*",
      "scipy==1.*",
      "numpy>2.2",
      "plotly==5.*",
      "psutil==5.*",
      "rich==13.*",
      "pandas==2.*",
      "scikit_learn==1.*",
  ]
  
  [tool.setuptools]
  package-dir = {"" = "src"}
  
  [project.scripts]
  diffcrash = "lasso.diffcrash.run:main"
  dimred = "lasso.dimred.run:main"
  
  [dependency-groups]
  dev = [
      "pytest==8.*",
      "pytest-cov==5.*",
      "ruff==0.11.*",
      "mkdocs==1.*",
      "mkdocs-material==9.*",
      "mkdocstrings[python]==0.*",
      "mkdocs-coverage==1.*",
      "git-changelog==2.*",
      "twine==5.*",
      "go-task-bin"
  ]
  
  [build-system]
  requires = ["setuptools>=78", "setuptools-scm>=8"]
  build-backend = "setuptools.build_meta"
  
  [tool.ruff]
  required-version = "==0.11.*"
  line-length = 100
  indent-width = 4
  preview = true
  
  # Output serialization format for violations. The default serialization
  # format is "full" [env: RUFF_OUTPUT_FORMAT=] [possible values:
  # concise, full, json, json-lines, junit, grouped, github, gitlab,
  # pylint, rdjson, azure, sarif]
  output-format = "grouped"
  
  [tool.ruff.lint]
  isort.lines-after-imports = 2
  select = [
      "C",   # Complexity checks (e.g., McCabe complexity, comprehensions)
      # "ANN001", "ANN201", "ANN401", # flake8-annotations (required strict type annotations for public functions)
      "S",   # flake8-bandit (checks basic security issues in code)
      # "BLE", # flake8-blind-except (checks the except blocks that do not specify exception)
      # "FBT", # flake8-boolean-trap (ensure that boolean args can be used with kw only)
      "E",   # pycodestyle errors (PEP 8 style guide violations)
      "W",   # pycodestyle warnings (e.g., extra spaces, indentation issues)
      # "DOC", # pydoclint issues (e.g., extra or missing return, yield, warnings)
      "A",   # flake8-buitins (check variable and function names to not shadow builtins)
      "N",   # Naming convention checks (e.g., PEP 8 variable and function names)
      "F",   # Pyflakes errors (e.g., unused imports, undefined variables)
      "I",   # isort (Ensures imports are sorted properly)
      "B",   # flake8-bugbear (Detects likely bugs and bad practices)
      "TID", # flake8-tidy-imports (Checks for banned or misplaced imports)
      "UP",  # pyupgrade (Automatically updates old Python syntax)
      "YTT", # flake8-2020 (Detects outdated Python 2/3 compatibility issues)
      "FLY", # flynt (Converts old-style string formatting to f-strings)
      "PIE", # flake8-pie
      "NPY201",   # numpy2-deprecations
      # "PL",  # pylint
      # "RUF", # Ruff-specific rules (Additional optimizations and best practices)
  ]
  
  ignore = [
      "C90",      # [mccabe](https://docs.astral.sh/ruff/rules/#mccabe-c90)
      "PLR2004",  # [magic-value-comparision](https://docs.astral.sh/ruff/rules/magic-value-comparison)
      "S311",     # [suspicious-non-cryptographic-random-usage](https://docs.astral.sh/ruff/rules/suspicious-non-cryptographic-random-usage/)
      "S404",     # [suspicious-subprocess-import](https://docs.astral.sh/ruff/rules/suspicious-subprocess-import/)
      "S603",     # [subprocess-without-shell-equals-true](https://docs.astral.sh/ruff/rules/subprocess-without-shell-equals-true/)
      "UP007",    # [non-pep604-annotation-union](https://docs.astral.sh/ruff/rules/non-pep604-annotation-union/#non-pep604-annotation-union-up007)
  ]
  
  [tool.ruff.lint.per-file-ignores]
  # non-lowercase-variable-in-function (N806)
  "{femzip_api,femzip_mapper,d3plot,}.py" = ["N806"]
  # error-suffix-on-exception-name (N818)
  "{femzip_api}.py" = ["N818"]
  
  [tool.ruff.format]
  docstring-code-format = true
  skip-magic-trailing-comma = true
  