[build-system]
build-backend = "setuptools.build_meta"
requires = [
  "setuptools>=67",
]

[project]
name = "pipenv"
description = "Python Development Workflow for Humans."
readme = "README.md"
license = {file = "LICENSE"}
authors = [
  {name = "Pipenv maintainer team", email = "distutils-sig@python.org"},
]
requires-python = ">=3.7"
classifiers=[
  "License :: OSI Approved :: MIT License",
  "Programming Language :: Python",
  "Programming Language :: Python :: 3 :: Only",
  "Programming Language :: Python :: 3.7",
  "Programming Language :: Python :: 3.8",
  "Programming Language :: Python :: 3.9",
  "Programming Language :: Python :: 3.10",
  "Programming Language :: Python :: 3.11",
  "Programming Language :: Python :: Implementation :: CPython",
  "Programming Language :: Python :: Implementation :: PyPy",
]
dynamic = [
  "version",
]
dependencies = [
  "certifi",
  "setuptools>=67",
  "virtualenv>=20.24.2",
]
[project.optional-dependencies]
dev = [
  "beautifulsoup4",
  "black==23.3",
  "flake8<4.0,>=3.3",
  "invoke",
  "parver",
  "sphinx",
  "towncrier",
]
tests = [
  "flaky",
  "mock",
  "pytest>=5",
  "pytest-timeout",
  "pytest-xdist",
]
[project.urls]
Documentation = "https://pipenv.pypa.io/en/latest/"
Homepage = "https://github.com/pypa/pipenv"
Source = "https://github.com/pypa/pipenv.git"
[project.scripts]
pipenv = "pipenv:cli"
pipenv-resolver = "pipenv.resolver:main"

[tool.setuptools.packages.find]
where = ["."]
exclude = ["tests*", "tests.*", "tasks*", "tasks.*"]


[tool.setuptools.package-data]
"*" = ["LICENSE", "NOTICES"]
"pipenv.patched.safety" = ["VERSION", "safety-policy-template.yml"]
"pipenv.patched.pip._vendor.certifi" = ["*.pem"]
"pipenv.patched.pip._vendor.requests" = ["*.pem"]
"pipenv.patched.pip._vendor.distlib" = [
  "t32.exe",
  "t64.exe",
  "w32.exe",
  "w64.exe",
]
"pipenv.vendor.ruamel" = ["yaml"]


[tool.setuptools.dynamic]
version = {attr = "pipenv.__version__"}


## TESTING AND DEVELOPER CONFIGURATION BELOW ##

[tool.black]
line-length = 90
include = '\.pyi?$'
exclude = '''
/(
    \.eggs
  | \.git
  | \.github
  | \.hg
  | \.mypy_cache
  | \.tox
  | \.pyre_configuration
  | \.venv
  | _build
  | buck-out
  | build
  | dist
  | pipenv/vendor
  | pipenv/patched
  | tests/pypi
  | tests/test_artifacts
  | get-pipenv.py
  | pyproject.toml
)
'''

[tool.ruff]
exclude = [
  "pipenv/patched/*",
  "pipenv/vendor/*",
]
select = [
  "ASYNC",
  "B",
  "C4",
  "C90",
  "E",
  "F",
  "FLY",
  "G",
  "I",
  "ISC",
  "PERF",
  "PIE",
  "PL",
  "TID",
  "UP",
  "W",
  "YTT"
]
ignore = [
  "B904",
  "PIE790",
  "PLR5501",
  "PLW2901",
]
line-length = 137
target-version = "py37"


[tool.ruff.mccabe]
max-complexity = 44


[tool.ruff.pylint]
allow-magic-value-types = ["int", "str"]
max-args = 20
max-branches = 38
max-returns = 9
max-statements = 155


