[project] name = "oscillode" version = "0.2.0" description = "Real-time design and visualization of Maxwell simulations in Blender 3D, with deep Tidy3D integration. " authors = [ { name = "Sofus Albert Høgsbro Rose", email = "oscillode@sofusrose.com" } ] maintainers = [ { name = "Sofus Albert Høgsbro Rose", email = "oscillode@sofusrose.com" } ] dependencies = [ "tidy3d==2.7.*", "pydantic==2.9.*", "sympy==1.13.*", "scipy==1.14.*", "trimesh==4.4.*", "networkx==3.3.*", "rich>=13.8.*", "rtree==1.3.*", "jax[cpu]==0.4.33", "msgspec[toml]==0.18.*", "numba==0.60.*", "jaxtyping==0.2.*", "polars==1.8.*", "seaborn[stats]>=0.13.*", "frozendict>=2.4.*", "pydantic-tensor>=0.2", ] readme = "README.md" requires-python = "~= 3.11" license = { text = "AGPL-3.0-or-later" } [project.urls] Homepage = "https://oscillode.io" #################### # - Blender Extension #################### [tool.bl_ext] pretty_name = "Oscillode" blender_version_min = '4.2.0' blender_version_max = '4.2.2' permissions = ["files", "network"] bl_tags = ["Node", "Scene", "Import-Export"] copyright = ["2024 Oscillode Contributors"] # Platform Support ## Map Valid Blender Platforms -> Required PyPi Platform Tags ## Include as few PyPi tags as works on ~everything. [tool.bl_ext.platforms] #windows-amd64 = ['win_amd64'] #macos-arm64 = ['macosx_11_0_arm64', 'macosx_12_0_arm64', 'macosx_14_0_arm64'] linux-x86_64 = ['manylinux1_x86_64', 'manylinux2014_x86_64', 'manylinux_2_17_x86_64'] #macos-x86_64 = ['macosx_10_10_x86_64'] ##TODO: Broken # Packaging ## Path is from the directory containing this file. [tool.bl_ext.packaging] path_builds = 'dev/build' path_wheels = 'dev/wheels' path_local = 'dev/local' init_settings_filename = 'init_settings.toml' # "Profiles" -> Affects Initialization Settings ## This sets the default extension preferences for different situations. [tool.bl_ext.profiles.dev] use_path_local = true use_log_file = true log_file_path = 'oscillode.log' log_file_level = 'debug' use_log_console = true log_console_level = 'info' [tool.bl_ext.profiles.release] use_path_local = false use_log_file = true log_file_path = 'oscillode.log' log_file_level = 'info' use_log_console = true log_console_level = 'warning' [tool.bl_ext.profiles.release-debug] use_path_local = false use_log_file = true log_file_path = 'oscillode.log' log_file_level = 'debug' use_log_console = true log_console_level = 'warning' #################### # - Tooling: Rye #################### [tool.uv] managed = true dev-dependencies = [ "ruff>=0.6.8", "pre-commit>=3.7.0", "commitizen>=3.25.0", "fake-bpy-module==20240927", "pip>=24.2", ## Requires charset-normalizer>=2.1.0 # Required by Commitizen ## -> It's okay to have different dev/prod versions in our use case. #"charset-normalizer==2.1.*", ## Manually scanned CHANGELOG; seems compatible. ] package = false #################### # - 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 "B008", # FastAPI uses this for Depends(), Security(), etc. . "E701", # class foo(Parent): pass or if simple: return are perfectly elegant "ERA001", # 'Commented-out code' seems to be just about anything to ruff "F722", # jaxtyping uses type annotations that ruff sees as "syntax error" "N806", # Sometimes we like using types w/uppercase in functions, sue me "RUF001", # We use a lot of unicode, yes, on purpose! #"RUF012", # ruff misunderstands which ClassVars are actually mutable. # 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 = 120 ignore-overlong-task-comments = true [tool.ruff.lint.pydocstyle] convention = "google" [tool.ruff.lint.pylint] max-args = 6 #################### # - Tooling: Ruff Formatter #################### [tool.ruff.format] quote-style = "single" indent-style = "tab" docstring-code-format = false #################### # - Tooling: MyPy #################### [tool.mypy] python_version = '3.11' ignore_missing_imports = true strict_optional = true disallow_subclassing_any = false disallow_any_generics = true disallow_untyped_calls = true disallow_incomplete_defs = true check_untyped_defs = true disallow_untyped_decorators = true no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true warn_return_any = true #################### # - Tooling: Commits #################### [tool.commitizen] # Specification name = "cz_conventional_commits" version_scheme = "semver2" version_provider = "pep621" tag_format = "v$version" # Version Bumping retry_after_failure = true major_version_zero = true update_changelog_on_bump = true # Annotations / Signature gpg_sign = true annotated_tag = true