content: [project]
  name = "bitbucket-pipeline-runner"
  version = "0.5.1"
  description = "Run a bitbucket pipeline locally"
  authors = [
      { name = "Mathieu Lemay", email = "acidrain1@gmail.com" }
  ]
  license = "MIT"
  readme = "README.md"
  requires-python = ">=3.10"
  dependencies = [
      "pyyaml (>=6.0.2,<7.0.0)",
      "docker (>=7.1.0,<8.0.0)",
      "click (>=8.1.8,<9.0.0)",
      "python-slugify (>=8.0.4,<9.0.0)",
      "boto3 (>=1.37.13,<2.0.0)",
      "gitpython (>=3.1.44,<4.0.0)",
      "python-dotenv (>=1.0.1,<2.0.0)",
      "requests (>=2.32.3,<3.0.0)",
      "coloredlogs (>=15.0.1,<16.0.0)",
      "pyfzf (>=0.3.1,<0.4.0)",
      "pydantic (>=2.10.6,<3.0.0)",
      "pydantic-settings (>=2.8.1,<3.0.0)",
      "cryptography (>=45.0.3,<46.0.0)",
      "tenacity (>=9.0.0,<10.0.0)",
      "platformdirs (>=4.3.6,<5.0.0)",
      "pyjwt (>=2.10.1,<3.0.0)"
  ]
  
  [project.urls]
  repository = "https://github.com/mathieu-lemay/pipeline-runner"
  
  [tool.poetry]
  packages = [
      { include = "pipeline_runner" }
  ]
  
  [tool.poetry.group.dev.dependencies]
  pytest = "^8.0.0"
  pytest-mock = "^3.5.1"
  coverage = { version = "^7.0.1", extras = ["toml"] }
  mypy = "^1.4.0"
  types-pyyaml = "^6.0.12.10"
  types-python-slugify = "^8.0.0.2"
  types-boto3 = "^1.0.2"
  faker = "^37.0.0"
  pytest-cov = "^6.0.0"
  
  [tool.poetry.scripts]
  pipeline-runner = 'pipeline_runner.cli:main'
  
  [tool.mypy]
  namespace_packages = true
  explicit_package_bases = true
  strict = true
  show_error_codes = true
  plugins = ["pydantic.mypy"]
  
  [tool.pydantic-mypy]
  init_forbid_extra = true
  init_typed = true
  warn_required_dynamic_aliases = true
  warn_untyped_fields = true
  
  [tool.ruff]
  target-version = "py310"
  exclude = [".venv"]
  line-length = 120
  
  [tool.ruff.lint]
  select = [
      "ALL"
  ]
  ignore = [
      "COM", # flake8-commas
      "D", # pydocstyle
      "DTZ", # flake8-datetimez
      "FIX", # flake8-fixme
      "PTH", # flake8-use-pathlib
      "TD", # flake8-todos
  
      "EM101", # Exception must not use a string literal, assign to variable first
      "EM102", # Exception must not use an f-string literal, assign to variable first
      "PLR0913", # Too many arguments to function call
      "TRY002", # Create your own exception
      "TRY003", # Avoid specifying long messages outside the exception class
  ]
  
  [tool.ruff.lint.pep8-naming]
  classmethod-decorators = [
      "classmethod",
      "pydantic.field_validator",
  ]
  
  [tool.ruff.lint.per-file-ignores]
  "tests/*" = [
      "FBT001", # Boolean-typed positional argument in function definition
      "PLR2004", # Magic value used in comparison
      "S101", # Use of `assert` detected
      "S105", # Possible hardcoded password
      "SLF001", # Private member accessed: Acceptable until a refactor
  ]
  
  [tool.pytest.ini_options]
  testpaths = ["tests/unit", "tests/integration", "tests"]
  
  [tool.coverage.run]
  branch = true
  
  [tool.coverage.report]
  exclude_lines = ["pragma: no cover", "raise NotImplementedError", "if TYPE_CHECKING:"]
  
  [build-system]
  requires = ["poetry-core>=2.0.0,<3.0.0"]
  build-backend = "poetry.core.masonry.api"
  