add mypy check for return-any (#24379)

* add mypy check for return-any

* remove unused import

* typing

* remove unnecessary variable typing

* cleanup

* cleanup

* bump submodules

* small fixes

* only a problem on mac

Co-authored-by: Willem Melching <willem.melching@gmail.com>
pull/24507/head
Dylan Herman 3 years ago committed by GitHub
parent 3bfe4a691c
commit d2eef1955c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      .pre-commit-config.yaml
  2. 2
      cereal
  3. 4
      common/realtime.py
  4. 7
      common/xattr.py
  5. 2
      panda
  6. 2
      scripts/waste.py
  7. 4
      selfdrive/athena/registration.py
  8. 6
      selfdrive/boardd/pandad.py
  9. 3
      selfdrive/car/__init__.py
  10. 8
      selfdrive/car/docs.py
  11. 2
      selfdrive/car/volkswagen/values.py
  12. 2
      selfdrive/controls/lib/events.py
  13. 28
      selfdrive/controls/lib/vehicle_model.py
  14. 2
      selfdrive/debug/live_cpu_and_temp.py
  15. 2
      selfdrive/debug/run_process_on_route.py
  16. 18
      selfdrive/hardware/tici/agnos.py
  17. 2
      selfdrive/locationd/calibrationd.py
  18. 4
      selfdrive/manager/process_config.py
  19. 2
      selfdrive/sensord/rawgps/compare.py
  20. 2
      selfdrive/updated.py
  21. 6
      selfdrive/version.py
  22. 4
      tools/lib/bootlog.py

@ -23,6 +23,7 @@ repos:
additional_dependencies: ['lxml', 'numpy', 'types-atomicwrites', 'types-pycurl', 'types-requests', 'types-certifi'] additional_dependencies: ['lxml', 'numpy', 'types-atomicwrites', 'types-pycurl', 'types-requests', 'types-certifi']
args: args:
- --warn-redundant-casts - --warn-redundant-casts
- --warn-return-any
- --warn-unreachable - --warn-unreachable
- --warn-unused-ignores - --warn-unused-ignores
#- --html-report=/home/batman/openpilot #- --html-report=/home/batman/openpilot

@ -1 +1 @@
Subproject commit 67e5c5ca378fcf6db53e968e5ad9e4a98d32ed0f Subproject commit 8e8831f8e03deb62dd5fcfc638e134cdc8e9adbf

@ -36,12 +36,12 @@ class Priority:
def set_realtime_priority(level: int) -> None: def set_realtime_priority(level: int) -> None:
if not PC: if not PC:
os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(level)) # type: ignore[attr-defined] os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(level)) # type: ignore[attr-defined] # pylint: disable=no-member
def set_core_affinity(cores: List[int]) -> None: def set_core_affinity(cores: List[int]) -> None:
if not PC: if not PC:
os.sched_setaffinity(0, cores) os.sched_setaffinity(0, cores) # pylint: disable=no-member
def config_realtime_process(cores: Union[int, List[int]], priority: int) -> None: def config_realtime_process(cores: Union[int, List[int]], priority: int) -> None:

