content: [project]
  name = "bpy_jupyter"
  version = "0.3.0"
  description = "Embeds a Jupyter kernel within Blender"
  authors = [
      { name = "Sofus Albert Høgsbro Rose", email = "bpyjupyter@sofusrose.com" },
  ]
  maintainers = [
      { name = "Sofus Albert Høgsbro Rose", email = "bpyjupyter@sofusrose.com" },
      { name = "Jan-Hendrik Mueller", email = "bpyjupyter@sofusrose.com" },
  ]
  readme = "README.md"
  requires-python = "~= 3.11"
  license = "AGPL-3.0-or-later"
  dependencies = [
      "ipykernel==6.29.5",
      "pydantic>=2.9.2",
      "pyperclipfix>=1.9.4",
  ]
  
  [project.urls]
  Homepage = "https://kolibril13.github.io/bpy-gallery/"
  
  ####################
  # - Blender Extension
  ####################
  [project.optional-dependencies]
  blender4_3 = [
      "autopep8==2.3.1", # # ⭳⭳⭳ MANAGED BY BLEXT ⭳⭳⭳
      "certifi==2021.10.8",
      "charset_normalizer==2.0.10",
      "cython==0.29.30",
      "idna==3.3",
      "numpy==1.24.3",
      "pip==24.0",
      "pycodestyle==2.12.1",
      "requests==2.27.1",
      "setuptools==63.2.0",
      "urllib3==1.26.8",
      "zstandard==0.16.0", # # ⭱⭱⭱ MANAGED BY BLEXT ⭱⭱⭱
  ]
  blender4_4 = [
      "autopep8==2.3.1", # # ⭳⭳⭳ MANAGED BY BLEXT ⭳⭳⭳
      "certifi==2021.10.8",
      "charset_normalizer==2.0.10",
      "cython==0.29.30",
      "idna==3.3",
      "numpy==1.24.3",
      "pip==24.0",
      "pycodestyle==2.12.1",
      "requests==2.27.1",
      "setuptools==63.2.0",
      "urllib3==1.26.8",
      "zstandard==0.16.0", # # ⭱⭱⭱ MANAGED BY BLEXT ⭱⭱⭱
  ]
  
  [tool.blext]
  pretty_name = "bpy Jupyter"
  blender_version_min = '4.3.0'
  blender_version_max = '4.5.0'
  bl_tags = ["Development", "Import-Export", "Pipeline", "System"]
  copyright = ["2025 bpy_jupyter Contributors"]
  
  supported_platforms = [
  	'linux-x64',
  	'macos-x64',
  	'macos-arm64',
  	'windows-x64',
  ]
  
  [tool.blext.permissions]
  files = 'Create, delete Jupyter kernel connection file'
  network = 'Expose Jupyter kernel sockets'
  clipboard = 'Copy Jupyter kernel information to the clipboard'
  
  ####################
  # - Blender Extension
  ####################
  [tool.uv]
  managed = true
  package = false
  dev-dependencies = [
      "pytest>=8.3.5",
      "pytest-cov>=6.1.1",
      "ruff>=0.11.8",
      "basedpyright>=1.29.1",
      "blext",
      "fake-bpy-module>=20250505",
      "griffe-pydantic>=1.1.4",
      "mkdocs>=1.6.1",
      "mkdocs-github-admonitions-plugin>=0.0.3",
      "mkdocs-macros-plugin>=1.3.7",
      "mkdocs-material>=9.6.12",
      "mkdocstrings[python]>=0.29.1",
      "termynal>=0.13.0",
  ]
  conflicts = [
      [
          {extra = "blender4_3"}, # # ⭳⭳⭳ MANAGED BY BLEXT ⭳⭳⭳
          {extra = "blender4_4"}, # # ⭱⭱⭱ MANAGED BY BLEXT ⭱⭱⭱
      ],
  ]
  
  [tool.uv.sources]
  blext = { git = "https://codeberg.org/so-rose/blext.git" }
  
  ####################
  # - Tooling: Ruff
  ####################
  [tool.ruff]
  target-version = "py311"
  line-length = 88
  
  [tool.ruff.lint]
  task-tags = ["TODO"]
  select = [
  	"E",   # pycodestyle  ## General Purpose
  	"F",   # pyflakes  ## General Purpose
  	"PL",  # Pylint  ## General Purpose
  	
  	## Code Quality
  	"TCH", # flake8-type-checking  ## Type Checking Block Validator
  	"C90", # mccabe  ## Avoid Too-Complex Functions
  	"ERA", # eradicate  ## Ban Commented Code
  	"TRY", # tryceratops  ## Exception Handling Style
  	"B",   # flake8-bugbear  ## Opinionated, Probable-Bug Patterns
  	"N",   # pep8-naming
  	"D",   # pydocstyle
  	"SIM", # flake8-simplify  ## Sanity-Check for Code Simplification
  	"SLF", # flake8-self  ## Ban Private Member Access
  	"RUF", # Ruff-specific rules  ## Extra Good-To-Have Rules
  	
  	## Style
  	"I",   # isort  ## Force import Sorting
  	"UP",  # pyupgrade  ## Enforce Upgrade to Newer Python Syntaxes
  	"COM", # flake8-commas  ## Enforce Trailing Commas
  	"Q",   # flake8-quotes  ## Finally - Quoting Style!
  	"PTH", # flake8-use-pathlib  ## Enforce pathlib usage
  	"A",   # flake8-builtins  ## Prevent Builtin Shadowing
  	"C4",  # flake9-comprehensions  ## Check Compehension Appropriateness
  	"DTZ", # flake8-datetimez  ## Ban naive Datetime Creation
  	"EM",  # flake8-errmsg  ## Check Exception String Formatting
  	"ISC", # flake8-implicit-str-concat  ## Enforce Good String Literal Concat
  	"G",   # flake8-logging-format  ## Enforce Good Logging Practices
  	"INP", # flake8-no-pep420  ## Ban PEP420; Enforce __init__.py.
  	"PIE", # flake8-pie  ## Misc Opinionated Checks
  	"T20", # flake8-print  ## Ban print()
  	"RSE", # flake8-raise  ## Check Niche Exception Raising Pattern
  	"RET", # flake8-return  ## Enforce Good Returning
  	"ARG", # flake8-unused-arguments  ## Ban Unused Arguments
  	
  	# Specific 
  	"PT", # flake8-pytest-style  ## pytest-Specific Checks
  ]
  ignore = [
  	"COM812",  # Conflicts w/Formatter
  	"ISC001",  # Conflicts w/Formatter
  	"Q000",  # Conflicts w/Formatter
  	"Q001",  # Conflicts w/Formatter
  	"Q002",  # Conflicts w/Formatter
  	"Q003",  # Conflicts w/Formatter
  	"D206", # Conflicts w/Formatter
  	"E701", # class foo(Parent): pass or if simple: return are perfectly elegant
  	"ERA001", # 'Commented-out code' seems to be just about anything to ruff
  	"RUF001", # We use a lot of unicode, yes, on purpose!
  
  	# Line Length - Controversy Incoming
  	## Hot Take: Let the Formatter Worry about Line Length
  	## - Yes dear reader, I'm with you. Soft wrap can go too far.
  	## - ...but also, sometimes there are real good reasons not to split.
  	## - Ex. I think 'one sentence per line' docstrings are a valid thing.
  	## - Overlong lines tend to be be a code smell anyway
  	## - We'll see if my hot takes survive the week :)
  	"E501",  # Let Formatter Worry about Line Length
  ]
  
  ####################
  # - Tooling: Ruff Sublinters
  ####################
  [tool.ruff.lint.flake8-bugbear]
  extend-immutable-calls = []
  
  [tool.ruff.lint.pycodestyle]
  max-doc-length = 88
  ignore-overlong-task-comments = true
  
  [tool.ruff.lint.pydocstyle]
  convention = "google"
  
  [tool.ruff.lint.pylint]
  max-args = 6
  
  ####################
  # - Tooling: Ruff Formatter
  ####################
  [tool.ruff.format]
  preview = true
  quote-style = "single"
  indent-style = "tab"
  docstring-code-format = false
  
  
  ####################
  # - Tool: basedpyright
  ####################
  [tool.basedpyright]
  defineConstant = { DEBUG = true }
  
  include = ["bpy_jupyter"]
  
  reportMissingImports = "error"
  reportMissingTypeStubs = true
  
  reportAny = false  ## fake-bpy-module is not friends with this.
  reportUnknownMemberType = false  ## Nor with this!
  
  executionEnvironments = [
    { root = ".", pythonVersion = "3.11", extraPaths = [ ".venv/lib/python3.11/site-packages" ] },
  ]
  
  ####################
  # - Tooling: pytest
  ####################
  [tool.pytest.ini_options]
  testpaths = ["tests"]
  
  
  ####################
  # - Tooling: Commits
  ####################
  [tool.commitizen]
  name = "cz_gitmoji"
  version_scheme = "semver2"
  version_provider = "uv"
  tag_format = "v$version"
  
  # Files
  changelog_file = "CHANGELOG.md"
  
  # Version Bumping
  retry_after_failure = true
  major_version_zero = true
  update_changelog_on_bump = true
  
  # Annotations / Signature
  gpg_sign = true
  annotated_tag = true
  