From 57ab4c740272fa3002456d369890f6fe44093b94 Mon Sep 17 00:00:00 2001 From: Callum Forrester Date: Fri, 9 Aug 2024 13:36:26 +0100 Subject: [PATCH 1/3] Update copier template to 2.2.0 --- .copier-answers.yml | 2 +- .devcontainer/devcontainer.json | 2 +- .github/CONTRIBUTING.md | 2 +- .github/pages/index.html | 2 +- .github/workflows/_docs.yml | 4 ++-- .github/workflows/_release.yml | 2 +- .pre-commit-config.yaml | 1 + .vscode/extensions.json | 2 +- .vscode/settings.json | 3 ++- docs/images/dls-logo.svg | 20 ++++++++++---------- pyproject.toml | 28 ++++++++++++++++------------ 11 files changed, 37 insertions(+), 31 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 551aabe775..3cfac89673 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: 2.1.0 +_commit: 2.2.0 _src_path: gh:DiamondLightSource/python-copier-template author_email: dominic.oram@diamond.ac.uk author_name: Dominic Oram diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 79b85ff41a..d3d639a502 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -43,4 +43,4 @@ "workspaceMount": "source=${localWorkspaceFolder}/..,target=/workspaces,type=bind", // After the container is created, install the python project in editable form "postCreateCommand": "pip install $([ -f dev-requirements.txt ] && echo '-c dev-requirements.txt') -e '.[dev]' && pre-commit install" -} \ No newline at end of file +} diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 0f26801edf..56a615f2ed 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -24,4 +24,4 @@ It is recommended that developers use a [vscode devcontainer](https://code.visua This project was created using the [Diamond Light Source Copier Template](https://github.com/DiamondLightSource/python-copier-template) for Python projects. -For more information on common tasks like setting up a developer environment, running the tests, and setting a pre-commit hook, see the template's [How-to guides](https://diamondlightsource.github.io/python-copier-template/2.1.0/how-to.html). +For more information on common tasks like setting up a developer environment, running the tests, and setting a pre-commit hook, see the template's [How-to guides](https://diamondlightsource.github.io/python-copier-template/2.2.0/how-to.html). diff --git a/.github/pages/index.html b/.github/pages/index.html index 80f0a00912..c495f39f2f 100644 --- a/.github/pages/index.html +++ b/.github/pages/index.html @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/.github/workflows/_docs.yml b/.github/workflows/_docs.yml index 40446e332b..a1cafcaedf 100644 --- a/.github/workflows/_docs.yml +++ b/.github/workflows/_docs.yml @@ -47,8 +47,8 @@ jobs: if: github.ref_type == 'tag' || github.ref_name == 'main' # We pin to the SHA, not the tag, for security reasons. # https://docs.github.com/en/actions/learn-github-actions/security-hardening-for-github-actions#using-third-party-actions - uses: peaceiris/actions-gh-pages@373f7f263a76c20808c831209c920827a82a2847 # v3.9.3 + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: .github/pages - keep_files: true \ No newline at end of file + keep_files: true diff --git a/.github/workflows/_release.yml b/.github/workflows/_release.yml index e55efdb37f..10d8ed87d1 100644 --- a/.github/workflows/_release.yml +++ b/.github/workflows/_release.yml @@ -23,7 +23,7 @@ jobs: - name: Create GitHub Release # We pin to the SHA, not the tag, for security reasons. # https://docs.github.com/en/actions/learn-github-actions/security-hardening-for-github-actions#using-third-party-actions - uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564 # v2.0.4 + uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # v2.0.8 with: prerelease: ${{ contains(github.ref_name, 'a') || contains(github.ref_name, 'b') || contains(github.ref_name, 'rc') }} files: "*" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5a4cbf7b41..60fc23f9a7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,6 +5,7 @@ repos: - id: check-added-large-files - id: check-yaml - id: check-merge-conflict + - id: end-of-file-fixer - repo: local hooks: diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 66ad6324d0..933c580cdb 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,4 +2,4 @@ "recommendations": [ "ms-vscode-remote.remote-containers", ] -} \ No newline at end of file +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 227a566656..c7ed69faf6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,6 +5,7 @@ "editor.codeActionsOnSave": { "source.organizeImports": "explicit" }, + "files.insertFinalNewline": true, "[python]": { "editor.defaultFormatter": "charliermarsh.ruff", "editor.rulers": [ @@ -19,4 +20,4 @@ "./src" ], "python.analysis.typeCheckingMode": "basic" -} \ No newline at end of file +} diff --git a/docs/images/dls-logo.svg b/docs/images/dls-logo.svg index 0af1a17707..4fcaa861d1 100644 --- a/docs/images/dls-logo.svg +++ b/docs/images/dls-logo.svg @@ -1,11 +1,11 @@ - - - - - - - - - - \ No newline at end of file + + + + + + + + + + diff --git a/pyproject.toml b/pyproject.toml index 7a59bd659f..c4d31959ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools>=64", "setuptools_scm[toml]>=6.2"] +requires = ["setuptools>=64", "setuptools_scm[toml]>=8"] build-backend = "setuptools.build_meta" [project] @@ -9,6 +9,7 @@ classifiers = [ "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", ] description = "Ophyd devices and other utils that could be used across DLS beamlines" dependencies = [ @@ -86,7 +87,7 @@ where = ["src"] dodal = ["*.txt"] [tool.setuptools_scm] -write_to = "src/dodal/_version.py" +version_file = "src/dodal/_version.py" [tool.pyright] reportMissingImports = false # Ignore missing stubs in imported modules @@ -157,15 +158,18 @@ lint.extend-ignore = [ "F811", # support typing.overload decorator ] lint.select = [ - "B", # flake8-bugbear - https://docs.astral.sh/ruff/rules/#flake8-bugbear-b - "C4", # flake8-comprehensions - https://beta.ruff.rs/docs/rules/#flake8-comprehensions-c4 - "E", # pycodestyle errors - https://beta.ruff.rs/docs/rules/#error-e - "F", # pyflakes rules - https://beta.ruff.rs/docs/rules/#pyflakes-f - "I", # isort - https://docs.astral.sh/ruff/rules/#isort-i - "W", # pycodestyle warnings - https://beta.ruff.rs/docs/rules/#warning-w - "UP", # pyupgrade - https://docs.astral.sh/ruff/rules/#pyupgrade-up - "I001", # isort + "B", # flake8-bugbear - https://docs.astral.sh/ruff/rules/#flake8-bugbear-b + "C4", # flake8-comprehensions - https://docs.astral.sh/ruff/rules/#flake8-comprehensions-c4 + "E", # pycodestyle errors - https://docs.astral.sh/ruff/rules/#error-e + "F", # pyflakes rules - https://docs.astral.sh/ruff/rules/#pyflakes-f + "W", # pycodestyle warnings - https://docs.astral.sh/ruff/rules/#warning-w + "I", # isort - https://docs.astral.sh/ruff/rules/#isort-i + "UP", # pyupgrade - https://docs.astral.sh/ruff/rules/#pyupgrade-up + "SLF", # self - https://docs.astral.sh/ruff/settings/#lintflake8-self ] -[tool.ruff.lint.flake8-bugbear] -extend-immutable-calls = ["dodal.common.coordination.inject"] +[tool.ruff.lint.per-file-ignores] +# By default, private member access is allowed in tests +# See https://github.com/DiamondLightSource/python-copier-template/issues/154 +# Remove this line to forbid private member access in tests +"tests/**/*" = ["SLF001"] From 0aa96b873a5f29b809fac7b19df841cf06c642c0 Mon Sep 17 00:00:00 2001 From: Callum Forrester Date: Fri, 9 Aug 2024 13:46:40 +0100 Subject: [PATCH 2/3] Fix pre-commit errors --- .vscode/tasks.json | 2 +- docs/_templates/autosummary/module.rst | 1 - docs/how-to/create-beamline.rst | 1 - docs/how-to/make-new-ophyd-async-device.rst | 2 +- docs/how-to/zocalo.rst | 2 +- docs/images/excalidraw-example.svg | 2 +- docs/reference/device-standards.rst | 2 +- docs/reference/standards.rst | 2 +- docs/tutorials/get_started.rst | 2 +- src/dodal/devices/aperturescatterguard.py | 4 ++-- src/dodal/devices/areadetector/adutils.py | 2 +- src/dodal/devices/oav/microns_for_zoom_levels.json | 2 +- tests/common/test_coordination.py | 2 +- tests/devices/unit_tests/test_OAVCentring.json | 2 +- .../unit_tests/test_aperture_scatterguard.py | 14 +++++++------- .../domain/beamlineParameters | 1 - .../lookup/BeamLineEnergy_DCM_Roll_converter.txt | 1 - tests/fake_zocalo/README.rst | 1 - .../test_data/test_beamline_dcm_roll_converter.txt | 2 +- tests/test_data/test_beamline_parameters.txt | 1 - tests/test_data/test_det_dist_converter.txt | 2 -- 21 files changed, 21 insertions(+), 29 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 1b21c0fb27..4ac17c12eb 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -21,4 +21,4 @@ "type": "shell" } ] -} \ No newline at end of file +} diff --git a/docs/_templates/autosummary/module.rst b/docs/_templates/autosummary/module.rst index 8330527f04..6799b19d5f 100644 --- a/docs/_templates/autosummary/module.rst +++ b/docs/_templates/autosummary/module.rst @@ -64,4 +64,3 @@ {%- endfor %} {% endif %} {% endblock %} - diff --git a/docs/how-to/create-beamline.rst b/docs/how-to/create-beamline.rst index 8c62e641ac..0832f25177 100644 --- a/docs/how-to/create-beamline.rst +++ b/docs/how-to/create-beamline.rst @@ -79,4 +79,3 @@ The following example creates a fictitious beamline ``w41``, with a simulated tw This test checks that the function returns a type that conforms to Bluesky protocols, that it always returns the same instance of the device and that the arguments passed into the Device class constructor are valid. - diff --git a/docs/how-to/make-new-ophyd-async-device.rst b/docs/how-to/make-new-ophyd-async-device.rst index a3bcb6287d..95e26a65d4 100644 --- a/docs/how-to/make-new-ophyd-async-device.rst +++ b/docs/how-to/make-new-ophyd-async-device.rst @@ -64,4 +64,4 @@ Additional Notes - ``with self.add_children_as_readables():`` Ensure this context manager is used appropriately in the device implementation to add child components as readable properties, but not Movables. -.. _ophyd-async: https://blueskyproject.io/ophyd-async/main/how-to/choose-interfaces-for-devices.html \ No newline at end of file +.. _ophyd-async: https://blueskyproject.io/ophyd-async/main/how-to/choose-interfaces-for-devices.html diff --git a/docs/how-to/zocalo.rst b/docs/how-to/zocalo.rst index c9cab27e69..489c9b3d8b 100644 --- a/docs/how-to/zocalo.rst +++ b/docs/how-to/zocalo.rst @@ -10,4 +10,4 @@ processing from data in ISPyB. Results are received using the ``ZocaloResults`` device, so that they can be read into a plan and used for decision-making. Currently the ``ZocaloResults`` device is only made to handle X-ray centring results. It subscribes to -a given zocalo RabbitMQ channel the first time that it is triggered. \ No newline at end of file +a given zocalo RabbitMQ channel the first time that it is triggered. diff --git a/docs/images/excalidraw-example.svg b/docs/images/excalidraw-example.svg index 9f8b3fd963..a4e980a5de 100644 --- a/docs/images/excalidraw-example.svg +++ b/docs/images/excalidraw-example.svg @@ -13,4 +13,4 @@ } - ThisThat \ No newline at end of file + ThisThat diff --git a/docs/reference/device-standards.rst b/docs/reference/device-standards.rst index e27bbd7fc4..3ed95d3723 100644 --- a/docs/reference/device-standards.rst +++ b/docs/reference/device-standards.rst @@ -98,4 +98,4 @@ Ophyd Devices best practices Ophyd-async directory contains a flowchart_ for a simplified decision tree about what interfaces should a given device implement. -.. _flowchart: https://blueskyproject.io/ophyd-async/main/how-to/choose-interfaces-for-devices.html \ No newline at end of file +.. _flowchart: https://blueskyproject.io/ophyd-async/main/how-to/choose-interfaces-for-devices.html diff --git a/docs/reference/standards.rst b/docs/reference/standards.rst index 5afa997e54..8fb9c43320 100644 --- a/docs/reference/standards.rst +++ b/docs/reference/standards.rst @@ -74,4 +74,4 @@ Docs follow the underlining convention:: .. seealso:: - How-to guide `../how-to/build-docs` \ No newline at end of file + How-to guide `../how-to/build-docs` diff --git a/docs/tutorials/get_started.rst b/docs/tutorials/get_started.rst index eac48ebaab..e8c69fa434 100644 --- a/docs/tutorials/get_started.rst +++ b/docs/tutorials/get_started.rst @@ -49,4 +49,4 @@ If you would like to only log to graylog/file exlusively there are helper functi .. _ophyd: https://nsls-ii.github.io/ophyd/ .. _bluesky: https://blueskyproject.io/bluesky/ -.. _graylog: https://graylog-log-target.diamond.ac.uk/search \ No newline at end of file +.. _graylog: https://graylog-log-target.diamond.ac.uk/search diff --git a/src/dodal/devices/aperturescatterguard.py b/src/dodal/devices/aperturescatterguard.py index 7b5aabfc2b..88a7f68e14 100644 --- a/src/dodal/devices/aperturescatterguard.py +++ b/src/dodal/devices/aperturescatterguard.py @@ -174,7 +174,7 @@ class SelectedAperture(SignalR): async def read(self, *args, **kwargs): assert isinstance(self.parent, ApertureScatterguard) assert self._backend - await self._backend.put(await self.parent._get_current_aperture_position()) + await self._backend.put(await self.parent.get_current_aperture_position()) return {self.name: await self._backend.get_reading()} async def describe(self) -> dict[str, DataKey]: @@ -224,7 +224,7 @@ async def _set_raw_unsafe(self, positions: ApertureFiveDimensionalLocation): self.scatterguard.y.set(scatterguard_y), ) - async def _get_current_aperture_position(self) -> SingleAperturePosition: + async def get_current_aperture_position(self) -> SingleAperturePosition: """ Returns the current aperture position using readback values for SMALL, MEDIUM, LARGE. ROBOT_LOAD position defined when diff --git a/src/dodal/devices/areadetector/adutils.py b/src/dodal/devices/areadetector/adutils.py index db68549603..c0ca8a0b22 100644 --- a/src/dodal/devices/areadetector/adutils.py +++ b/src/dodal/devices/areadetector/adutils.py @@ -31,7 +31,7 @@ def trigger(self): def _acq_done(*args, **kwargs): # TODO sort out if anything useful in here - self._status._finished() + self._status._finished() # noqa: SLF001 self._acquisition_signal.put(1, use_complete=True, callback=_acq_done) # Ensure that this mixin is part of valid Detector with generate_datum diff --git a/src/dodal/devices/oav/microns_for_zoom_levels.json b/src/dodal/devices/oav/microns_for_zoom_levels.json index dd01f5ac9f..3c10524881 100644 --- a/src/dodal/devices/oav/microns_for_zoom_levels.json +++ b/src/dodal/devices/oav/microns_for_zoom_levels.json @@ -52,4 +52,4 @@ "micronsPerXPixel": 0.227, "micronsPerYPixel": 0.314 } -} \ No newline at end of file +} diff --git a/tests/common/test_coordination.py b/tests/common/test_coordination.py index e42bacf652..67d8ed0771 100644 --- a/tests/common/test_coordination.py +++ b/tests/common/test_coordination.py @@ -16,7 +16,7 @@ def test_group_uid(group: str): def test_type_checking_ignores_inject(): - def example_function(x: Movable = inject("foo")) -> MsgGenerator: + def example_function(x: Movable = inject("foo")) -> MsgGenerator: # noqa: B008 yield from {} # These asserts are sanity checks diff --git a/tests/devices/unit_tests/test_OAVCentring.json b/tests/devices/unit_tests/test_OAVCentring.json index 2c2febac41..d4002b0eff 100644 --- a/tests/devices/unit_tests/test_OAVCentring.json +++ b/tests/devices/unit_tests/test_OAVCentring.json @@ -67,4 +67,4 @@ "CannyEdgeLowerThreshold": 5.0, "brightness": 90 } -} \ No newline at end of file +} diff --git a/tests/devices/unit_tests/test_aperture_scatterguard.py b/tests/devices/unit_tests/test_aperture_scatterguard.py index 29b4282963..2322ec3904 100644 --- a/tests/devices/unit_tests/test_aperture_scatterguard.py +++ b/tests/devices/unit_tests/test_aperture_scatterguard.py @@ -203,21 +203,21 @@ async def test_aperture_positions_large( ap_sg: ApertureScatterguard, aperture_positions: AperturePositions ): set_mock_value(ap_sg.aperture.large, 1) - assert await ap_sg._get_current_aperture_position() == aperture_positions.LARGE + assert await ap_sg.get_current_aperture_position() == aperture_positions.LARGE async def test_aperture_positions_medium( ap_sg: ApertureScatterguard, aperture_positions: AperturePositions ): set_mock_value(ap_sg.aperture.medium, 1) - assert await ap_sg._get_current_aperture_position() == aperture_positions.MEDIUM + assert await ap_sg.get_current_aperture_position() == aperture_positions.MEDIUM async def test_aperture_positions_small( ap_sg: ApertureScatterguard, aperture_positions: AperturePositions ): set_mock_value(ap_sg.aperture.small, 1) - assert await ap_sg._get_current_aperture_position() == aperture_positions.SMALL + assert await ap_sg.get_current_aperture_position() == aperture_positions.SMALL async def test_aperture_positions_robot_load( @@ -227,7 +227,7 @@ async def test_aperture_positions_robot_load( set_mock_value(ap_sg.aperture.medium, 0) set_mock_value(ap_sg.aperture.small, 0) await ap_sg.aperture.y.set(aperture_positions.ROBOT_LOAD.location.aperture_y) - assert await ap_sg._get_current_aperture_position() == aperture_positions.ROBOT_LOAD + assert await ap_sg.get_current_aperture_position() == aperture_positions.ROBOT_LOAD async def test_aperture_positions_robot_load_within_tolerance( @@ -239,7 +239,7 @@ async def test_aperture_positions_robot_load_within_tolerance( set_mock_value(ap_sg.aperture.medium, 0) set_mock_value(ap_sg.aperture.small, 0) await ap_sg.aperture.y.set(robot_load_ap_y + tolerance) - assert await ap_sg._get_current_aperture_position() == aperture_positions.ROBOT_LOAD + assert await ap_sg.get_current_aperture_position() == aperture_positions.ROBOT_LOAD async def test_aperture_positions_robot_load_outside_tolerance( @@ -252,7 +252,7 @@ async def test_aperture_positions_robot_load_outside_tolerance( set_mock_value(ap_sg.aperture.small, 0) await ap_sg.aperture.y.set(robot_load_ap_y + tolerance) with pytest.raises(InvalidApertureMove): - await ap_sg._get_current_aperture_position() + await ap_sg.get_current_aperture_position() async def test_aperture_positions_robot_load_unsafe( @@ -263,7 +263,7 @@ async def test_aperture_positions_robot_load_unsafe( set_mock_value(ap_sg.aperture.small, 0) await ap_sg.aperture.y.set(50.0) with pytest.raises(InvalidApertureMove): - await ap_sg._get_current_aperture_position() + await ap_sg.get_current_aperture_position() async def test_given_aperture_not_set_through_device_but_motors_in_position_when_device_read_then_position_returned( diff --git a/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters b/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters index df3951b8fc..0a783cd2f8 100644 --- a/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters +++ b/tests/devices/unit_tests/test_daq_configuration/domain/beamlineParameters @@ -137,4 +137,3 @@ attenuation_optimisation_multiplier = 2 attenuation_optimisation_target_count = 2000 attenuation_optimisation_upper_limit = 50000 attenuation_optimisation_lower_limit = 20000 - diff --git a/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt b/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt index 329f29f099..9b5b52dcb7 100644 --- a/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt +++ b/tests/devices/unit_tests/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt @@ -4,4 +4,3 @@ Units Deg mrad 26.4095 -0.2799 6.3075 -0.2799 - diff --git a/tests/fake_zocalo/README.rst b/tests/fake_zocalo/README.rst index 31fb61d53e..05a137c6f0 100644 --- a/tests/fake_zocalo/README.rst +++ b/tests/fake_zocalo/README.rst @@ -10,4 +10,3 @@ fake_zocalo * Run `dls_start_fake_zocalo.sh` * For Hyperion to connect to this you will need to run `module load dials/latest` in the terminal you're runnign Hyperion in - diff --git a/tests/test_data/test_beamline_dcm_roll_converter.txt b/tests/test_data/test_beamline_dcm_roll_converter.txt index fbbb784863..0368da30bb 100644 --- a/tests/test_data/test_beamline_dcm_roll_converter.txt +++ b/tests/test_data/test_beamline_dcm_roll_converter.txt @@ -7,4 +7,4 @@ Units Deg mrad 2.0 1.0 4.0 2.0 5.0 4.0 -5.5 8.0 \ No newline at end of file +5.5 8.0 diff --git a/tests/test_data/test_beamline_parameters.txt b/tests/test_data/test_beamline_parameters.txt index 20e7eca27f..5247b15d3f 100644 --- a/tests/test_data/test_beamline_parameters.txt +++ b/tests/test_data/test_beamline_parameters.txt @@ -296,4 +296,3 @@ attenuation_optimisation_multiplier = 2 attenuation_optimisation_target_count = 2000 attenuation_optimisation_upper_limit = 50000 attenuation_optimisation_lower_limit = 20000 - diff --git a/tests/test_data/test_det_dist_converter.txt b/tests/test_data/test_det_dist_converter.txt index 7949377941..084853e432 100644 --- a/tests/test_data/test_det_dist_converter.txt +++ b/tests/test_data/test_det_dist_converter.txt @@ -5,5 +5,3 @@ Units mm mm mm 200 153.61 162.45 500 153.57 159.96 - - From 06e2389e08db82251a6f02b790eebd01e90674ba Mon Sep 17 00:00:00 2001 From: Callum Forrester Date: Mon, 12 Aug 2024 13:56:29 +0100 Subject: [PATCH 3/3] Fix ruff error --- .vscode/launch.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 0b92c7febe..86aa659d41 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -22,4 +22,4 @@ }, } ] -} \ No newline at end of file +}