@ -1,5 +1,6 @@
import os import os
from cffi import FFI from cffi import FFI
from typing import Any, List
# Workaround for the EON/termux build of Python having os.*xattr removed. # Workaround for the EON/termux build of Python having os.*xattr removed.
ffi = FFI() ffi = FFI()
@ -11,7 +12,7 @@ int removexattr(const char *path, const char *name);
""") """)
libc = ffi.dlopen(None) libc = ffi.dlopen(None)
def setxattr(path, name, value, flags=0): def setxattr(path, name, value, flags=0) -> None:
path = path.encode() path = path.encode()
name = name.encode() name = name.encode()
if libc.setxattr(path, name, value, len(value), flags) == -1: if libc.setxattr(path, name, value, len(value), flags) == -1:
@ -29,7 +30,7 @@ def getxattr(path, name, size=128):
raise OSError(ffi.errno, f"{os.strerror(ffi.errno)}: getxattr({path}, {name}, {size})") raise OSError(ffi.errno, f"{os.strerror(ffi.errno)}: getxattr({path}, {name}, {size})")
return ffi.buffer(value)[:l] return ffi.buffer(value)[:l]
def listxattr(path, size=128): def listxattr(path, size=128) -> List[Any]:
path = path.encode() path = path.encode()
attrs = ffi.new(f"char[{size}]") attrs = ffi.new(f"char[{size}]")
l = libc.listxattr(path, attrs, size) l = libc.listxattr(path, attrs, size)
@ -38,7 +39,7 @@ def listxattr(path, size=128):
# attrs is b'\0' delimited values (so chop off trailing empty item) # attrs is b'\0' delimited values (so chop off trailing empty item)
return [a.decode() for a in ffi.buffer(attrs)[:l].split(b"\0")[0:-1]] return [a.decode() for a in ffi.buffer(attrs)[:l].split(b"\0")[0:-1]]
def removexattr(path, name): def removexattr(path, name) -> None:
path = path.encode() path = path.encode()
name = name.encode() name = name.encode()
if libc.removexattr(path, name) == -1: if libc.removexattr(path, name) == -1:

@ -1 +1 @@
Subproject commit eb662e4e5014a3fc3c04512d708f61080c7707c1 Subproject commit d5bd81e5b517c79e164d87b96355e6bc75915da0

@ -6,7 +6,7 @@ from multiprocessing import Process
from setproctitle import setproctitle # pylint: disable=no-name-in-module from setproctitle import setproctitle # pylint: disable=no-name-in-module
def waste(core): def waste(core):
os.sched_setaffinity(0, [core,]) os.sched_setaffinity(0, [core,]) # pylint: disable=no-member
m1 = np.zeros((200, 200)) + 0.8 m1 = np.zeros((200, 200)) + 0.8
m2 = np.zeros((200, 200)) + 1.2 m2 = np.zeros((200, 200)) + 1.2

@ -23,13 +23,13 @@ def is_registered_device() -> bool:
return dongle not in (None, UNREGISTERED_DONGLE_ID) return dongle not in (None, UNREGISTERED_DONGLE_ID)
def register(show_spinner=False) -> str: def register(show_spinner=False) -> Optional[str]:
params = Params() params = Params()
params.put("SubscriberInfo", HARDWARE.get_subscriber_info()) params.put("SubscriberInfo", HARDWARE.get_subscriber_info())
IMEI = params.get("IMEI", encoding='utf8') IMEI = params.get("IMEI", encoding='utf8')
HardwareSerial = params.get("HardwareSerial", encoding='utf8') HardwareSerial = params.get("HardwareSerial", encoding='utf8')
dongle_id = params.get("DongleId", encoding='utf8') dongle_id: Optional[str] = params.get("DongleId", encoding='utf8')
needs_registration = None in (IMEI, HardwareSerial, dongle_id) needs_registration = None in (IMEI, HardwareSerial, dongle_id)
pubkey = Path(PERSIST+"/comma/id_rsa.pub") pubkey = Path(PERSIST+"/comma/id_rsa.pub")

@ -4,7 +4,7 @@ import os
import usb1 import usb1
import time import time
import subprocess import subprocess
from typing import NoReturn from typing import List, NoReturn
from functools import cmp_to_key from functools import cmp_to_key
from panda import DEFAULT_FW_FN, DEFAULT_H7_FW_FN, MCU_TYPE_H7, Panda, PandaDFU from panda import DEFAULT_FW_FN, DEFAULT_H7_FW_FN, MCU_TYPE_H7, Panda, PandaDFU
@ -102,7 +102,7 @@ def main() -> NoReturn:
cloudlog.info(f"{len(panda_serials)} panda(s) found, connecting - {panda_serials}") cloudlog.info(f"{len(panda_serials)} panda(s) found, connecting - {panda_serials}")
# Flash pandas # Flash pandas
pandas = [] pandas: List[Panda] = []
for serial in panda_serials: for serial in panda_serials:
pandas.append(flash_panda(serial)) pandas.append(flash_panda(serial))
@ -119,7 +119,7 @@ def main() -> NoReturn:
# sort pandas to have deterministic order # sort pandas to have deterministic order
pandas.sort(key=cmp_to_key(panda_sort_cmp)) pandas.sort(key=cmp_to_key(panda_sort_cmp))
panda_serials = list(map(lambda p: p.get_usb_serial(), pandas)) panda_serials = list(map(lambda p: p.get_usb_serial(), pandas)) # type: ignore
# log panda fw versions # log panda fw versions
params.put("PandaSignatures", b','.join(p.get_signature() for p in pandas)) params.put("PandaSignatures", b','.join(p.get_signature() for p in pandas))

