viam-sdk 0.45.2__py3-none-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of viam-sdk might be problematic. Click here for more details.

Files changed (476) hide show
  1. viam/__init__.py +71 -0
  2. viam/app/__init__.py +0 -0
  3. viam/app/_logs.py +34 -0
  4. viam/app/app_client.py +2525 -0
  5. viam/app/billing_client.py +143 -0
  6. viam/app/data_client.py +1715 -0
  7. viam/app/ml_training_client.py +251 -0
  8. viam/app/provisioning_client.py +95 -0
  9. viam/app/viam_client.py +260 -0
  10. viam/components/__init__.py +0 -0
  11. viam/components/arm/__init__.py +16 -0
  12. viam/components/arm/arm.py +223 -0
  13. viam/components/arm/client.py +124 -0
  14. viam/components/arm/service.py +123 -0
  15. viam/components/audio_input/__init__.py +18 -0
  16. viam/components/audio_input/audio_input.py +81 -0
  17. viam/components/audio_input/client.py +70 -0
  18. viam/components/audio_input/service.py +114 -0
  19. viam/components/base/__init__.py +13 -0
  20. viam/components/base/base.py +260 -0
  21. viam/components/base/client.py +153 -0
  22. viam/components/base/service.py +138 -0
  23. viam/components/board/__init__.py +9 -0
  24. viam/components/board/board.py +414 -0
  25. viam/components/board/client.py +241 -0
  26. viam/components/board/service.py +223 -0
  27. viam/components/button/__init__.py +10 -0
  28. viam/components/button/button.py +41 -0
  29. viam/components/button/client.py +52 -0
  30. viam/components/button/service.py +46 -0
  31. viam/components/camera/__init__.py +22 -0
  32. viam/components/camera/camera.py +138 -0
  33. viam/components/camera/client.py +98 -0
  34. viam/components/camera/service.py +105 -0
  35. viam/components/component_base.py +65 -0
  36. viam/components/encoder/__init__.py +18 -0
  37. viam/components/encoder/client.py +83 -0
  38. viam/components/encoder/encoder.py +118 -0
  39. viam/components/encoder/service.py +72 -0
  40. viam/components/gantry/__init__.py +11 -0
  41. viam/components/gantry/client.py +115 -0
  42. viam/components/gantry/gantry.py +156 -0
  43. viam/components/gantry/service.py +113 -0
  44. viam/components/generic/__init__.py +18 -0
  45. viam/components/generic/client.py +62 -0
  46. viam/components/generic/generic.py +76 -0
  47. viam/components/generic/service.py +40 -0
  48. viam/components/gripper/__init__.py +11 -0
  49. viam/components/gripper/client.py +85 -0
  50. viam/components/gripper/gripper.py +114 -0
  51. viam/components/gripper/service.py +81 -0
  52. viam/components/input/__init__.py +15 -0
  53. viam/components/input/client.py +194 -0
  54. viam/components/input/input.py +297 -0
  55. viam/components/input/service.py +175 -0
  56. viam/components/motor/__init__.py +11 -0
  57. viam/components/motor/client.py +168 -0
  58. viam/components/motor/motor.py +301 -0
  59. viam/components/motor/service.py +150 -0
  60. viam/components/movement_sensor/__init__.py +21 -0
  61. viam/components/movement_sensor/client.py +161 -0
  62. viam/components/movement_sensor/movement_sensor.py +253 -0
  63. viam/components/movement_sensor/service.py +146 -0
  64. viam/components/pose_tracker/__init__.py +17 -0
  65. viam/components/pose_tracker/client.py +50 -0
  66. viam/components/pose_tracker/pose_tracker.py +40 -0
  67. viam/components/pose_tracker/service.py +45 -0
  68. viam/components/power_sensor/__init__.py +17 -0
  69. viam/components/power_sensor/client.py +86 -0
  70. viam/components/power_sensor/power_sensor.py +104 -0
  71. viam/components/power_sensor/service.py +72 -0
  72. viam/components/sensor/__init__.py +18 -0
  73. viam/components/sensor/client.py +49 -0
  74. viam/components/sensor/sensor.py +48 -0
  75. viam/components/sensor/service.py +51 -0
  76. viam/components/servo/__init__.py +11 -0
  77. viam/components/servo/client.py +86 -0
  78. viam/components/servo/service.py +80 -0
  79. viam/components/servo/servo.py +114 -0
  80. viam/components/switch/__init__.py +10 -0
  81. viam/components/switch/client.py +83 -0
  82. viam/components/switch/service.py +72 -0
  83. viam/components/switch/switch.py +95 -0
  84. viam/errors.py +105 -0
  85. viam/gen/__init__.py +0 -0
  86. viam/gen/app/__init__.py +0 -0
  87. viam/gen/app/agent/__init__.py +0 -0
  88. viam/gen/app/agent/v1/__init__.py +0 -0
  89. viam/gen/app/agent/v1/agent_grpc.py +29 -0
  90. viam/gen/app/agent/v1/agent_pb2.py +47 -0
  91. viam/gen/app/agent/v1/agent_pb2.pyi +280 -0
  92. viam/gen/app/cloudslam/__init__.py +0 -0
  93. viam/gen/app/cloudslam/v1/__init__.py +0 -0
  94. viam/gen/app/cloudslam/v1/cloud_slam_grpc.py +70 -0
  95. viam/gen/app/cloudslam/v1/cloud_slam_pb2.py +54 -0
  96. viam/gen/app/cloudslam/v1/cloud_slam_pb2.pyi +384 -0
  97. viam/gen/app/data/__init__.py +0 -0
  98. viam/gen/app/data/v1/__init__.py +0 -0
  99. viam/gen/app/data/v1/data_grpc.py +206 -0
  100. viam/gen/app/data/v1/data_pb2.py +178 -0
  101. viam/gen/app/data/v1/data_pb2.pyi +1485 -0
  102. viam/gen/app/datapipelines/__init__.py +0 -0
  103. viam/gen/app/datapipelines/v1/__init__.py +0 -0
  104. viam/gen/app/datapipelines/v1/data_pipelines_grpc.py +84 -0
  105. viam/gen/app/datapipelines/v1/data_pipelines_pb2.py +56 -0
  106. viam/gen/app/datapipelines/v1/data_pipelines_pb2.pyi +370 -0
  107. viam/gen/app/dataset/__init__.py +0 -0
  108. viam/gen/app/dataset/v1/__init__.py +0 -0
  109. viam/gen/app/dataset/v1/dataset_grpc.py +60 -0
  110. viam/gen/app/dataset/v1/dataset_pb2.py +40 -0
  111. viam/gen/app/dataset/v1/dataset_pb2.pyi +179 -0
  112. viam/gen/app/datasync/__init__.py +0 -0
  113. viam/gen/app/datasync/v1/__init__.py +0 -0
  114. viam/gen/app/datasync/v1/data_sync_grpc.py +47 -0
  115. viam/gen/app/datasync/v1/data_sync_pb2.py +70 -0
  116. viam/gen/app/datasync/v1/data_sync_pb2.pyi +425 -0
  117. viam/gen/app/mlinference/__init__.py +0 -0
  118. viam/gen/app/mlinference/v1/__init__.py +0 -0
  119. viam/gen/app/mlinference/v1/ml_inference_grpc.py +28 -0
  120. viam/gen/app/mlinference/v1/ml_inference_pb2.py +23 -0
  121. viam/gen/app/mlinference/v1/ml_inference_pb2.pyi +63 -0
  122. viam/gen/app/mltraining/__init__.py +0 -0
  123. viam/gen/app/mltraining/v1/__init__.py +0 -0
  124. viam/gen/app/mltraining/v1/ml_training_grpc.py +78 -0
  125. viam/gen/app/mltraining/v1/ml_training_pb2.py +124 -0
  126. viam/gen/app/mltraining/v1/ml_training_pb2.pyi +415 -0
  127. viam/gen/app/packages/__init__.py +0 -0
  128. viam/gen/app/packages/v1/__init__.py +0 -0
  129. viam/gen/app/packages/v1/packages_grpc.py +54 -0
  130. viam/gen/app/packages/v1/packages_pb2.py +52 -0
  131. viam/gen/app/packages/v1/packages_pb2.pyi +311 -0
  132. viam/gen/app/v1/__init__.py +0 -0
  133. viam/gen/app/v1/app_grpc.py +863 -0
  134. viam/gen/app/v1/app_pb2.py +649 -0
  135. viam/gen/app/v1/app_pb2.pyi +5279 -0
  136. viam/gen/app/v1/billing_grpc.py +76 -0
  137. viam/gen/app/v1/billing_pb2.py +92 -0
  138. viam/gen/app/v1/billing_pb2.pyi +463 -0
  139. viam/gen/app/v1/end_user_grpc.py +59 -0
  140. viam/gen/app/v1/end_user_pb2.py +55 -0
  141. viam/gen/app/v1/end_user_pb2.pyi +181 -0
  142. viam/gen/app/v1/robot_grpc.py +55 -0
  143. viam/gen/app/v1/robot_pb2.py +127 -0
  144. viam/gen/app/v1/robot_pb2.pyi +1202 -0
  145. viam/gen/common/__init__.py +0 -0
  146. viam/gen/common/v1/__init__.py +0 -0
  147. viam/gen/common/v1/common_grpc.py +0 -0
  148. viam/gen/common/v1/common_pb2.py +78 -0
  149. viam/gen/common/v1/common_pb2.pyi +687 -0
  150. viam/gen/component/__init__.py +0 -0
  151. viam/gen/component/arm/__init__.py +0 -0
  152. viam/gen/component/arm/v1/__init__.py +0 -0
  153. viam/gen/component/arm/v1/arm_grpc.py +102 -0
  154. viam/gen/component/arm/v1/arm_pb2.py +74 -0
  155. viam/gen/component/arm/v1/arm_pb2.pyi +344 -0
  156. viam/gen/component/audioinput/__init__.py +0 -0
  157. viam/gen/component/audioinput/v1/__init__.py +0 -0
  158. viam/gen/component/audioinput/v1/audioinput_grpc.py +63 -0
  159. viam/gen/component/audioinput/v1/audioinput_pb2.py +45 -0
  160. viam/gen/component/audioinput/v1/audioinput_pb2.pyi +179 -0
  161. viam/gen/component/base/__init__.py +0 -0
  162. viam/gen/component/base/v1/__init__.py +0 -0
  163. viam/gen/component/base/v1/base_grpc.py +94 -0
  164. viam/gen/component/base/v1/base_pb2.py +66 -0
  165. viam/gen/component/base/v1/base_pb2.pyi +258 -0
  166. viam/gen/component/board/__init__.py +0 -0
  167. viam/gen/component/board/v1/__init__.py +0 -0
  168. viam/gen/component/board/v1/board_grpc.py +127 -0
  169. viam/gen/component/board/v1/board_pb2.py +103 -0
  170. viam/gen/component/board/v1/board_pb2.pyi +496 -0
  171. viam/gen/component/button/__init__.py +0 -0
  172. viam/gen/component/button/v1/__init__.py +0 -0
  173. viam/gen/component/button/v1/button_grpc.py +38 -0
  174. viam/gen/component/button/v1/button_pb2.py +28 -0
  175. viam/gen/component/button/v1/button_pb2.pyi +39 -0
  176. viam/gen/component/camera/__init__.py +0 -0
  177. viam/gen/component/camera/v1/__init__.py +0 -0
  178. viam/gen/component/camera/v1/camera_grpc.py +79 -0
  179. viam/gen/component/camera/v1/camera_pb2.py +67 -0
  180. viam/gen/component/camera/v1/camera_pb2.pyi +373 -0
  181. viam/gen/component/encoder/__init__.py +0 -0
  182. viam/gen/component/encoder/v1/__init__.py +0 -0
  183. viam/gen/component/encoder/v1/encoder_grpc.py +62 -0
  184. viam/gen/component/encoder/v1/encoder_pb2.py +44 -0
  185. viam/gen/component/encoder/v1/encoder_pb2.pyi +147 -0
  186. viam/gen/component/gantry/__init__.py +0 -0
  187. viam/gen/component/gantry/v1/__init__.py +0 -0
  188. viam/gen/component/gantry/v1/gantry_grpc.py +86 -0
  189. viam/gen/component/gantry/v1/gantry_pb2.py +62 -0
  190. viam/gen/component/gantry/v1/gantry_pb2.pyi +239 -0
  191. viam/gen/component/generic/__init__.py +0 -0
  192. viam/gen/component/generic/v1/__init__.py +0 -0
  193. viam/gen/component/generic/v1/generic_grpc.py +37 -0
  194. viam/gen/component/generic/v1/generic_pb2.py +23 -0
  195. viam/gen/component/generic/v1/generic_pb2.pyi +6 -0
  196. viam/gen/component/gripper/__init__.py +0 -0
  197. viam/gen/component/gripper/v1/__init__.py +0 -0
  198. viam/gen/component/gripper/v1/gripper_grpc.py +70 -0
  199. viam/gen/component/gripper/v1/gripper_pb2.py +48 -0
  200. viam/gen/component/gripper/v1/gripper_pb2.pyi +137 -0
  201. viam/gen/component/inputcontroller/__init__.py +0 -0
  202. viam/gen/component/inputcontroller/v1/__init__.py +0 -0
  203. viam/gen/component/inputcontroller/v1/input_controller_grpc.py +71 -0
  204. viam/gen/component/inputcontroller/v1/input_controller_pb2.py +55 -0
  205. viam/gen/component/inputcontroller/v1/input_controller_pb2.pyi +243 -0
  206. viam/gen/component/motor/__init__.py +0 -0
  207. viam/gen/component/motor/v1/__init__.py +0 -0
  208. viam/gen/component/motor/v1/motor_grpc.py +118 -0
  209. viam/gen/component/motor/v1/motor_pb2.py +86 -0
  210. viam/gen/component/motor/v1/motor_pb2.pyi +368 -0
  211. viam/gen/component/movementsensor/__init__.py +0 -0
  212. viam/gen/component/movementsensor/v1/__init__.py +0 -0
  213. viam/gen/component/movementsensor/v1/movementsensor_grpc.py +110 -0
  214. viam/gen/component/movementsensor/v1/movementsensor_pb2.py +78 -0
  215. viam/gen/component/movementsensor/v1/movementsensor_pb2.pyi +384 -0
  216. viam/gen/component/posetracker/__init__.py +0 -0
  217. viam/gen/component/posetracker/v1/__init__.py +0 -0
  218. viam/gen/component/posetracker/v1/pose_tracker_grpc.py +46 -0
  219. viam/gen/component/posetracker/v1/pose_tracker_pb2.py +34 -0
  220. viam/gen/component/posetracker/v1/pose_tracker_pb2.pyi +79 -0
  221. viam/gen/component/powersensor/__init__.py +0 -0
  222. viam/gen/component/powersensor/v1/__init__.py +0 -0
  223. viam/gen/component/powersensor/v1/powersensor_grpc.py +62 -0
  224. viam/gen/component/powersensor/v1/powersensor_pb2.py +42 -0
  225. viam/gen/component/powersensor/v1/powersensor_pb2.pyi +124 -0
  226. viam/gen/component/sensor/__init__.py +0 -0
  227. viam/gen/component/sensor/v1/__init__.py +0 -0
  228. viam/gen/component/sensor/v1/sensor_grpc.py +45 -0
  229. viam/gen/component/sensor/v1/sensor_pb2.py +25 -0
  230. viam/gen/component/sensor/v1/sensor_pb2.pyi +6 -0
  231. viam/gen/component/servo/__init__.py +0 -0
  232. viam/gen/component/servo/v1/__init__.py +0 -0
  233. viam/gen/component/servo/v1/servo_grpc.py +70 -0
  234. viam/gen/component/servo/v1/servo_pb2.py +50 -0
  235. viam/gen/component/servo/v1/servo_pb2.pyi +150 -0
  236. viam/gen/component/switch/__init__.py +0 -0
  237. viam/gen/component/switch/v1/__init__.py +0 -0
  238. viam/gen/component/switch/v1/switch_grpc.py +54 -0
  239. viam/gen/component/switch/v1/switch_pb2.py +40 -0
  240. viam/gen/component/switch/v1/switch_pb2.pyi +109 -0
  241. viam/gen/component/testecho/__init__.py +0 -0
  242. viam/gen/component/testecho/v1/__init__.py +0 -0
  243. viam/gen/component/testecho/v1/testecho_grpc.py +52 -0
  244. viam/gen/component/testecho/v1/testecho_pb2.py +36 -0
  245. viam/gen/component/testecho/v1/testecho_pb2.pyi +114 -0
  246. viam/gen/module/__init__.py +0 -0
  247. viam/gen/module/v1/__init__.py +0 -0
  248. viam/gen/module/v1/module_grpc.py +61 -0
  249. viam/gen/module/v1/module_pb2.py +43 -0
  250. viam/gen/module/v1/module_pb2.pyi +211 -0
  251. viam/gen/proto/__init__.py +0 -0
  252. viam/gen/proto/rpc/__init__.py +0 -0
  253. viam/gen/proto/rpc/examples/__init__.py +0 -0
  254. viam/gen/proto/rpc/examples/echo/__init__.py +0 -0
  255. viam/gen/proto/rpc/examples/echo/v1/__init__.py +0 -0
  256. viam/gen/proto/rpc/examples/echo/v1/echo_grpc.py +44 -0
  257. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.py +32 -0
  258. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.pyi +87 -0
  259. viam/gen/proto/rpc/examples/echoresource/__init__.py +0 -0
  260. viam/gen/proto/rpc/examples/echoresource/v1/__init__.py +0 -0
  261. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_grpc.py +43 -0
  262. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.py +29 -0
  263. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.pyi +93 -0
  264. viam/gen/proto/rpc/v1/__init__.py +0 -0
  265. viam/gen/proto/rpc/v1/auth_grpc.py +47 -0
  266. viam/gen/proto/rpc/v1/auth_pb2.py +34 -0
  267. viam/gen/proto/rpc/v1/auth_pb2.pyi +92 -0
  268. viam/gen/proto/rpc/webrtc/__init__.py +0 -0
  269. viam/gen/proto/rpc/webrtc/v1/__init__.py +0 -0
  270. viam/gen/proto/rpc/webrtc/v1/grpc_grpc.py +0 -0
  271. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.py +43 -0
  272. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.pyi +304 -0
  273. viam/gen/proto/rpc/webrtc/v1/signaling_grpc.py +54 -0
  274. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py +70 -0
  275. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi +496 -0
  276. viam/gen/provisioning/__init__.py +0 -0
  277. viam/gen/provisioning/v1/__init__.py +0 -0
  278. viam/gen/provisioning/v1/provisioning_grpc.py +51 -0
  279. viam/gen/provisioning/v1/provisioning_pb2.py +39 -0
  280. viam/gen/provisioning/v1/provisioning_pb2.pyi +188 -0
  281. viam/gen/robot/__init__.py +0 -0
  282. viam/gen/robot/v1/__init__.py +0 -0
  283. viam/gen/robot/v1/robot_grpc.py +208 -0
  284. viam/gen/robot/v1/robot_pb2.py +188 -0
  285. viam/gen/robot/v1/robot_pb2.pyi +1020 -0
  286. viam/gen/service/__init__.py +0 -0
  287. viam/gen/service/datamanager/__init__.py +0 -0
  288. viam/gen/service/datamanager/v1/__init__.py +0 -0
  289. viam/gen/service/datamanager/v1/data_manager_grpc.py +38 -0
  290. viam/gen/service/datamanager/v1/data_manager_pb2.py +28 -0
  291. viam/gen/service/datamanager/v1/data_manager_pb2.pyi +39 -0
  292. viam/gen/service/discovery/__init__.py +0 -0
  293. viam/gen/service/discovery/v1/__init__.py +0 -0
  294. viam/gen/service/discovery/v1/discovery_grpc.py +39 -0
  295. viam/gen/service/discovery/v1/discovery_pb2.py +29 -0
  296. viam/gen/service/discovery/v1/discovery_pb2.pyi +51 -0
  297. viam/gen/service/generic/__init__.py +0 -0
  298. viam/gen/service/generic/v1/__init__.py +0 -0
  299. viam/gen/service/generic/v1/generic_grpc.py +29 -0
  300. viam/gen/service/generic/v1/generic_pb2.py +21 -0
  301. viam/gen/service/generic/v1/generic_pb2.pyi +6 -0
  302. viam/gen/service/mlmodel/__init__.py +0 -0
  303. viam/gen/service/mlmodel/v1/__init__.py +0 -0
  304. viam/gen/service/mlmodel/v1/mlmodel_grpc.py +37 -0
  305. viam/gen/service/mlmodel/v1/mlmodel_pb2.py +83 -0
  306. viam/gen/service/mlmodel/v1/mlmodel_pb2.pyi +480 -0
  307. viam/gen/service/motion/__init__.py +0 -0
  308. viam/gen/service/motion/v1/__init__.py +0 -0
  309. viam/gen/service/motion/v1/motion_grpc.py +87 -0
  310. viam/gen/service/motion/v1/motion_pb2.py +97 -0
  311. viam/gen/service/motion/v1/motion_pb2.pyi +838 -0
  312. viam/gen/service/navigation/__init__.py +0 -0
  313. viam/gen/service/navigation/v1/__init__.py +0 -0
  314. viam/gen/service/navigation/v1/navigation_grpc.py +102 -0
  315. viam/gen/service/navigation/v1/navigation_pb2.py +84 -0
  316. viam/gen/service/navigation/v1/navigation_pb2.pyi +419 -0
  317. viam/gen/service/sensors/__init__.py +0 -0
  318. viam/gen/service/sensors/v1/__init__.py +0 -0
  319. viam/gen/service/sensors/v1/sensors_grpc.py +46 -0
  320. viam/gen/service/sensors/v1/sensors_pb2.py +68 -0
  321. viam/gen/service/sensors/v1/sensors_pb2.pyi +137 -0
  322. viam/gen/service/shell/__init__.py +0 -0
  323. viam/gen/service/shell/v1/__init__.py +0 -0
  324. viam/gen/service/shell/v1/shell_grpc.py +55 -0
  325. viam/gen/service/shell/v1/shell_pb2.py +45 -0
  326. viam/gen/service/shell/v1/shell_pb2.pyi +307 -0
  327. viam/gen/service/slam/__init__.py +0 -0
  328. viam/gen/service/slam/v1/__init__.py +0 -0
  329. viam/gen/service/slam/v1/slam_grpc.py +61 -0
  330. viam/gen/service/slam/v1/slam_pb2.py +51 -0
  331. viam/gen/service/slam/v1/slam_pb2.pyi +213 -0
  332. viam/gen/service/vision/__init__.py +0 -0
  333. viam/gen/service/vision/v1/__init__.py +0 -0
  334. viam/gen/service/vision/v1/vision_grpc.py +87 -0
  335. viam/gen/service/vision/v1/vision_pb2.py +69 -0
  336. viam/gen/service/vision/v1/vision_pb2.pyi +454 -0
  337. viam/gen/stream/__init__.py +0 -0
  338. viam/gen/stream/v1/__init__.py +0 -0
  339. viam/gen/stream/v1/stream_grpc.py +59 -0
  340. viam/gen/stream/v1/stream_pb2.py +39 -0
  341. viam/gen/stream/v1/stream_pb2.pyi +161 -0
  342. viam/gen/tagger/__init__.py +0 -0
  343. viam/gen/tagger/v1/__init__.py +0 -0
  344. viam/gen/tagger/v1/tagger_grpc.py +0 -0
  345. viam/gen/tagger/v1/tagger_pb2.py +16 -0
  346. viam/gen/tagger/v1/tagger_pb2.pyi +15 -0
  347. viam/logging.py +216 -0
  348. viam/media/__init__.py +0 -0
  349. viam/media/audio.py +16 -0
  350. viam/media/utils/__init__.py +0 -0
  351. viam/media/utils/pil/__init__.py +51 -0
  352. viam/media/utils/pil/viam_rgba_plugin.py +73 -0
  353. viam/media/viam_rgba.py +10 -0
  354. viam/media/video.py +217 -0
  355. viam/module/__init__.py +5 -0
  356. viam/module/module.py +281 -0
  357. viam/module/service.py +66 -0
  358. viam/module/types.py +23 -0
  359. viam/operations.py +124 -0
  360. viam/proto/__init__.py +0 -0
  361. viam/proto/app/__init__.py +554 -0
  362. viam/proto/app/agent/__init__.py +28 -0
  363. viam/proto/app/billing.py +58 -0
  364. viam/proto/app/cloudslam/__init__.py +48 -0
  365. viam/proto/app/data/__init__.py +138 -0
  366. viam/proto/app/datapipelines/__init__.py +56 -0
  367. viam/proto/app/dataset/__init__.py +36 -0
  368. viam/proto/app/datasync/__init__.py +44 -0
  369. viam/proto/app/end_user.py +34 -0
  370. viam/proto/app/mlinference/__init__.py +15 -0
  371. viam/proto/app/mltraining/__init__.py +52 -0
  372. viam/proto/app/packages/__init__.py +38 -0
  373. viam/proto/app/robot.py +84 -0
  374. viam/proto/common/__init__.py +66 -0
  375. viam/proto/component/__init__.py +0 -0
  376. viam/proto/component/arm/__init__.py +48 -0
  377. viam/proto/component/audioinput/__init__.py +30 -0
  378. viam/proto/component/base/__init__.py +42 -0
  379. viam/proto/component/board/__init__.py +62 -0
  380. viam/proto/component/button/__init__.py +15 -0
  381. viam/proto/component/camera/__init__.py +46 -0
  382. viam/proto/component/encoder/__init__.py +28 -0
  383. viam/proto/component/gantry/__init__.py +40 -0
  384. viam/proto/component/generic/__init__.py +12 -0
  385. viam/proto/component/gripper/__init__.py +30 -0
  386. viam/proto/component/inputcontroller/__init__.py +38 -0
  387. viam/proto/component/motor/__init__.py +56 -0
  388. viam/proto/component/movementsensor/__init__.py +50 -0
  389. viam/proto/component/posetracker/__init__.py +19 -0
  390. viam/proto/component/powersensor/__init__.py +30 -0
  391. viam/proto/component/sensor/__init__.py +12 -0
  392. viam/proto/component/servo/__init__.py +32 -0
  393. viam/proto/component/switch/__init__.py +26 -0
  394. viam/proto/component/testecho/__init__.py +30 -0
  395. viam/proto/module/__init__.py +38 -0
  396. viam/proto/provisioning/__init__.py +36 -0
  397. viam/proto/robot/__init__.py +130 -0
  398. viam/proto/rpc/__init__.py +0 -0
  399. viam/proto/rpc/auth.py +34 -0
  400. viam/proto/rpc/examples/__init__.py +0 -0
  401. viam/proto/rpc/examples/echo/__init__.py +26 -0
  402. viam/proto/rpc/examples/echoresource/__init__.py +30 -0
  403. viam/proto/rpc/webrtc/__init__.py +0 -0
  404. viam/proto/rpc/webrtc/grpc.py +36 -0
  405. viam/proto/rpc/webrtc/signaling.py +58 -0
  406. viam/proto/service/__init__.py +0 -0
  407. viam/proto/service/datamanager/__init__.py +19 -0
  408. viam/proto/service/discovery/__init__.py +15 -0
  409. viam/proto/service/generic/__init__.py +12 -0
  410. viam/proto/service/mlmodel/__init__.py +54 -0
  411. viam/proto/service/motion/__init__.py +68 -0
  412. viam/proto/service/navigation/__init__.py +58 -0
  413. viam/proto/service/sensors/__init__.py +18 -0
  414. viam/proto/service/shell/__init__.py +36 -0
  415. viam/proto/service/slam/__init__.py +36 -0
  416. viam/proto/service/vision/__init__.py +46 -0
  417. viam/proto/stream/__init__.py +36 -0
  418. viam/proto/tagger/__init__.py +6 -0
  419. viam/py.typed +0 -0
  420. viam/resource/__init__.py +0 -0
  421. viam/resource/base.py +123 -0
  422. viam/resource/easy_resource.py +153 -0
  423. viam/resource/manager.py +126 -0
  424. viam/resource/registry.py +199 -0
  425. viam/resource/rpc_client_base.py +65 -0
  426. viam/resource/rpc_service_base.py +48 -0
  427. viam/resource/types.py +213 -0
  428. viam/robot/__init__.py +0 -0
  429. viam/robot/client.py +909 -0
  430. viam/robot/service.py +69 -0
  431. viam/rpc/__init__.py +0 -0
  432. viam/rpc/dial.py +420 -0
  433. viam/rpc/libviam_rust_utils.dll +0 -0
  434. viam/rpc/server.py +201 -0
  435. viam/rpc/signaling.py +29 -0
  436. viam/rpc/types.py +22 -0
  437. viam/services/__init__.py +0 -0
  438. viam/services/discovery/__init__.py +12 -0
  439. viam/services/discovery/client.py +55 -0
  440. viam/services/discovery/discovery.py +52 -0
  441. viam/services/discovery/service.py +43 -0
  442. viam/services/generic/__init__.py +18 -0
  443. viam/services/generic/client.py +58 -0
  444. viam/services/generic/generic.py +58 -0
  445. viam/services/generic/service.py +29 -0
  446. viam/services/mlmodel/__init__.py +24 -0
  447. viam/services/mlmodel/client.py +37 -0
  448. viam/services/mlmodel/mlmodel.py +78 -0
  449. viam/services/mlmodel/service.py +38 -0
  450. viam/services/mlmodel/utils.py +101 -0
  451. viam/services/motion/__init__.py +17 -0
  452. viam/services/motion/client.py +215 -0
  453. viam/services/motion/motion.py +378 -0
  454. viam/services/motion/service.py +132 -0
  455. viam/services/navigation/__init__.py +11 -0
  456. viam/services/navigation/client.py +99 -0
  457. viam/services/navigation/navigation.py +250 -0
  458. viam/services/navigation/service.py +137 -0
  459. viam/services/service_base.py +78 -0
  460. viam/services/service_client_base.py +46 -0
  461. viam/services/slam/__init__.py +17 -0
  462. viam/services/slam/client.py +62 -0
  463. viam/services/slam/service.py +75 -0
  464. viam/services/slam/slam.py +111 -0
  465. viam/services/vision/__init__.py +15 -0
  466. viam/services/vision/client.py +206 -0
  467. viam/services/vision/service.py +146 -0
  468. viam/services/vision/vision.py +315 -0
  469. viam/sessions_client.py +245 -0
  470. viam/streams.py +44 -0
  471. viam/utils.py +365 -0
  472. viam/version_metadata.py +4 -0
  473. viam_sdk-0.45.2.dist-info/METADATA +157 -0
  474. viam_sdk-0.45.2.dist-info/RECORD +476 -0
  475. viam_sdk-0.45.2.dist-info/WHEEL +4 -0
  476. viam_sdk-0.45.2.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,36 @@
