[project] name = "caesar-salad-cipher" version = "0.1.0" description = "CLI tool that shifts characters by a specified number (the key) to encrypt/decrypt text." requires-python = ">=3.12" dependencies = [ "typer>=0.20.0,<0.21.0", "rich>=14.2.0,<15.0.0", ] [project.optional-dependencies] dev = [ "pytest>=9.0.2,<10.0.0", "pytest-cov>=7.0.0,<8.0.0", "mypy>=1.19.0,<2.0.0", "ruff>=0.14.8,<0.15.0", "ty>=0.0.1a32,<0.1.0", "pre-commit>=4.5.0,<5.0.0", "pylint>=4.0.4,<5.0.0", ] [project.urls] Homepage = "https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main" Repository = "https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/caesar-cipher" Issues = "https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/caesar-cipher/issues" [project.scripts] caesar-cipher = "caesar_cipher.main:app" [build-system] requires = [ "hatchling", ] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = [ "src/caesar_cipher", ] [tool.ruff] target-version = "py312" line-length = 88 src = [ "src", ] exclude = [ "alembic", ] [tool.ruff.lint] select = [ "E", "W", "F", "B", "C4", "UP", "ARG", "SIM", "PTH", "RUF", "ASYNC", "S", "N", ] ignore = [ "E501", "B008", "S101", "S104", "S105", "ARG001", "E712", "N999", "N818", "UP046", "RUF005", ] [tool.ruff.lint.per-file-ignores] "tests/**/*.py" = [ "S101", "ARG001", ] "conftest.py" = [ "S107", ] "src/core/rate_limit.py" = [ "S110", ] "src/config.py" = [ "F401", ] "src/schemas/**/*.py" = [ "RUF012", ] [tool.mypy] python_version = "3.12" strict = true warn_return_any = true warn_unused_ignores = true disallow_untyped_defs = true disallow_incomplete_defs = true exclude = [ "alembic", ] [[tool.mypy.overrides]] module = [ "tests.*", "conftest", ] ignore_errors = true [[tool.mypy.overrides]] module = [ "src.core.logging", ] disable_error_code = [ "no-any-return", ] [[tool.mypy.overrides]] module = [ "src.config", ] implicit_reexport = true [tool.pylint.main] py-version = "3.12" jobs = 4 load-plugins = [ "pylint_per_file_ignores", ] persistent = true suggestion-mode = true ignore = [ "venv", ".venv", "__pycache__", "build", "dist", ".git", ".pytest_cache", ".mypy_cache", ".ruff_cache", ] ignore-paths = [ "^venv/.*", "^.venv/.*", "^build/.*", "^dist/.*", ] [tool.pylint.messages_control] disable = [ "C0103", "C0116", "C0121", "C0301", "C0302", "C0303", "C0304", "C0305", "C0411", "E0401", "E1102", "E1136", "R0801", "R0901", "R0903", "R0917", "W0611", "W0612", "W0613", "W0621", "W0622", "W0718", ] [tool.pylint.pylint-per-file-ignores] "conftest.py" = "import-outside-toplevel" [tool.pylint.format] max-line-length = 95 [tool.pylint.design] max-args = 12 max-attributes = 10 max-branches = 15 max-locals = 20 max-statements = 55 [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" testpaths = [ "tests", ] addopts = "-ra -q" filterwarnings = [ "ignore::DeprecationWarning", ] [tool.ty.src] include = [ "src", "tests", ] exclude = [ ".venv/**", ] respect-ignore-files = true [tool.ty.environment] python-version = "3.12" root = [ "./src", ] python = "./.venv" [tool.ty.rules] possibly-missing-attribute = "error" possibly-missing-import = "error" unused-ignore-comment = "warn" redundant-cast = "warn" undefined-reveal = "warn" [[tool.ty.overrides]] include = [ "tests/**", ] [tool.ty.overrides.rules] unresolved-reference = "warn" invalid-argument-type = "warn" [[tool.ty.overrides]] include = [ "src/repositories/**", "src/services/**", ] [tool.ty.overrides.rules] unresolved-attribute = "warn" [tool.ty.terminal] error-on-warning = false output-format = "full"