Skip to content

change to ruff #31

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 15, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# SPDX-FileCopyrightText: 2024 Justin Myers for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense

.py text eol=lf
.rst text eol=lf
.txt text eol=lf
.yaml text eol=lf
.toml text eol=lf
.license text eol=lf
.md text eol=lf
43 changes: 11 additions & 32 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,42 +1,21 @@
# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò
# SPDX-FileCopyrightText: 2024 Justin Myers for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense

repos:
- repo: https://github.com/python/black
rev: 23.3.0
hooks:
- id: black
- repo: https://github.com/fsfe/reuse-tool
rev: v1.1.2
hooks:
- id: reuse
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
rev: v4.5.0
hooks:
- id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/pycqa/pylint
rev: v2.17.4
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.3.4
hooks:
- id: pylint
name: pylint (library code)
types: [python]
args:
- --disable=consider-using-f-string
exclude: "^(docs/|examples/|tests/|setup.py$)"
- id: pylint
name: pylint (example code)
description: Run pylint rules on "examples/*.py" files
types: [python]
files: "^examples/"
args:
- --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code
- id: pylint
name: pylint (test code)
description: Run pylint rules on "tests/*.py" files
types: [python]
files: "^tests/"
args:
- --disable=missing-docstring,consider-using-f-string,duplicate-code
- id: ruff-format
- id: ruff
args: ["--fix"]
- repo: https://github.com/fsfe/reuse-tool
rev: v3.0.1
hooks:
- id: reuse
399 changes: 0 additions & 399 deletions .pylintrc

This file was deleted.

6 changes: 3 additions & 3 deletions README.rst
Original file line number Diff line number Diff line change
@@ -13,9 +13,9 @@ Introduction
:target: https://github.com/adafruit/Adafruit_CircuitPython_RPLIDAR
:alt: Build Status

.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
:target: https://github.com/psf/black
:alt: Code Style: Black
.. image:: https://img.shields.io/endpoint?url=https://github.com/raw/astral-sh/ruff/main/assets/badge/v2.json
:target: https://github.com/astral-sh/ruff
:alt: Code Style: Ruff

.. Provide a convenient interface to the Slamtec RPLidar.
52 changes: 19 additions & 33 deletions adafruit_rplidar.py
Original file line number Diff line number Diff line change
@@ -34,7 +34,8 @@
from collections import namedtuple

try:
from typing import Tuple, Dict, Any, Optional, List, Iterator, Union
from typing import Any, Dict, Iterator, List, Optional, Tuple, Union

from busio import UART
from digitalio import DigitalInOut
except ImportError:
@@ -46,8 +47,8 @@
__version__ = "0.0.0+auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_RPLIDAR.git"

SYNC_BYTE = b"\xA5"
SYNC_BYTE2 = b"\x5A"
SYNC_BYTE = b"\xa5"
SYNC_BYTE2 = b"\x5a"

GET_INFO_BYTE = b"\x50"
GET_HEALTH_BYTE = b"\x52"
@@ -65,7 +66,7 @@
# Constants & Command to start A2 motor
MAX_MOTOR_PWM = 1023
DEFAULT_MOTOR_PWM = 660
SET_PWM_BYTE = b"\xF0"
SET_PWM_BYTE = b"\xf0"

