Skip to content

Commit f0aadf9

Browse files
authored
Use ruff as linter and formatter (#2765)
* Switch from black to ruff format * Sort dependencies with ruff check * Run ruff format
1 parent 69ed6d4 commit f0aadf9

File tree

83 files changed

+206
-427
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+206
-427
lines changed

.github/workflows/core_code_checks.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ jobs:
3232
- name: Check notebook cell metadata
3333
run: |
3434
python ./nerfstudio/scripts/docs/add_nb_tags.py --check
35-
- name: Run Ruff
36-
run: ruff docs/ nerfstudio/ tests/
37-
- name: Run Black
38-
run: black docs/ nerfstudio/ tests/ --check
35+
- name: Run Ruff Linter
36+
run: ruff check docs/ nerfstudio/ tests/
37+
- name: Run Ruff Formatter
38+
run: ruff format docs/ nerfstudio/ tests/ --check
3939
- name: Run Pyright
4040
run: |
4141
pyright

.pre-commit-config.yaml

+6-7
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,15 @@ repos:
1212
files: '.*'
1313
pass_filenames: false
1414
- repo: https://github.com/pre-commit/pre-commit-hooks
15-
rev: v3.2.0
15+
rev: v4.5.0
1616
hooks:
1717
- id: trailing-whitespace
1818
- id: end-of-file-fixer
1919
- repo: https://github.com/charliermarsh/ruff-pre-commit
20-
# Ruff version.
21-
rev: 'v0.0.267'
20+
rev: v0.1.13
2221
hooks:
2322
- id: ruff
24-
- repo: https://github.com/psf/black
25-
rev: '23.3.0'
26-
hooks:
27-
- id: black
23+
types_or: [ python, pyi, jupyter ]
24+
args: [ --fix ]
25+
- id: ruff-format
26+
types_or: [ python, pyi, jupyter ]

.vscode/settings.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@
2424
"typescript.suggestionActions.enabled": false,
2525
"javascript.suggestionActions.enabled": false,
2626
"[python]": {
27-
"editor.defaultFormatter": "ms-python.black-formatter",
27+
"editor.defaultFormatter": "charliermarsh.ruff",
2828
"editor.codeActionsOnSave": {
29-
"source.organizeImports": true,
30-
"source.fixAll": true
29+
"source.organizeImports": "explicit",
30+
"source.fixAll": "explicit"
3131
}
3232
},
3333
"editor.formatOnSave": true,
34+
"editor.rulers": [120],
3435
"python.envFile": "${workspaceFolder}/.env",
3536
"python.formatting.provider": "none",
36-
"black-formatter.args": ["--line-length=120"],
3737
"python.linting.pylintEnabled": false,
3838
"python.linting.flake8Enabled": false,
3939
"python.linting.enabled": true,

docs/reference/contributing.md

+8-9
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,14 @@ In addition to code contributions, we also encourage contributors to add their o
1414

1515
Below are the various tooling features our team uses to maintain this codebase.
1616

17-
| Tooling | Support |
18-
| --------------- | ---------------------------------------------------------- |
19-
| Formatting | [Black](https://black.readthedocs.io/en/stable/) |
20-
| Linter | [Ruff](https://beta.ruff.rs/docs/) |
21-
| Type checking | [Pyright](https://github.com/microsoft/pyright) |
22-
| Testing | [pytest](https://docs.pytest.org/en/7.1.x/) |
23-
| Docs | [Sphinx](https://www.sphinx-doc.org/en/master/) |
24-
| Docstring style | [Google](https://google.github.io/styleguide/pyguide.html) |
25-
| JS Linting | [eslint](https://eslint.org/) |
17+
| Tooling | Support |
18+
| -------------------- | ---------------------------------------------------------- |
19+
| Formatting & Linting | [Ruff](https://beta.ruff.rs/docs/) |
20+
| Type checking | [Pyright](https://github.com/microsoft/pyright) |
21+
| Testing | [pytest](https://docs.pytest.org/en/7.1.x/) |
22+
| Docs | [Sphinx](https://www.sphinx-doc.org/en/master/) |
23+
| Docstring style | [Google](https://google.github.io/styleguide/pyguide.html) |
24+
| JS Linting | [eslint](https://eslint.org/) |
2625

2726
## Requirements
2827

nerfstudio/cameras/camera_optimizers.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@
2727
from torch import Tensor, nn
2828
from typing_extensions import assert_never
2929

30+
from nerfstudio.cameras.cameras import Cameras
3031
from nerfstudio.cameras.lie_groups import exp_map_SE3, exp_map_SO3xR3
3132
from nerfstudio.cameras.rays import RayBundle
3233
from nerfstudio.configs.base_config import InstantiateConfig
33-
from nerfstudio.utils import poses as pose_utils
3434
from nerfstudio.engine.optimizers import OptimizerConfig
3535
from nerfstudio.engine.schedulers import SchedulerConfig
36-
from nerfstudio.cameras.cameras import Cameras
36+
from nerfstudio.utils import poses as pose_utils
3737

3838

3939
@dataclass
@@ -60,6 +60,7 @@ class CameraOptimizerConfig(InstantiateConfig):
6060
def __post_init__(self):
6161
if self.optimizer is not None:
6262
import warnings
63+
6364
from nerfstudio.utils.rich_utils import CONSOLE
6465

6566
CONSOLE.print(
@@ -70,6 +71,7 @@ def __post_init__(self):
7071

7172
if self.scheduler is not None:
7273
import warnings
74+
7375
from nerfstudio.utils.rich_utils import CONSOLE
7476

7577
CONSOLE.print(

nerfstudio/cameras/camera_utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ def _compute_residual_and_jacobian(
346346
xd: torch.Tensor,
347347
yd: torch.Tensor,
348348
distortion_params: torch.Tensor,
349-
) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor,]:
349+
) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
350350
"""Auxiliary function of radial_and_tangential_undistort() that computes residuals and jacobians.
351351
Adapted from MultiNeRF:
352352
https://github.com/google-research/multinerf/blob/b02228160d3179300c7d499dca28cb9ca3677f32/internal/camera_utils.py#L427-L474

nerfstudio/cameras/cameras.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ def _generate_rays_from_coords(
670670
assert c2w.shape == num_rays_shape + (3, 4)
671671

672672
def _compute_rays_for_omnidirectional_stereo(
673-
eye: Literal["left", "right"]
673+
eye: Literal["left", "right"],
674674
) -> Tuple[Float[Tensor, "num_rays_shape 3"], Float[Tensor, "3 num_rays_shape 3"]]:
675675
"""Compute the rays for an omnidirectional stereo camera
676676
@@ -727,7 +727,7 @@ def _compute_rays_for_omnidirectional_stereo(
727727
return ods_origins_circle, directions_stack
728728

729729
def _compute_rays_for_vr180(
730-
eye: Literal["left", "right"]
730+
eye: Literal["left", "right"],
731731
) -> Tuple[Float[Tensor, "num_rays_shape 3"], Float[Tensor, "3 num_rays_shape 3"]]:
732732
"""Compute the rays for a VR180 camera
733733

nerfstudio/configs/dataparser_configs.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
from nerfstudio.data.dataparsers.nuscenes_dataparser import NuScenesDataParserConfig
3434
from nerfstudio.data.dataparsers.phototourism_dataparser import PhototourismDataParserConfig
3535
from nerfstudio.data.dataparsers.scannet_dataparser import ScanNetDataParserConfig
36+
from nerfstudio.data.dataparsers.scannetpp_dataparser import ScanNetppDataParserConfig
3637
from nerfstudio.data.dataparsers.sdfstudio_dataparser import SDFStudioDataParserConfig
3738
from nerfstudio.data.dataparsers.sitcoms3d_dataparser import Sitcoms3DDataParserConfig
38-
from nerfstudio.data.dataparsers.scannetpp_dataparser import ScanNetppDataParserConfig
3939
from nerfstudio.plugins.registry_dataparser import discover_dataparsers
4040

4141
dataparsers = {

nerfstudio/configs/method_configs.py

+6-15
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,16 @@
2626
from nerfstudio.cameras.camera_optimizers import CameraOptimizerConfig
2727
from nerfstudio.configs.base_config import ViewerConfig
2828
from nerfstudio.configs.external_methods import get_external_methods
29-
from nerfstudio.data.datamanagers.base_datamanager import (
30-
VanillaDataManager,
31-
VanillaDataManagerConfig,
32-
)
29+
from nerfstudio.data.datamanagers.base_datamanager import VanillaDataManager, VanillaDataManagerConfig
30+
from nerfstudio.data.datamanagers.full_images_datamanager import FullImageDatamanagerConfig
3331
from nerfstudio.data.datamanagers.parallel_datamanager import ParallelDataManagerConfig
34-
from nerfstudio.data.datamanagers.random_cameras_datamanager import (
35-
RandomCamerasDataManagerConfig,
36-
)
32+
from nerfstudio.data.datamanagers.random_cameras_datamanager import RandomCamerasDataManagerConfig
3733
from nerfstudio.data.dataparsers.blender_dataparser import BlenderDataParserConfig
34+
from nerfstudio.data.dataparsers.colmap_dataparser import ColmapDataParserConfig
3835
from nerfstudio.data.dataparsers.dnerf_dataparser import DNeRFDataParserConfig
39-
from nerfstudio.data.dataparsers.instant_ngp_dataparser import (
40-
InstantNGPDataParserConfig,
41-
)
36+
from nerfstudio.data.dataparsers.instant_ngp_dataparser import InstantNGPDataParserConfig
4237
from nerfstudio.data.dataparsers.nerfstudio_dataparser import NerfstudioDataParserConfig
43-
from nerfstudio.data.dataparsers.phototourism_dataparser import (
44-
PhototourismDataParserConfig,
45-
)
38+
from nerfstudio.data.dataparsers.phototourism_dataparser import PhototourismDataParserConfig
4639
from nerfstudio.data.dataparsers.sdfstudio_dataparser import SDFStudioDataParserConfig
4740
from nerfstudio.data.dataparsers.sitcoms3d_dataparser import Sitcoms3DDataParserConfig
4841
from nerfstudio.data.datasets.depth_dataset import DepthDataset
@@ -62,7 +55,6 @@
6255
from nerfstudio.models.gaussian_splatting import GaussianSplattingModelConfig
6356
from nerfstudio.models.generfacto import GenerfactoModelConfig
6457
from nerfstudio.models.instant_ngp import InstantNGPModelConfig
65-
from nerfstudio.data.dataparsers.colmap_dataparser import ColmapDataParserConfig
6658
from nerfstudio.models.mipnerf import MipNerfModel
6759
from nerfstudio.models.nerfacto import NerfactoModelConfig
6860
from nerfstudio.models.neus import NeuSModelConfig
@@ -71,7 +63,6 @@
7163
from nerfstudio.models.tensorf import TensoRFModelConfig
7264
from nerfstudio.models.vanilla_nerf import NeRFModel, VanillaModelConfig
7365
from nerfstudio.pipelines.base_pipeline import VanillaPipelineConfig
74-
from nerfstudio.data.datamanagers.full_images_datamanager import FullImageDatamanagerConfig
7566
from nerfstudio.pipelines.dynamic_batch import DynamicBatchPipelineConfig
7667
from nerfstudio.plugins.registry import discover_methods
7768

nerfstudio/data/datamanagers/base_datamanager.py

+2-10
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,8 @@
5454
from nerfstudio.data.dataparsers.base_dataparser import DataparserOutputs
5555
from nerfstudio.data.dataparsers.blender_dataparser import BlenderDataParserConfig
5656
from nerfstudio.data.datasets.base_dataset import InputDataset
57-
from nerfstudio.data.pixel_samplers import (
58-
PatchPixelSamplerConfig,
59-
PixelSampler,
60-
PixelSamplerConfig,
61-
)
62-
from nerfstudio.data.utils.dataloaders import (
63-
CacheDataloader,
64-
FixedIndicesEvalDataloader,
65-
RandIndicesEvalDataloader,
66-
)
57+
from nerfstudio.data.pixel_samplers import PatchPixelSamplerConfig, PixelSampler, PixelSamplerConfig
58+
from nerfstudio.data.utils.dataloaders import CacheDataloader, FixedIndicesEvalDataloader, RandIndicesEvalDataloader
6759
from nerfstudio.data.utils.nerfstudio_collate import nerfstudio_collate
6860
from nerfstudio.engine.callbacks import TrainingCallback, TrainingCallbackAttributes
6961
from nerfstudio.model_components.ray_generators import RayGenerator

nerfstudio/data/datamanagers/random_cameras_datamanager.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424

2525
import torch
2626
from rich.progress import Console
27-
from torch.nn import Parameter
2827
from torch import Tensor
28+
from torch.nn import Parameter
2929
from typing_extensions import Literal
3030

3131
from nerfstudio.cameras.cameras import Cameras

nerfstudio/data/dataparsers/arkitscenes_dataparser.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,7 @@
2424

2525
from nerfstudio.cameras import camera_utils
2626
from nerfstudio.cameras.cameras import Cameras, CameraType
27-
from nerfstudio.data.dataparsers.base_dataparser import (
28-
DataParser,
29-
DataParserConfig,
30-
DataparserOutputs,
31-
)
27+
from nerfstudio.data.dataparsers.base_dataparser import DataParser, DataParserConfig, DataparserOutputs
3228
from nerfstudio.data.scene_box import SceneBox
3329

3430

nerfstudio/data/dataparsers/blender_dataparser.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,7 @@
2424
import torch
2525

2626
from nerfstudio.cameras.cameras import Cameras, CameraType
27-
from nerfstudio.data.dataparsers.base_dataparser import (
28-
DataParser,
29-
DataParserConfig,
30-
DataparserOutputs,
31-
)
27+
from nerfstudio.data.dataparsers.base_dataparser import DataParser, DataParserConfig, DataparserOutputs
3228
from nerfstudio.data.scene_box import SceneBox
3329
from nerfstudio.utils.colors import get_color
3430
from nerfstudio.utils.io import load_from_json

nerfstudio/data/dataparsers/colmap_dataparser.py

+8-12
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
import sys
1919
from dataclasses import dataclass, field
20-
from pathlib import Path
2120
from functools import partial
21+
from pathlib import Path
2222
from typing import List, Literal, Optional, Type
2323

2424
import numpy as np
@@ -31,15 +31,15 @@
3131
from nerfstudio.data.dataparsers.base_dataparser import DataParser, DataParserConfig, DataparserOutputs
3232
from nerfstudio.data.scene_box import SceneBox
3333
from nerfstudio.data.utils import colmap_parsing_utils as colmap_utils
34-
from nerfstudio.process_data.colmap_utils import parse_colmap_camera_params
35-
from nerfstudio.utils.scripts import run_command
36-
from nerfstudio.utils.rich_utils import CONSOLE, status
3734
from nerfstudio.data.utils.dataparsers_utils import (
35+
get_train_eval_split_all,
3836
get_train_eval_split_filename,
3937
get_train_eval_split_fraction,
4038
get_train_eval_split_interval,
41-
get_train_eval_split_all,
4239
)
40+
from nerfstudio.process_data.colmap_utils import parse_colmap_camera_params
41+
from nerfstudio.utils.rich_utils import CONSOLE, status
42+
from nerfstudio.utils.scripts import run_command
4343

4444
MAX_AUTO_RESOLUTION = 1600
4545

@@ -66,7 +66,7 @@ class ColmapDataParserConfig(DataParserConfig):
6666
"""Whether to automatically scale the poses to fit in +/- 1 bounding box."""
6767
eval_mode: Literal["fraction", "filename", "interval", "all"] = "interval"
6868
"""
69-
The method to use for splitting the dataset into train and eval.
69+
The method to use for splitting the dataset into train and eval.
7070
Fraction splits based on a percentage for train and the remaining for eval.
7171
Filename splits based on filenames containing train/eval.
7272
Interval uses every nth frame for eval (used by most academic papers, e.g. MipNerf360, GSplat).
@@ -284,15 +284,11 @@ def _generate_dataparser_outputs(self, split: str = "train", **kwargs):
284284
if "depth_path" in frame:
285285
depth_filenames.append(Path(frame["depth_path"]))
286286

287-
assert len(mask_filenames) == 0 or (
288-
len(mask_filenames) == len(image_filenames)
289-
), """
287+
assert len(mask_filenames) == 0 or (len(mask_filenames) == len(image_filenames)), """
290288
Different number of image and mask filenames.
291289
You should check that mask_path is specified for every frame (or zero frames) in transforms.json.
292290
"""
293-
assert len(depth_filenames) == 0 or (
294-
len(depth_filenames) == len(image_filenames)
295-
), """
291+
assert len(depth_filenames) == 0 or (len(depth_filenames) == len(image_filenames)), """
296292
Different number of image and depth filenames.
297293
You should check that depth_file_path is specified for every frame (or zero frames) in transforms.json.
298294
"""

nerfstudio/data/dataparsers/dnerf_dataparser.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,7 @@
2424
import torch
2525

2626
from nerfstudio.cameras.cameras import Cameras, CameraType
27-
from nerfstudio.data.dataparsers.base_dataparser import (
28-
DataParser,
29-
DataParserConfig,
30-
DataparserOutputs,
31-
)
27+
from nerfstudio.data.dataparsers.base_dataparser import DataParser, DataParserConfig, DataparserOutputs
3228
from nerfstudio.data.scene_box import SceneBox
3329
from nerfstudio.utils.colors import get_color
3430
from nerfstudio.utils.io import load_from_json

nerfstudio/data/dataparsers/dycheck_dataparser.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,7 @@
2525
import torch
2626

2727
from nerfstudio.cameras.cameras import Cameras, CameraType
28-
from nerfstudio.data.dataparsers.base_dataparser import (
29-
DataParser,
30-
DataParserConfig,
31-
DataparserOutputs,
32-
)
28+
from nerfstudio.data.dataparsers.base_dataparser import DataParser, DataParserConfig, DataparserOutputs
3329
from nerfstudio.data.scene_box import SceneBox
3430
from nerfstudio.utils.colors import get_color
3531
from nerfstudio.utils.io import load_from_json

nerfstudio/data/dataparsers/instant_ngp_dataparser.py

+4-10
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,21 @@
1818

1919
from dataclasses import dataclass, field
2020
from pathlib import Path
21-
from typing import Dict, Tuple, Type, Literal
21+
from typing import Dict, Literal, Tuple, Type
2222

2323
import imageio
2424
import numpy as np
2525
import torch
2626

2727
from nerfstudio.cameras import camera_utils
2828
from nerfstudio.cameras.cameras import Cameras, CameraType
29-
from nerfstudio.data.dataparsers.base_dataparser import (
30-
DataParser,
31-
DataParserConfig,
32-
DataparserOutputs,
33-
)
29+
from nerfstudio.data.dataparsers.base_dataparser import DataParser, DataParserConfig, DataparserOutputs
3430
from nerfstudio.data.scene_box import SceneBox
3531
from nerfstudio.data.utils.dataparsers_utils import (
32+
get_train_eval_split_all,
3633
get_train_eval_split_filename,
3734
get_train_eval_split_fraction,
3835
get_train_eval_split_interval,
39-
get_train_eval_split_all,
4036
)
4137
from nerfstudio.utils.io import load_from_json
4238
from nerfstudio.utils.rich_utils import CONSOLE
@@ -109,9 +105,7 @@ def _generate_dataparser_outputs(self, split="train"):
109105
mask_filenames.append(mask_fname)
110106
if num_skipped_image_filenames >= 0:
111107
CONSOLE.print(f"Skipping {num_skipped_image_filenames} files in dataset split {split}.")
112-
assert (
113-
len(image_filenames) != 0
114-
), """
108+
assert len(image_filenames) != 0, """
115109
No image files found.
116110
You should check the file_paths in the transforms.json file to make sure they are correct.
117111
"""

nerfstudio/data/dataparsers/minimal_dataparser.py

+1-6
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,7 @@
2424
import torch
2525

2626
from nerfstudio.cameras.cameras import Cameras
27-
from nerfstudio.data.dataparsers.base_dataparser import (
28-
DataParser,
29-
DataParserConfig,
30-
DataparserOutputs,
31-
Semantics,
32-
)
27+
from nerfstudio.data.dataparsers.base_dataparser import DataParser, DataParserConfig, DataparserOutputs, Semantics
3328
from nerfstudio.data.scene_box import SceneBox
3429

3530

0 commit comments

Comments
 (0)