@ -1,6 +1,7 @@
# functions common among cars # functions common among cars
from cereal import car from cereal import car
from common.numpy_fast import clip from common.numpy_fast import clip
from typing import Dict
# kg of standard extra cargo to count for drive, gas, etc... # kg of standard extra cargo to count for drive, gas, etc...
STD_CARGO_KG = 136. STD_CARGO_KG = 136.
@ -41,7 +42,7 @@ def scale_tire_stiffness(mass, wheelbase, center_to_front, tire_stiffness_factor
return tire_stiffness_front, tire_stiffness_rear return tire_stiffness_front, tire_stiffness_rear
def dbc_dict(pt_dbc, radar_dbc, chassis_dbc=None, body_dbc=None): def dbc_dict(pt_dbc, radar_dbc, chassis_dbc=None, body_dbc=None) -> Dict[str, str]:
return {'pt': pt_dbc, 'radar': radar_dbc, 'chassis': chassis_dbc, 'body': body_dbc} return {'pt': pt_dbc, 'radar': radar_dbc, 'chassis': chassis_dbc, 'body': body_dbc}

@ -45,7 +45,8 @@ def get_all_car_info() -> List[CarInfo]:
all_car_info.append(_car_info.init(CP, non_tested_cars, ALL_FOOTNOTES)) all_car_info.append(_car_info.init(CP, non_tested_cars, ALL_FOOTNOTES))
# Sort cars by make and model + year # Sort cars by make and model + year
return natsorted(all_car_info, key=lambda car: (car.make + car.model).lower()) sorted_cars: List[CarInfo] = natsorted(all_car_info, key=lambda car: (car.make + car.model).lower())
return sorted_cars
def sort_by_tier(all_car_info: List[CarInfo]) -> Dict[Tier, List[CarInfo]]: def sort_by_tier(all_car_info: List[CarInfo]) -> Dict[Tier, List[CarInfo]]:
@ -65,8 +66,9 @@ def generate_cars_md(all_car_info: List[CarInfo], template_fn: str) -> str:
template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True) template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True)
footnotes = [fn.value.text for fn in ALL_FOOTNOTES] footnotes = [fn.value.text for fn in ALL_FOOTNOTES]
return template.render(tiers=sort_by_tier(all_car_info), all_car_info=all_car_info, cars_md: str = template.render(tiers=sort_by_tier(all_car_info), all_car_info=all_car_info,
footnotes=footnotes, Star=Star, Column=Column) footnotes=footnotes, Star=Star, Column=Column)
return cars_md
if __name__ == "__main__": if __name__ == "__main__":