1
+ """
2
+ @generated by Viam.
3
+ Do not edit manually!
4
+ """
5
+
6
+ from ....gen.service.slam.v1.slam_grpc import SLAMServiceBase, SLAMServiceStub, UnimplementedSLAMServiceBase
7
+ from ....gen.service.slam.v1.slam_pb2 import (
8
+ GetInternalStateRequest,
9
+ GetInternalStateResponse,
10
+ GetPointCloudMapRequest,
11
+ GetPointCloudMapResponse,
12
+ GetPositionRequest,
13
+ GetPositionResponse,
14
+ GetPropertiesRequest,
15
+ GetPropertiesResponse,
16
+ MappingMode,
17
+ SensorInfo,
18
+ SensorType,
19
+ )
20
+
21
+ __all__ = [
22
+ "SLAMServiceBase",
23
+ "SLAMServiceStub",
24
+ "UnimplementedSLAMServiceBase",
25
+ "GetInternalStateRequest",
26
+ "GetInternalStateResponse",
27
+ "GetPointCloudMapRequest",
28
+ "GetPointCloudMapResponse",
29
+ "GetPositionRequest",
30
+ "GetPositionResponse",
31
+ "GetPropertiesRequest",
32
+ "GetPropertiesResponse",
33
+ "MappingMode",
34
+ "SensorInfo",
35
+ "SensorType",
36
+ ]
@@ -0,0 +1,46 @@
1
+ """
2
+ @generated by Viam.
3
+ Do not edit manually!
4
+ """
5
+
6
+ from ....gen.service.vision.v1.vision_grpc import UnimplementedVisionServiceBase, VisionServiceBase, VisionServiceStub
7
+ from ....gen.service.vision.v1.vision_pb2 import (
8
+ CaptureAllFromCameraRequest,
9
+ CaptureAllFromCameraResponse,
10
+ Classification,
11
+ Detection,
12
+ GetClassificationsFromCameraRequest,
13
+ GetClassificationsFromCameraResponse,
14
+ GetClassificationsRequest,
15
+ GetClassificationsResponse,
16
+ GetDetectionsFromCameraRequest,
17
+ GetDetectionsFromCameraResponse,
18
+ GetDetectionsRequest,
19
+ GetDetectionsResponse,
20
+ GetObjectPointCloudsRequest,
21
+ GetObjectPointCloudsResponse,
22
+ GetPropertiesRequest,
23
+ GetPropertiesResponse,
24
+ )
25
+
26
+ __all__ = [
27
+ "UnimplementedVisionServiceBase",
28
+ "VisionServiceBase",
29
+ "VisionServiceStub",
30
+ "CaptureAllFromCameraRequest",
31
+ "CaptureAllFromCameraResponse",
32
+ "Classification",
33
+ "Detection",
34
+ "GetClassificationsFromCameraRequest",
35
+ "GetClassificationsFromCameraResponse",
36
+ "GetClassificationsRequest",
37
+ "GetClassificationsResponse",
38
+ "GetDetectionsFromCameraRequest",
39
+ "GetDetectionsFromCameraResponse",
40
+ "GetDetectionsRequest",
41
+ "GetDetectionsResponse",
42
+ "GetObjectPointCloudsRequest",
43
+ "GetObjectPointCloudsResponse",
44
+ "GetPropertiesRequest",
45
+ "GetPropertiesResponse",
46
+ ]
@@ -0,0 +1,36 @@
1
+ """
2
+ @generated by Viam.
3
+ Do not edit manually!
4
+ """
5
+
6
+ from ...gen.stream.v1.stream_grpc import StreamServiceBase, StreamServiceStub, UnimplementedStreamServiceBase
7
+ from ...gen.stream.v1.stream_pb2 import (
8
+ AddStreamRequest,
9
+ AddStreamResponse,
10
+ GetStreamOptionsRequest,
11
+ GetStreamOptionsResponse,
12
+ ListStreamsRequest,
13
+ ListStreamsResponse,
14
+ RemoveStreamRequest,
15
+ RemoveStreamResponse,
16
+ Resolution,
17
+ SetStreamOptionsRequest,
18
+ SetStreamOptionsResponse,
19
+ )
20
+
21
+ __all__ = [
22
+ "StreamServiceBase",
23
+ "StreamServiceStub",
24
+ "UnimplementedStreamServiceBase",
25
+ "AddStreamRequest",
26
+ "AddStreamResponse",
27
+ "GetStreamOptionsRequest",
28
+ "GetStreamOptionsResponse",
29
+ "ListStreamsRequest",
30
+ "ListStreamsResponse",
31
+ "RemoveStreamRequest",
32
+ "RemoveStreamResponse",
33
+ "Resolution",
34
+ "SetStreamOptionsRequest",
35
+ "SetStreamOptionsResponse",
36
+ ]
@@ -0,0 +1,6 @@
1
+ """
2
+ @generated by Viam.
3
+ Do not edit manually!
4
+ """
5
+
6
+ __all__ = []
viam/py.typed ADDED
File without changes
File without changes
viam/resource/base.py ADDED
@@ -0,0 +1,123 @@
1
+ from abc import abstractmethod
2
+ from logging import Logger
3
+ from typing import TYPE_CHECKING, Any, ClassVar, Mapping, Optional, Protocol, runtime_checkable
4
+
5
+ from typing_extensions import Self
6
+
7
+ from viam.operations import Operation
8
+ from viam.proto.common import ResourceName
9
+
10
+ from .types import API
11
+
12
+ if TYPE_CHECKING:
13
+ from viam.robot.client import RobotClient
14
+ from viam.utils import ValueTypes
15
+
16
+
17
+ @runtime_checkable
18
+ class ResourceBase(Protocol):
19
+ """
20
+ The base requirements for a Resource.
21
+ """
22
+
23
+ API: ClassVar["API"]
24
+ """The API of the Resource"""
25
+
26
+ name: str
27
+ """The name of the Resource"""
28
+
29
+ logger: Logger
30
+ """A logger allowing for setting log levels on a per-resource basis"""
31
+
32
+ @classmethod
33
+ def get_resource_name(cls, name: str) -> ResourceName:
34
+ """
35
+ Get the ResourceName for this Resource with the given name
36
+
37
+ ::
38
+
39
+ # Can be used with any resource, using an arm as an example
40
+ my_arm_name = Arm.get_resource_name("my_arm")
41
+
42
+ Args:
43
+ name (str): The name of the Resource
44
+
45
+ Returns:
46
+ ResourceName: The ResourceName of this Resource
47
+ """
48
+ return ResourceName(
49
+ namespace=cls.API.namespace,
50
+ type=cls.API.resource_type,
51
+ subtype=cls.API.resource_subtype,
52
+ name=name,
53
+ )
54
+
55
+ @classmethod
56
+ @abstractmethod
57
+ def from_robot(cls, robot: "RobotClient", name: str) -> Self:
58
+ """Get the Resource named ``name`` from the provided robot.
59
+
60
+ ::
61
+
62
+ # Can be used with any resource, using an arm as an example
63
+ my_arm = Arm.from_robot(robot, "my_arm")
64
+
65
+ Args:
66
+ robot (RobotClient): The robot
67
+ name (str): The name of the Resource
68
+
69
+ Returns:
70
+ Self: The Resource, if it exists on the robot
71
+ """
72
+ ...
73
+
74
+ @abstractmethod
75
+ async def do_command(
76
+ self, command: Mapping[str, "ValueTypes"], *, timeout: Optional[float] = None, **kwargs
77
+ ) -> Mapping[str, "ValueTypes"]:
78
+ """Send/Receive arbitrary commands to the Resource
79
+
80
+ ::
81
+
82
+ command = {"cmd": "test", "data1": 500}
83
+ result = await component.do_command(command)
84
+
85
+ Args:
86
+ command (Mapping[str, ValueTypes]): The command to execute
87
+
88
+ Raises:
89
+ NotImplementedError: Raised if the Resource does not support arbitrary commands
90
+
91
+ Returns:
92
+ Mapping[str, ValueTypes]: Result of the executed command
93
+ """
94
+ ...
95
+
96
+ def get_operation(self, kwargs: Mapping[str, Any]) -> Operation:
97
+ """Get the ``Operation`` associated with the currently running function.
98
+
99
+ When writing custom resources, you should get the ``Operation`` by calling this function and check to see if it's cancelled.
100
+ If the ``Operation`` is cancelled, then you can perform any necessary (terminating long running tasks, cleaning up connections, etc.
101
+ ).
102
+
103
+ Args:
104
+ kwargs (Mapping[str, Any]): The kwargs object containing the operation
105
+
106
+ Returns:
107
+ viam.operations.Operation: The operation associated with this function
108
+ """
109
+ return kwargs.get(Operation.ARG_NAME, Operation._noop())
110
+
111
+ async def close(self):
112
+ """Safely shut down the resource and prevent further use.
113
+
114
+ Close must be idempotent. Later configuration may allow a resource to be "open" again.
115
+ If a resource does not want or need a close function, it is assumed that the resource does not need to return errors when future
116
+ non-Close methods are called.
117
+
118
+ ::
119
+
120
+ await component.close()
121
+
122
+ """
123
+ return
@@ -0,0 +1,153 @@
1
+ import inspect
2
+ import re
3
+ from abc import ABCMeta
4
+ from typing import Callable, ClassVar, Mapping, Sequence, Union
5
+
6
+ from viam.proto.app.robot import ComponentConfig
7
+ from viam.proto.common import ResourceName
8
+
9
+ from .. import logging
10
+ from ..errors import MethodNotImplementedError
11
+ from .base import ResourceBase
12
+ from .registry import Registry, ResourceCreatorRegistration
13
+ from .types import API, Model, ModelFamily
14
+
15
+ modelRegex = re.compile(r"^([^:]+):([^:]+):([^:]+)$")
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ def _parse_model(orig: Union[str, Model]) -> Model:
21
+ "take a model or string and turn it into a Model"
22
+ if isinstance(orig, Model):
23
+ return orig
24
+ match = modelRegex.match(orig)
25
+ if not match:
26
+ raise ValueError(f"MODEL {orig} doesn't match expected format 'org:type:name'")
27
+ *family, name = match.groups()
28
+ return Model(ModelFamily(*family), name)
29
+
30
+
31
+ def _create_stub_fn(name: str, is_async: bool) -> Callable:
32
+ """
33
+ This creates a sync or async stub function which returns a MethodNotImplementedError.
34
+ The stub_model decorator uses these to stub out an abstract base class.
35
+ """
36
+ if is_async:
37
+ # note: this is a pyright bug https://github.com/microsoft/pyright/issues/2136
38
+ async def stub_fn(*args, **kwargs): # pyright: ignore [reportRedeclaration]
39
+ logger.info(f"{name} not implemented")
40
+ raise MethodNotImplementedError(name)
41
+
42
+ else:
43
+
44
+ def stub_fn(*args, **kwargs):
45
+ logger.info(f"{name} not implemented")
46
+ raise MethodNotImplementedError(name)
47
+
48
+ stub_fn.__name__ = f"{name}_stub"
49
+ return stub_fn
50
+
51
+
52
+ def stub_model(cls: ABCMeta) -> ABCMeta:
53
+ """
54
+ Class decorator which adds error implementations of abstract functions. This means they will fail
55
+ when called, rather than the default where they fail when instantiated. This is intended for developers
56
+ who want to build and test incrementally, not for production use.
57
+
58
+ Example:
59
+
60
+ @stub_model
61
+ class MyMotor(Motor, EasyResource):
62
+ MODEL = 'viam:motor:easy-resource-example'
63
+
64
+ Normally this class would fail to instantiate. With the decorator, it will succeed but the unimplemented
65
+ methods will throw errors at runtime.
66
+ """
67
+ for attr in list(cls.__abstractmethods__):
68
+ val = getattr(cls, attr)
69
+ is_async = inspect.iscoroutinefunction(val)
70
+ stub_fn = _create_stub_fn(attr, is_async)
71
+ setattr(cls, attr, stub_fn)
72
+ logger.debug("patched %s.%s with %s", cls, attr, stub_fn)
73
+ cls.__abstractmethods__ -= {attr}
74
+ return cls
75
+
76
+
77
+ class EasyResource:
78
+ """
79
+ EasyResource is a mixin that simplifies the process of creating Viam modules (extension programs)
80
+ and resources (the resource classes provided by those extension programs).
81
+
82
+ Basic usage:
83
+
84
+ ::
85
+
86
+ class MyModel(Sensor, EasyResource):
87
+ MODEL = "my-org:sensor:my-sensor"
88
+
89
+ async def get_readings(self, **kwargs):
90
+ return {"ok": True}
91
+
92
+ See examples/easy_resource/main.py for extended usage.
93
+ """
94
+
95
+ API: ClassVar[API]
96
+ MODEL: ClassVar[Model]
97
+
98
+ def __init_subclass__(cls, register=True, **kwargs):
99
+ """
100
+ When you subclass this mixin, it parses cls.MODEL and registers cls in global registry.
101
+ """
102
+ super().__init_subclass__(**kwargs)
103
+ if not hasattr(cls, "MODEL"):
104
+ raise ValueError("Please define a MODEL with the format 'org:type:name' on your class, for example 'viam:camera:IMX219'")
105
+ cls.MODEL = _parse_model(cls.MODEL)
106
+ if register:
107
+ cls.register()
108
+
109
+ def __init__(self, name: str):
110
+ # note: this mirrors the constructor for ComponentBase and ServiceBase.
111
+ self.name = name
112
+
113
+ @classmethod
114
+ def new(cls, config: ComponentConfig, dependencies: Mapping[ResourceName, ResourceBase]):
115
+ """
116
+ This is passed to register_resource_creator; the default implementation calls reconfigure()
117
+ when an instance of your model is instantiated. You can override this in your subclass.
118
+ """
119
+ self = cls(config.name)
120
+ logger.debug("created %s %s %s", cls.API, cls.MODEL, config.name)
121
+ self.reconfigure(config, dependencies)
122
+ return self
123
+
124
+ @classmethod
125
+ def validate_config(cls, config: ComponentConfig) -> Sequence[str]:
126
+ """This method allows you to validate the configuration object received from the machine,
127
+ as well as to return any implicit dependencies based on that `config`.
128
+
129
+ Args:
130
+ config (ComponentConfig): The configuration for this resource
131
+
132
+ Returns:
133
+ Sequence[str]: A list of implicit dependencies
134
+ """
135
+ return []
136
+
137
+ @classmethod
138
+ def register(cls):
139
+ """
140
+ This adds the model to the global registry. It is called by __init_subclass__ and you typically
141
+ won't call it directly.
142
+ """
143
+ logger.debug("registering %s %s", cls.API, cls.MODEL)
144
+ # note: We could fix this pyright-ignore if EasyResource inherited ResourceBase, but that crashes in the mro()
145
+ # walk in ResourceManager.register.
146
+ Registry.register_resource_creator(
147
+ cls.API,
148
+ cls.MODEL,
149
+ ResourceCreatorRegistration(cls.new, cls.validate_config), # pyright: ignore [reportArgumentType]
150
+ )
151
+
152
+ def reconfigure(self, config: ComponentConfig, dependencies: Mapping[ResourceName, ResourceBase]):
153
+ logger.debug("reconfigure %s %s", self.API, self.MODEL)
@@ -0,0 +1,126 @@
1
+ from threading import RLock
2
+ from typing import Dict, List, Type, TypeVar
3
+
4
+ from viam.logging import getLogger
5
+ from viam.proto.common import ResourceName
6
+ from viam.resource.base import ResourceBase
7
+ from viam.resource.registry import Registry
8
+
9
+ from ..components.component_base import ComponentBase
10
+ from ..errors import DuplicateResourceError, ResourceNotFoundError
11
+ from ..services.service_base import ServiceBase
12
+
13
+ LOGGER = getLogger(__name__)
14
+ ResourceType = TypeVar("ResourceType", bound=ResourceBase)
15
+
16
+
17
+ class ResourceManager:
18
+ """
19
+ Registry containing all components registered to this server.
20
+ """
21
+
22
+ resources: Dict[ResourceName, ResourceBase]
23
+ _short_to_long_name: Dict[str, List[ResourceName]]
24
+ _lock: RLock
25
+
26
+ def __init__(self, components: List[ResourceBase] = []) -> None:
27
+ self._lock = RLock()
28
+ self.resources = {}
29
+ self._short_to_long_name = {}
30
+ for component in components:
31
+ self.register(component)
32
+
33
+ def register(self, resource: ResourceBase):
34
+ """
35
+ Register a new resource with the registry.
36
+ Resources may not have the same name.
37
+ If a resource is remote and the short name is unique, save a short name version.
38
+
39
+ Raises:
40
+ DuplicateResourceError: Error if attempting to register resource
41
+ with the name of an existing resource
42
+ ResourceNotFoundError: Raised if the API of the resource is not registered
43
+
44
+ Args:
45
+ resource (ResourceBase): The resource to register
46
+ """
47
+ Registry.lookup_api(resource.API) # confirm the API is registered in Registry
48
+
49
+ _BaseClasses = (ResourceBase, ComponentBase, ServiceBase)
50
+ rnames: Dict[ResourceName, ResourceBase] = {}
51
+ for subtype in resource.__class__.mro():
52
+ if subtype in _BaseClasses:
53
+ continue
54
+ if hasattr(subtype, "get_resource_name"):
55
+ rn = subtype.get_resource_name(resource.name) # type: ignore
56
+ rnames[rn] = resource
57
+ for rn in rnames:
58
+ if ":" in rn.name:
59
+ short_name = rn.name.split(":")[-1]
60
+ if short_name in self._short_to_long_name and rn not in self._short_to_long_name[short_name]:
61
+ self._short_to_long_name[short_name].append(rn)
62
+ elif short_name not in self._short_to_long_name:
63
+ self._short_to_long_name[short_name] = [rn]
64
+
65
+ if rnames.keys() & self.resources.keys():
66
+ raise DuplicateResourceError(resource.name)
67
+
68
+ with self._lock:
69
+ self.resources.update(rnames)
70
+
71
+ def get_resource(self, of_type: Type[ResourceType], name: ResourceName) -> ResourceType:
72
+ """
73
+ Return a resource from the registry.
74
+ If a unique short name version is given, return a remote resource with the name.
75
+
76
+ Args:
77
+ of_type (Type[ResourceType]): The type of the resource
78
+ name (viam.proto.common.ResourceName): The name of the resource
79
+
80
+ Raises:
81
+ ResourceNotFoundError: Error if resource with the given type
82
+ and name does not exist in the registry
83
+
84
+ Returns:
85
+ ResourceType: The resource
86
+ """
87
+ with self._lock:
88
+ resource = self.resources.get(name, None)
89
+ if resource and isinstance(resource, of_type):
90
+ return resource
91
+
92
+ if name.name in self._short_to_long_name and len(self._short_to_long_name[name.name]) == 1:
93
+ return self.get_resource(of_type, self._short_to_long_name[name.name][0])
94
+ raise ResourceNotFoundError(name.subtype, name.name)
95
+
96
+ async def remove_resource(self, name: ResourceName):
97
+ """Remove the resource with the specified ```ResourceName```.
98
+
99
+ Args:
100
+ name (viam.proto.common.ResourceName): The ResourceName of the resource
101
+ """
102
+ with self._lock:
103
+ try:
104
+ resource = self.resources[name]
105
+ await resource.close()
106
+ except Exception as e:
107
+ raise e
108
+ finally:
109
+ del self.resources[name]
110
+
111
+ async def close(self):
112
+ """Close the resourcce manager by removing all resources.
113
+ Please note that any errors will not raise an exception. Errors will still be logged."""
114
+ rns = [key for key in self.resources.keys()]
115
+ with self._lock:
116
+ for rn in rns:
117
+ try:
118
+ await self.remove_resource(rn)
119
+ except Exception as e:
120
+ LOGGER.error(f"Error while closing {rn.name}:", e)
121
+
122
+ def _resource_by_name_only(self, name: str) -> ResourceBase:
123
+ for rname, resource in self.resources.items():
124
+ if rname.name == name:
125
+ return resource
126
+ raise ResourceNotFoundError("resource", name)