[tool.ruff.per-file-ignores]
"docs/conf.py" = ["E402", "E501"]
"get-pipenv.py" = ["E402"]
"pipenv/__init__.py" = ["E401"]
"pipenv/cli/command.py" = ["TID252"]
"pipenv/utils/internet.py" = ["PLW0603"]
"pipenv/utils/resolver.py" = ["B018"]
"tests/*" = ["E501", "F401", "I", "PLC1901", "S101"]
"tests/integration/conftest.py" = ["B003", "PIE800", "PLW0603"]
"tests/integration/test_pipenv.py" = ["E741"]
"tests/integration/test_requirements.py" = ["E741"]
"tests/unit/test_funktools.py" = ["B015"]
"tests/unit/test_utils.py" = ["F811"]

[tool.pytest.ini_options]
addopts = "-ra"
plugins = "xdist"
testpaths = ["tests"]
# Add vendor and patched in addition to the default list of ignored dirs
# Additionally, ignore tasks, news, test subdirectories and peeps directory
norecursedirs = [
  ".*",
  "build",
  "dist",
  "CVS",
  "_darcs",
  "{arch}",
  "*.egg",
  "vendor",
  "patched",
  "news",
  "tasks",
  "docs",
  "tests/test_artifacts",
  "tests/pypi",
  "peeps",
]
filterwarnings = []
# These are not all the custom markers, but most of the ones with repeat uses
# `pipenv run pytest --markers` will list all markers including these
markers = [
  "install: tests having to do with `pipenv install`",
  "update: tests having to do with `pipenv update`",
  "needs_internet: integration tests that require internet to pass",
  "basic: basic pipenv tests grouping",
  "dev: tests having to do with dev and dev packages",
  "system: related or interacting with the os",
  "utils: grouping of pipenv utility functions",
  "cli: test grouping that relate to command line like `pipenv --flag args`",
  "requirements: tests that save and alter pip requirements",
  "run: tests that run or execute python through pipenv",
  "script: grouping of tests that execute scripts",
  "keep_outdated: when an activity is supposed to keep something out of date",
  "lock: tests that interact with pipenv lock",
  "markers: pipenv environment markers",
  "vcs: tests integration with pipenv and vertsion control systems",
  "project: tests with the project object",
  "sync: related to `pipenv sync`",
  "rrule: relating to rrules (as in recurring time)",
  "tzoffset: timezone offset",
  "gettz: tests with gettz (get timezone) from dateutil lib",
  "tzstr: timezone string",
  "extras",
  "extended",
  "ext: extra non-categorized tests",
]

[tool.coverage.run]
parallel = true

[tool.mypy]
ignore_missing_imports = true
follow_imports = "skip"
html_report = "mypyhtml"
python_version = "3.7"
mypy_path = "typeshed/pyi:typeshed/imports"

[tool.towncrier]
package = "pipenv"
filename = "CHANGELOG.md"
issue_format = "`#{issue} <https://github.com/pypa/pipenv/issues/{issue}>`_"
directory = "news/"
title_format = "{version} ({project_date})"
template = "news/towncrier_template.rst"

  [[tool.towncrier.type]]
  directory = "feature"
  name = "Features & Improvements"
  showcontent = true

  [[tool.towncrier.type]]
  directory = "behavior"
  name = "Behavior Changes"
  showcontent = true

  [[tool.towncrier.type]]
  directory = "bugfix"
  name = "Bug Fixes"
  showcontent = true

  [[tool.towncrier.type]]
  directory = "vendor"
  name = "Vendored Libraries"
  showcontent = true

  [[tool.towncrier.type]]
  directory = "doc"
  name = "Improved Documentation"
  showcontent = true

  [[tool.towncrier.type]]
  directory = "trivial"
  name = "Trivial Changes"
  showcontent = false

  [[tool.towncrier.type]]
  directory = "removal"
  name = "Removals and Deprecations"
  showcontent = true

  [[tool.towncrier.type]]
  directory = "process"
  name = "Relates to dev process changes"
  showcontent = true