@ -41,7 +41,7 @@ class DBC_FILES:
mqb = "vw_mqb_2010" # Used for all cars with MQB-style CAN messaging mqb = "vw_mqb_2010" # Used for all cars with MQB-style CAN messaging
DBC = defaultdict(lambda: dbc_dict(DBC_FILES.mqb, None)) # type: Dict[str, Dict[str, str]] DBC: Dict[str, Dict[str, str]] = defaultdict(lambda: dbc_dict(DBC_FILES.mqb, None))
BUTTON_STATES = { BUTTON_STATES = {
"accelCruise": False, "accelCruise": False,

@ -135,6 +135,8 @@ class Alert:
return f"{self.alert_text_1}/{self.alert_text_2} {self.priority} {self.visual_alert} {self.audible_alert}" return f"{self.alert_text_1}/{self.alert_text_2} {self.priority} {self.visual_alert} {self.audible_alert}"
def __gt__(self, alert2) -> bool: def __gt__(self, alert2) -> bool:
if not isinstance(alert2, Alert):
return False
return self.priority > alert2.priority return self.priority > alert2.priority

@ -29,22 +29,22 @@ class VehicleModel:
CP: Car Parameters CP: Car Parameters
""" """
# for math readability, convert long names car params into short names # for math readability, convert long names car params into short names
self.m = CP.mass self.m: float = CP.mass
self.j = CP.rotationalInertia self.j: float = CP.rotationalInertia
self.l = CP.wheelbase self.l: float = CP.wheelbase
self.aF = CP.centerToFront self.aF: float = CP.centerToFront
self.aR = CP.wheelbase - CP.centerToFront self.aR: float = CP.wheelbase - CP.centerToFront
self.chi = CP.steerRatioRear self.chi: float = CP.steerRatioRear
self.cF_orig = CP.tireStiffnessFront self.cF_orig: float = CP.tireStiffnessFront
self.cR_orig = CP.tireStiffnessRear self.cR_orig: float = CP.tireStiffnessRear
self.update_params(1.0, CP.steerRatio) self.update_params(1.0, CP.steerRatio)
def update_params(self, stiffness_factor: float, steer_ratio: float) -> None: def update_params(self, stiffness_factor: float, steer_ratio: float) -> None:
"""Update the vehicle model with a new stiffness factor and steer ratio""" """Update the vehicle model with a new stiffness factor and steer ratio"""
self.cF = stiffness_factor * self.cF_orig self.cF: float = stiffness_factor * self.cF_orig
self.cR = stiffness_factor * self.cR_orig self.cR: float = stiffness_factor * self.cR_orig
self.sR = steer_ratio self.sR: float = steer_ratio
def steady_state_sol(self, sa: float, u: float, roll: float) -> np.ndarray: def steady_state_sol(self, sa: float, u: float, roll: float) -> np.ndarray:
"""Returns the steady state solution. """Returns the steady state solution.
@ -221,10 +221,10 @@ def dyn_ss_sol(sa: float, u: float, roll: float, VM: VehicleModel) -> np.ndarray
""" """
A, B = create_dyn_state_matrices(u, VM) A, B = create_dyn_state_matrices(u, VM)
inp = np.array([[sa], [roll]]) inp = np.array([[sa], [roll]])
return -solve(A, B) @ inp return -solve(A, B) @ inp # type: ignore
def calc_slip_factor(VM): def calc_slip_factor(VM: VehicleModel) -> float:
"""The slip factor is a measure of how the curvature changes with speed """The slip factor is a measure of how the curvature changes with speed
it's positive for Oversteering vehicle, negative (usual case) otherwise. it's positive for Oversteering vehicle, negative (usual case) otherwise.
""" """

@ -88,7 +88,7 @@ if __name__ == "__main__":
pass pass
print("Top CPU usage:") print("Top CPU usage:")
for k, v in sorted(procs.items(), key=lambda item: item[1], reverse=True)[:10]: for k, v in sorted(procs.items(), key=lambda item: item[1], reverse=True)[:10]: # type: ignore
print(f"{k.rjust(70)} {v:.2f} %") print(f"{k.rjust(70)} {v:.2f} %")
print() print()

@ -25,7 +25,7 @@ if __name__ == "__main__":
# Remove message generated by the process under test and merge in the new messages # Remove message generated by the process under test and merge in the new messages
produces = {o.which() for o in outputs} produces = {o.which() for o in outputs}
inputs = [i for i in inputs if i.which() not in produces] inputs = [i for i in inputs if i.which() not in produces]
outputs = sorted(inputs + outputs, key=lambda x: x.logMonoTime) outputs = sorted(inputs + outputs, key=lambda x: x.logMonoTime) # type: ignore
fn = f"{args.route}_{args.process}.bz2" fn = f"{args.route}_{args.process}.bz2"
save_log(fn, outputs) save_log(fn, outputs)

@ -7,7 +7,7 @@ import struct
import subprocess import subprocess
import time import time
import os import os
from typing import Generator from typing import Dict, Generator, Union
SPARSE_CHUNK_FMT = struct.Struct('H2xI4x') SPARSE_CHUNK_FMT = struct.Struct('H2xI4x')
@ -99,26 +99,30 @@ def get_partition_path(target_slot_number: int, partition: dict) -> str:
return path return path
def verify_partition(target_slot_number: int, partition: dict) -> bool: def verify_partition(target_slot_number: int, partition: Dict[str, Union[str, int]]) -> bool:
full_check = partition['full_check'] full_check = partition['full_check']
path = get_partition_path(target_slot_number, partition) path = get_partition_path(target_slot_number, partition)
partition_size = partition['size'] if not isinstance(partition['size'], int):
return False
partition_size: int = partition['size']
if not isinstance(partition['hash_raw'], str):
return False
partition_hash: str = partition['hash_raw']
with open(path, 'rb+') as out: with open(path, 'rb+') as out:
if full_check: if full_check:
raw_hash = hashlib.sha256() raw_hash = hashlib.sha256()
pos = 0 pos, chunk_size = 0, 1024 * 1024
chunk_size = 1024 * 1024
while pos < partition_size: while pos < partition_size:
n = min(chunk_size, partition_size - pos) n = min(chunk_size, partition_size - pos)
raw_hash.update(out.read(n)) raw_hash.update(out.read(n))
pos += n pos += n
return raw_hash.hexdigest().lower() == partition['hash_raw'].lower() return raw_hash.hexdigest().lower() == partition_hash.lower()
else: else:
out.seek(partition_size) out.seek(partition_size)
return out.read(64) == partition['hash_raw'].lower().encode() return out.read(64) == partition_hash.lower().encode()
def clear_partition_hash(target_slot_number: int, partition: dict) -> None: def clear_partition_hash(target_slot_number: int, partition: dict) -> None:

@ -48,7 +48,7 @@ class Calibration:
def is_calibration_valid(rpy: np.ndarray) -> bool: def is_calibration_valid(rpy: np.ndarray) -> bool:
return (PITCH_LIMITS[0] < rpy[1] < PITCH_LIMITS[1]) and (YAW_LIMITS[0] < rpy[2] < YAW_LIMITS[1]) return (PITCH_LIMITS[0] < rpy[1] < PITCH_LIMITS[1]) and (YAW_LIMITS[0] < rpy[2] < YAW_LIMITS[1]) # type: ignore
def sanity_clip(rpy: np.ndarray) -> np.ndarray: def sanity_clip(rpy: np.ndarray) -> np.ndarray:

@ -8,10 +8,10 @@ from selfdrive.manager.process import PythonProcess, NativeProcess, DaemonProces
WEBCAM = os.getenv("USE_WEBCAM") is not None WEBCAM = os.getenv("USE_WEBCAM") is not None
def driverview(started: bool, params: Params, CP: car.CarParams) -> bool: def driverview(started: bool, params: Params, CP: car.CarParams) -> bool:
return params.get_bool("IsDriverViewEnabled") return params.get_bool("IsDriverViewEnabled") # type: ignore
def notcar(started: bool, params: Params, CP: car.CarParams) -> bool: def notcar(started: bool, params: Params, CP: car.CarParams) -> bool:
return CP.notCar return CP.notCar # type: ignore
def logging(started, params, CP: car.CarParams) -> bool: def logging(started, params, CP: car.CarParams) -> bool:
run = (not CP.notCar) or not params.get_bool("DisableLogging") run = (not CP.notCar) or not params.get_bool("DisableLogging")

@ -56,7 +56,7 @@ if __name__ == "__main__":
pr_err /= len(car) pr_err /= len(car)
speed_err /= len(car) speed_err /= len(car)
print("avg psuedorange err %f avg speed err %f" % (pr_err, speed_err)) print("avg psuedorange err %f avg speed err %f" % (pr_err, speed_err))
for c in sorted(car, key=lambda x: abs(x[1] - x[3] - pr_err)): for c in sorted(car, key=lambda x: abs(x[1] - x[3] - pr_err)): # type: ignore
svid, ublox_psuedorange, ublox_speed, qcom_psuedorange, qcom_speed, cno = c svid, ublox_psuedorange, ublox_speed, qcom_psuedorange, qcom_speed, cno = c
print("svid: %3d pseudorange: %10.2f m speed: %8.2f m/s meas: %12.2f speed: %10.2f meas_err: %10.3f speed_err: %8.3f cno: %d" % print("svid: %3d pseudorange: %10.2f m speed: %8.2f m/s meas: %12.2f speed: %10.2f meas_err: %10.3f speed_err: %8.3f cno: %d" %
(svid, ublox_psuedorange, ublox_speed, qcom_psuedorange, qcom_speed, (svid, ublox_psuedorange, ublox_speed, qcom_psuedorange, qcom_speed,

@ -311,7 +311,7 @@ def fetch_update(wait_helper: WaitTimeHelper) -> bool:
cur_hash = run(["git", "rev-parse", "HEAD"], OVERLAY_MERGED).rstrip() cur_hash = run(["git", "rev-parse", "HEAD"], OVERLAY_MERGED).rstrip()
upstream_hash = run(["git", "rev-parse", "@{u}"], OVERLAY_MERGED).rstrip() upstream_hash = run(["git", "rev-parse", "@{u}"], OVERLAY_MERGED).rstrip()
new_version = cur_hash != upstream_hash new_version: bool = cur_hash != upstream_hash
git_fetch_result = check_git_fetch_result(git_fetch_output) git_fetch_result = check_git_fetch_result(git_fetch_output)
cloudlog.info(f"comparing {cur_hash} to {upstream_hash}") cloudlog.info(f"comparing {cur_hash} to {upstream_hash}")

@ -55,7 +55,7 @@ def get_origin(default: Optional[str] = None) -> Optional[str]:
@cache @cache
def get_normalized_origin(default: Optional[str] = None) -> Optional[str]: def get_normalized_origin(default: Optional[str] = None) -> Optional[str]:
origin = get_origin() origin: Optional[str] = get_origin()
if origin is None: if origin is None:
return default return default
@ -74,7 +74,7 @@ def get_version() -> str:
@cache @cache
def get_short_version() -> str: def get_short_version() -> str:
return get_version().split('-')[0] return get_version().split('-')[0] # type: ignore
@cache @cache
def is_prebuilt() -> bool: def is_prebuilt() -> bool:
@ -85,7 +85,7 @@ def is_prebuilt() -> bool:
def is_comma_remote() -> bool: def is_comma_remote() -> bool:
# note to fork maintainers, this is used for release metrics. please do not # note to fork maintainers, this is used for release metrics. please do not
# touch this to get rid of the orange startup alert. there's better ways to do that # touch this to get rid of the orange startup alert. there's better ways to do that
origin = get_origin() origin: Optional[str] = get_origin()
if origin is None: if origin is None:
return False return False

@ -36,9 +36,13 @@ class Bootlog:
return timestamp_to_datetime(self._timestamp) return timestamp_to_datetime(self._timestamp)
def __eq__(self, b) -> bool: def __eq__(self, b) -> bool:
if not isinstance(b, Bootlog):
return False
return self.datetime == b.datetime return self.datetime == b.datetime
def __lt__(self, b) -> bool: def __lt__(self, b) -> bool:
if not isinstance(b, Bootlog):
return False
return self.datetime < b.datetime return self.datetime < b.datetime

Loading…
Cancel
Save