_HEALTH_STATUSES = {
0: "Good",
@@ -169,16 +170,16 @@ def __init__(
if self.is_CP:
_serial_port = port
else:
global serial # pylint: disable=global-statement
import serial # pylint: disable=import-outside-toplevel
global serial # noqa: PLW0603
import serial # noqa: PLC0415

self.connect()
self.start_motor()

def log(self, level: str, msg: str) -> None:
"""Output the level and a message if logging is enabled."""
if self.logging:
sys.stdout.write("{0}: {1}\n".format(level, msg))
sys.stdout.write(f"{level}: {msg}\n")

def log_bytes(self, level: str, msg: str, ba: bytes) -> None:
"""Log and output a byte array in a readable way."""
@@ -200,9 +201,7 @@ def connect(self) -> None:
timeout=self.timeout,
)
except serial.SerialException as err:
raise RPLidarException(
"Failed to connect to the sensor " "due to: %s" % err
)
raise RPLidarException("Failed to connect to the sensor " "due to: %s" % err)

def disconnect(self) -> None:
"""Disconnects from the serial port"""
@@ -362,15 +361,12 @@ def start(self, scan_type: int = SCAN_TYPE_NORMAL) -> None:
if status == _HEALTH_STATUSES[2]:
self.log(
"warning",
"Trying to reset sensor due to the error. "
"Error code: %d" % (error_code),
"Trying to reset sensor due to the error. " "Error code: %d" % (error_code),
)
self.reset()
status, error_code = self.health
if status == _HEALTH_STATUSES[2]:
raise RPLidarException(
"RPLidar hardware failure. " "Error code: %d" % error_code
)
raise RPLidarException("RPLidar hardware failure. " "Error code: %d" % error_code)
elif status == _HEALTH_STATUSES[1]:
self.log(
"warning",
@@ -464,23 +460,17 @@ def iter_measurements(
self.express_frame = 0
if not self.express_data:
self.log("debug", "reading first time bytes")
self.express_data = ExpressPacket.from_string(
self._read_response(dsize)
)
self.express_data = ExpressPacket.from_string(self._read_response(dsize))

self.express_old_data = self.express_data
self.log(
"debug",
"set old_data with start_angle %f"
% self.express_old_data.start_angle,
)
self.express_data = ExpressPacket.from_string(
self._read_response(dsize)
"set old_data with start_angle %f" % self.express_old_data.start_angle,
)
self.express_data = ExpressPacket.from_string(self._read_response(dsize))
self.log(
"debug",
"set new_data with start_angle %f"
% self.express_data.start_angle,
"set new_data with start_angle %f" % self.express_data.start_angle,
)

self.express_frame += 1
@@ -500,9 +490,7 @@ def iter_measurements(
self.express_frame,
)

def iter_measurments(
self, max_buf_meas: int = 500
) -> Iterator[Tuple[bool, int, float, float]]:
def iter_measurments(self, max_buf_meas: int = 500) -> Iterator[Tuple[bool, int, float, float]]:
"""For compatibility, this method wraps `iter_measurements`"""
warnings.warn(
"The method `iter_measurments` has been renamed "
@@ -511,9 +499,7 @@ def iter_measurments(
)
self.iter_measurements(max_buf_meas=max_buf_meas)

def iter_scans(
self, max_buf_meas: int = 500, min_len: int = 5
) -> List[Union[int, float]]:
def iter_scans(self, max_buf_meas: int = 500, min_len: int = 5) -> List[Union[int, float]]:
"""Iterate over scans. Note that consumer must be fast enough,
otherwise data will be accumulated inside buffer and consumer will get
data with increasing lag.
@@ -559,13 +545,13 @@ def from_string(cls, data: bytes) -> "ExpressPacket":
packet = bytearray(data)

if (packet[0] >> 4) != cls.sync1 or (packet[1] >> 4) != cls.sync2:
raise ValueError("try to parse corrupted data ({})".format(packet))
raise ValueError(f"try to parse corrupted data ({packet})")

checksum = 0
for b in packet[2:]:
checksum ^= b
if checksum != (packet[0] & 0b00001111) + ((packet[1] & 0b00001111) << 4):
raise ValueError("Invalid checksum ({})".format(packet))
raise ValueError(f"Invalid checksum ({packet})")

new_scan = packet[3] >> 7
start_angle = (packet[2] + ((packet[3] & 0b01111111) << 8)) / 64
3 changes: 3 additions & 0 deletions docs/api.rst
Original file line number Diff line number Diff line change
@@ -4,5 +4,8 @@
.. If your library file(s) are nested in a directory (e.g. /adafruit_foo/foo.py)
.. use this format as the module name: "adafruit_foo.foo"
API Reference
#############

.. automodule:: adafruit_rplidar
:members:
8 changes: 2 additions & 6 deletions docs/conf.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
# -*- coding: utf-8 -*-

# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
#
# SPDX-License-Identifier: MIT

import datetime
import os
import sys
import datetime

sys.path.insert(0, os.path.abspath(".."))

@@ -56,9 +54,7 @@
creation_year = "2019"
current_year = str(datetime.datetime.now().year)
year_duration = (
current_year
if current_year == creation_year
else creation_year + " - " + current_year
current_year if current_year == creation_year else creation_year + " - " + current_year
)
copyright = year_duration + " Dave Astels"
author = "Dave Astels"
1 change: 1 addition & 0 deletions examples/rplidar_simpletest.py
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@
# SPDX-License-Identifier: MIT

from math import floor

from adafruit_rplidar import RPLidar

# Setup the RPLidar
105 changes: 105 additions & 0 deletions ruff.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries
#
# SPDX-License-Identifier: MIT

target-version = "py38"
line-length = 100

[lint]
preview = true
select = ["I", "PL", "UP"]

extend-select = [
"D419", # empty-docstring
"E501", # line-too-long
"W291", # trailing-whitespace
"PLC0414", # useless-import-alias
"PLC2401", # non-ascii-name
"PLC2801", # unnecessary-dunder-call
"PLC3002", # unnecessary-direct-lambda-call
"E999", # syntax-error
"PLE0101", # return-in-init
"F706", # return-outside-function
"F704", # yield-outside-function
"PLE0116", # continue-in-finally
"PLE0117", # nonlocal-without-binding
"PLE0241", # duplicate-bases
"PLE0302", # unexpected-special-method-signature
"PLE0604", # invalid-all-object
"PLE0605", # invalid-all-format
"PLE0643", # potential-index-error
"PLE0704", # misplaced-bare-raise
"PLE1141", # dict-iter-missing-items
"PLE1142", # await-outside-async
"PLE1205", # logging-too-many-args
"PLE1206", # logging-too-few-args
"PLE1307", # bad-string-format-type
"PLE1310", # bad-str-strip-call
"PLE1507", # invalid-envvar-value
"PLE2502", # bidirectional-unicode
"PLE2510", # invalid-character-backspace
"PLE2512", # invalid-character-sub
"PLE2513", # invalid-character-esc
"PLE2514", # invalid-character-nul
"PLE2515", # invalid-character-zero-width-space
"PLR0124", # comparison-with-itself
"PLR0202", # no-classmethod-decorator
"PLR0203", # no-staticmethod-decorator
"UP004", # useless-object-inheritance
"PLR0206", # property-with-parameters
"PLR0904", # too-many-public-methods
"PLR0911", # too-many-return-statements
"PLR0912", # too-many-branches
"PLR0913", # too-many-arguments
"PLR0914", # too-many-locals
"PLR0915", # too-many-statements
"PLR0916", # too-many-boolean-expressions
"PLR1702", # too-many-nested-blocks
"PLR1704", # redefined-argument-from-local
"PLR1711", # useless-return
"C416", # unnecessary-comprehension
"PLR1733", # unnecessary-dict-index-lookup
"PLR1736", # unnecessary-list-index-lookup

# ruff reports this rule is unstable
#"PLR6301", # no-self-use

"PLW0108", # unnecessary-lambda
"PLW0120", # useless-else-on-loop
"PLW0127", # self-assigning-variable
"PLW0129", # assert-on-string-literal
"B033", # duplicate-value
"PLW0131", # named-expr-without-context
"PLW0245", # super-without-brackets
"PLW0406", # import-self
"PLW0602", # global-variable-not-assigned
"PLW0603", # global-statement
"PLW0604", # global-at-module-level

# fails on the try: import typing used by libraries
#"F401", # unused-import

"F841", # unused-variable
"E722", # bare-except
"PLW0711", # binary-op-exception
"PLW1501", # bad-open-mode
"PLW1508", # invalid-envvar-default
"PLW1509", # subprocess-popen-preexec-fn
"PLW2101", # useless-with-lock
"PLW3301", # nested-min-max
]

ignore = [
"PLR2004", # magic-value-comparison
"UP030", # format literals
"PLW1514", # unspecified-encoding
"PLR0913", # too-many-arguments
"PLR0915", # too-many-statements
"PLR0917", # too-many-positional-arguments
"PLR0904", # too-many-public-methods
"PLR0912", # too-many-branches
"PLR0916", # too-many-boolean-expressions
]

[format]
line-ending = "lf"