302 lines
7.1 KiB
TOML
302 lines
7.1 KiB
TOML
[project]
|
|
name = "frappe"
|
|
authors = [
|
|
{ name = "Frappe Technologies Pvt Ltd", email = "developers@frappe.io"}
|
|
]
|
|
description = "Metadata driven, full-stack low code web framework"
|
|
requires-python = ">=3.10,<3.14"
|
|
readme = "README.md"
|
|
dynamic = ["version"]
|
|
dependencies = [
|
|
# core dependencies
|
|
"Babel~=2.13.1",
|
|
"Click~=8.1.7",
|
|
"filelock~=3.13.1",
|
|
"filetype~=1.2.0",
|
|
"GitPython~=3.1.34",
|
|
"Jinja2~=3.1.2",
|
|
"Pillow~=11.0.0",
|
|
"PyJWT~=2.8.0",
|
|
# We depend on internal attributes,
|
|
# do NOT add loose requirements on PyMySQL versions.
|
|
"PyMySQL==1.1.1",
|
|
"pypdf~=3.17.0",
|
|
"PyPika==0.48.9",
|
|
"mysqlclient==2.2.7",
|
|
"PyQRCode~=1.2.1",
|
|
"PyYAML~=6.0.1",
|
|
"RestrictedPython~=8.0",
|
|
"WeasyPrint==59.0",
|
|
"pydyf==0.10.0",
|
|
"Werkzeug==3.0.6",
|
|
"Whoosh~=2.7.4",
|
|
"beautifulsoup4~=4.12.2",
|
|
"bleach-allowlist~=1.0.3",
|
|
"bleach[css]~=6.0.0",
|
|
"chardet~=5.1.0",
|
|
"croniter~=2.0.1",
|
|
"cryptography~=44.0.1",
|
|
"cssutils~=2.9.0",
|
|
"email-reply-parser~=0.5.12",
|
|
"gunicorn @ git+https://github.com/frappe/gunicorn@72c1e495d89259151e73947a057432d528b06bb0",
|
|
"html5lib~=1.1",
|
|
"ipython~=8.15.0",
|
|
"ldap3~=2.9",
|
|
"markdown2~=2.4.8",
|
|
"MarkupSafe>=2.1.0,<3",
|
|
"num2words~=0.5.12",
|
|
"oauthlib~=3.2.2",
|
|
"openpyxl~=3.1.2",
|
|
"passlib~=1.7.4",
|
|
"pdfkit~=1.0.0",
|
|
"phonenumbers==8.13.55",
|
|
"premailer~=3.10.0",
|
|
"psutil~=5.9.5",
|
|
"psycopg2-binary~=2.9.1",
|
|
"pyOpenSSL~=25.0.0",
|
|
"pydantic~=2.10.2",
|
|
"pyotp~=2.8.0",
|
|
"python-dateutil~=2.8.2",
|
|
"pytz==2023.3",
|
|
"rauth~=0.7.3",
|
|
"redis~=5.2.0",
|
|
"hiredis~=3.0.0",
|
|
"setproctitle~=1.3.3",
|
|
"requests-oauthlib~=1.3.1",
|
|
"requests~=2.32.0",
|
|
# We depend on internal attributes of RQ.
|
|
# Do NOT add loose requirements on RQ versions.
|
|
# Audit the code changes w.r.t. background_jobs.py before updating.
|
|
"rq==2.1.0",
|
|
"rsa>=4.1",
|
|
"semantic-version~=2.10.0",
|
|
"sentry-sdk~=1.37.1",
|
|
"sqlparse~=0.5.0",
|
|
"sql_metadata~=2.11.0",
|
|
"tenacity~=8.2.2",
|
|
"terminaltables~=3.1.10",
|
|
"traceback-with-variables~=2.0.4",
|
|
"typing_extensions>=4.6.1,<5",
|
|
"tomli~=2.0.1",
|
|
"uuid-utils~=0.10.0",
|
|
"xlrd~=2.0.1",
|
|
"zxcvbn~=4.4.28",
|
|
"markdownify~=0.11.6",
|
|
|
|
# integration dependencies
|
|
"boto3~=1.34.143",
|
|
"dropbox~=11.36.2",
|
|
"google-api-python-client~=2.2.0",
|
|
"google-auth-oauthlib~=0.4.4",
|
|
"google-auth~=1.29.0",
|
|
"posthog~=3.21.0",
|
|
"vobject~=0.9.7",
|
|
"pycountry~=24.6.1",
|
|
]
|
|
|
|
[project.urls]
|
|
Homepage = "https://frappeframework.com/"
|
|
Repository = "https://github.com/frappe/frappe.git"
|
|
"Bug Reports" = "https://github.com/frappe/frappe/issues"
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"pyngrok~=6.0.0",
|
|
"watchdog~=3.0.0",
|
|
"responses==0.23.1",
|
|
# typechecking
|
|
"basedmypy",
|
|
"types-PyMySQL",
|
|
"types-PyYAML",
|
|
"types-Pygments",
|
|
"types-beautifulsoup4",
|
|
"types-bleach",
|
|
"types-cffi",
|
|
"types-colorama",
|
|
"types-croniter",
|
|
"types-decorator",
|
|
"types-ldap3",
|
|
"types-oauthlib",
|
|
"types-openpyxl",
|
|
"types-passlib",
|
|
"types-psutil",
|
|
"types-psycopg2",
|
|
"types-python-dateutil",
|
|
"types-pytz",
|
|
"types-requests",
|
|
"types-six",
|
|
"types-vobject",
|
|
"types-zxcvbn",
|
|
"pypika-stubs", # contributed
|
|
]
|
|
test = [
|
|
"unittest-xml-reporting~=3.2.0",
|
|
"coverage~=6.5.0",
|
|
"Faker~=18.10.1",
|
|
"hypothesis~=6.77.0",
|
|
"freezegun~=1.5.1",
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["flit_core >=3.4,<4"]
|
|
build-backend = "flit_core.buildapi"
|
|
|
|
[tool.frappe.testing.function_type_validation]
|
|
max_module_depth = 0
|
|
skip_namespaces = [
|
|
"frappe.deprecation_dumpster",
|
|
"frappe.utils.typing_validations",
|
|
]
|
|
|
|
[tool.bench.dev-dependencies]
|
|
coverage = "~=6.5.0"
|
|
Faker = "~=18.10.1"
|
|
pyngrok = "~=6.0.0"
|
|
unittest-xml-reporting = "~=3.2.0"
|
|
watchdog = "~=3.0.0"
|
|
hypothesis = "~=6.77.0"
|
|
responses = "==0.23.1"
|
|
freezegun = "~=1.2.2"
|
|
pdbpp = "~=0.10.3"
|
|
|
|
[tool.ruff]
|
|
line-length = 110
|
|
target-version = "py310"
|
|
exclude = [
|
|
"**/doctype/*/boilerplate/*.py" # boilerplate are template strings, not valid python
|
|
]
|
|
|
|
[tool.ruff.lint]
|
|
select = [
|
|
"F",
|
|
"E",
|
|
"W",
|
|
"I",
|
|
"UP",
|
|
"B",
|
|
"RUF",
|
|
]
|
|
ignore = [
|
|
"B017", # assertRaises(Exception) - should be more specific
|
|
"B018", # useless expression, not assigned to anything
|
|
"B023", # function doesn't bind loop variable - will have last iteration's value
|
|
"B904", # raise inside except without from
|
|
"E101", # indentation contains mixed spaces and tabs
|
|
"E402", # module level import not at top of file
|
|
"E501", # line too long
|
|
"E741", # ambiguous variable name
|
|
"F401", # "unused" imports
|
|
"F403", # can't detect undefined names from * import
|
|
"F405", # can't detect undefined names from * import
|
|
"F722", # syntax error in forward type annotation
|
|
"W191", # indentation contains tabs
|
|
"RUF001", # string contains ambiguous unicode character
|
|
"UP030", # Use implicit references for positional format fields (translations)
|
|
"UP031", # Use format specifiers instead of percent format
|
|
"UP032", # Use f-string instead of `format` call (translations)
|
|
]
|
|
typing-modules = ["frappe.types.DF"]
|
|
|
|
[tool.ruff.format]
|
|
quote-style = "double"
|
|
indent-style = "tab"
|
|
docstring-code-format = true
|
|
|
|
[tool.frappix]
|
|
# use identifier from https://search.nixos.org/packages
|
|
nixpkgs-deps = [
|
|
"mariadb",
|
|
"restic",
|
|
"wkhtmltopdf-bin",
|
|
"which",
|
|
"gzip",
|
|
"bash",
|
|
"redis",
|
|
"nodejs_20",
|
|
"python312",
|
|
]
|
|
|
|
[tool.mypy]
|
|
strict = false
|
|
pretty = true
|
|
incremental = true
|
|
sqlite_cache = true
|
|
files = [
|
|
# start small, with a lot of multiplication potential
|
|
"frappe/types/__init__.py",
|
|
"frappe/types/DF.py",
|
|
"frappe/types/docref.py",
|
|
"frappe/types/frappedict.py",
|
|
"frappe/types/filter.py",
|
|
]
|
|
exclude = [
|
|
# permanent excludes
|
|
"^frappe/patches",
|
|
'/test_.+\.py$',
|
|
"^frappe/tests/ui_test_helpers.py",
|
|
"^frappe/parallel_test_runner.py",
|
|
"^frappe/deprecation_dumpster.py",
|
|
]
|
|
disable_error_code = [
|
|
]
|
|
|
|
[[tool.mypy.overrides]]
|
|
module = "frappe"
|
|
# Too many for a start
|
|
disable_error_code = [
|
|
"no-any-expr",
|
|
"no-untyped-def",
|
|
"no-untyped-call",
|
|
"no-untyped-usage",
|
|
]
|
|
|
|
# External libraries without types
|
|
[[tool.mypy.overrides]]
|
|
module = [
|
|
"apiclient.http",
|
|
"bleach_allowlist",
|
|
"boto3",
|
|
"botocore.exceptions",
|
|
"cssutils",
|
|
"cups",
|
|
"dropbox",
|
|
"email_reply_parser",
|
|
"filetype",
|
|
"google",
|
|
"googleapiclient.discovery",
|
|
"googleapiclient.errors",
|
|
"google.oauth2",
|
|
"google.oauth2.credentials",
|
|
"markdown2",
|
|
"markdownify",
|
|
"num2words",
|
|
"pdfkit",
|
|
"premailer",
|
|
"pyngrok",
|
|
"pypika",
|
|
"pypika.dialects",
|
|
"pypika.functions",
|
|
"pypika.queries",
|
|
"pypika.terms",
|
|
"pypika.utils",
|
|
"pyqrcode",
|
|
"rauth",
|
|
"requests_oauthlib",
|
|
"RestrictedPython",
|
|
"RestrictedPython.Guards",
|
|
"RestrictedPython.transformer",
|
|
"semantic_version",
|
|
"sql_metadata",
|
|
"sqlparse",
|
|
"terminaltables",
|
|
"traceback_with_variables",
|
|
"weasyprint",
|
|
"whoosh.fields",
|
|
"whoosh.index",
|
|
"whoosh.qparser",
|
|
"whoosh.query",
|
|
"whoosh.writing",
|
|
"xlrd",
|
|
"xmlrunner",
|
|
]
|
|
ignore_missing_imports = true
|