valetudo-map-parser 0.1.10rc5__py3-none-any.whl → 0.1.10rc7__py3-none-any.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.
@@ -5,7 +5,7 @@ from time import time
5
5
  import hashlib
6
6
  import json
7
7
  from dataclasses import dataclass
8
- from typing import Callable, List, Optional
8
+ from typing import Callable, List, Optional, Tuple
9
9
  import io
10
10
 
11
11
  import numpy as np
@@ -23,6 +23,7 @@ from .types import (
23
23
  NumpyArray,
24
24
  PilPNG,
25
25
  RobotPosition,
26
+ Destinations,
26
27
  )
27
28
  from ..map_data import HyperMapData
28
29
  from .async_utils import AsyncNumPy
@@ -91,9 +92,9 @@ class BaseHandler:
91
92
  async def async_get_image(
92
93
  self,
93
94
  m_json: dict | None,
94
- destinations: list | None = None,
95
+ destinations: Destinations | None = None,
95
96
  bytes_format: bool = False,
96
- ) -> PilPNG | bytes:
97
+ ) -> Tuple[PilPNG | bytes, dict]:
97
98
  """
98
99
  Unified async function to get PIL image from JSON data for both Hypfer and Rand256 handlers.
99
100
 
@@ -108,7 +109,7 @@ class BaseHandler:
108
109
  @param bytes_format: If True, also convert to PNG bytes and store in shared.binary_image
109
110
  @param text_enabled: If True, draw text on the image
110
111
  @param vacuum_status: Vacuum status to display on the image
111
- @return: PIL Image or None
112
+ @return: PIL Image or None and data dictionary
112
113
  """
113
114
  try:
114
115
  # Backup current image to last_image before processing new one
@@ -122,6 +123,7 @@ class BaseHandler:
122
123
  m_json=m_json,
123
124
  destinations=destinations,
124
125
  )
126
+
125
127
  elif hasattr(self, "async_get_image_from_json"):
126
128
  # This is a Hypfer handler
127
129
  self.json_data = await HyperMapData.async_from_valetudo_json(m_json)
@@ -141,7 +143,10 @@ class BaseHandler:
141
143
 
142
144
  # Store the new image in shared data
143
145
  if new_image is not None:
146
+ # Update shared data
147
+ await self._async_update_shared_data(destinations)
144
148
  self.shared.new_image = new_image
149
+ # Add text to the image
145
150
  if self.shared.show_vacuum_state:
146
151
  text_editor = StatusText(self.shared)
147
152
  img_text = await text_editor.get_status_text(new_image)
@@ -160,18 +165,22 @@ class BaseHandler:
160
165
  self.shared.binary_image = pil_to_png_bytes(self.shared.last_image)
161
166
  # Update the timestamp with current datetime
162
167
  self.shared.image_last_updated = datetime.datetime.fromtimestamp(time())
163
- return new_image
168
+ LOGGER.debug("%s: Frame Completed.", self.file_name)
169
+ data = {}
170
+ if bytes_format:
171
+ data = self.shared.to_dict()
172
+ return new_image, data
164
173
  else:
165
174
  LOGGER.warning(
166
175
  "%s: Failed to generate image from JSON data", self.file_name
167
176
  )
168
177
  if bytes_format and hasattr(self.shared, "last_image"):
169
- return pil_to_png_bytes(self.shared.last_image)
178
+ return pil_to_png_bytes(self.shared.last_image), {}
170
179
  return (
171
180
  self.shared.last_image
172
181
  if hasattr(self.shared, "last_image")
173
182
  else None
174
- )
183
+ ), {}
175
184
 
176
185
  except Exception as e:
177
186
  LOGGER.warning(
@@ -184,14 +193,55 @@ class BaseHandler:
184
193
  self.shared.last_image if hasattr(self.shared, "last_image") else None
185
194
  )
186
195
 
187
- def prepare_resize_params(self, pil_img: PilPNG, rand: bool=False) -> ResizeParams:
196
+ async def _async_update_shared_data(self, destinations: Destinations | None = None):
197
+ """Update the shared data with the latest information."""
198
+
199
+ if hasattr(self, "get_rooms_attributes") and (
200
+ self.shared.map_rooms is None and destinations is not None
201
+ ):
202
+ (self.shared.map_rooms,) = await self.get_rooms_attributes(destinations)
203
+ if self.shared.map_rooms:
204
+ LOGGER.debug("%s: Rand256 attributes rooms updated", self.file_name)
205
+
206
+ if hasattr(self, "async_get_rooms_attributes") and (
207
+ self.shared.map_rooms is None
208
+ ):
209
+ if self.shared.map_rooms is None:
210
+ self.shared.map_rooms = await self.async_get_rooms_attributes()
211
+ if self.shared.map_rooms:
212
+ LOGGER.debug("%s: Hyper attributes rooms updated", self.file_name)
213
+
214
+ if (
215
+ hasattr(self, "get_calibration_data")
216
+ and self.shared.attr_calibration_points is None
217
+ ):
218
+ self.shared.attr_calibration_points = self.get_calibration_data(
219
+ self.shared.image_rotate
220
+ )
221
+
222
+ if not self.shared.image_size:
223
+ self.shared.image_size = self.get_img_size()
224
+
225
+ self.shared.vac_json_id = self.get_json_id()
226
+
227
+ if not self.shared.charger_position:
228
+ self.shared.charger_position = self.get_charger_position()
229
+
230
+ self.shared.current_room = self.get_robot_position()
231
+
232
+ def prepare_resize_params(
233
+ self, pil_img: PilPNG, rand: bool = False
234
+ ) -> ResizeParams:
188
235
  """Prepare resize parameters for image resizing."""
189
236
  if self.shared.image_rotate in [0, 180]:
190
237
  width, height = pil_img.size
191
238
  else:
192
239
  height, width = pil_img.size
193
- LOGGER.debug("Shared PIL image size: %s x %s", self.shared.image_ref_width,
194
- self.shared.image_ref_height)
240
+ LOGGER.debug(
241
+ "Shared PIL image size: %s x %s",
242
+ self.shared.image_ref_width,
243
+ self.shared.image_ref_height,
244
+ )
195
245
  return ResizeParams(
196
246
  pil_img=pil_img,
197
247
  width=width,
@@ -14,7 +14,6 @@ from PIL import Image
14
14
 
15
15
  from .config.async_utils import AsyncPIL
16
16
 
17
- # from .config.auto_crop import AutoCrop
18
17
  from mvcrender.autocrop import AutoCrop
19
18
  from .config.drawable_elements import DrawableElement
20
19
  from .config.shared import CameraShared
@@ -60,7 +59,6 @@ class HypferMapImageHandler(BaseHandler, AutoCrop):
60
59
  None # persistent working buffer to avoid per-frame allocations
61
60
  )
62
61
  self.active_zones = [] # vacuum active zones.
63
- self.svg_wait = False # SVG image creation wait.
64
62
  self.imd = ImDraw(self) # Image Draw class.
65
63
  self.color_grey = (128, 128, 128, 255)
66
64
  self.file_name = self.shared.file_name # file name of the vacuum.
@@ -362,7 +360,7 @@ class HypferMapImageHandler(BaseHandler, AutoCrop):
362
360
  self.zooming = self.imd.img_h.zooming
363
361
 
364
362
  # Resize the image
365
- img_np_array = self.async_auto_trim_and_zoom_image(
363
+ img_np_array = self.auto_trim_and_zoom_image(
366
364
  img_np_array,
367
365
  colors["background"],
368
366
  int(self.shared.margins),
@@ -409,11 +407,10 @@ class HypferMapImageHandler(BaseHandler, AutoCrop):
409
407
  )
410
408
  return self.room_propriety
411
409
 
412
- def get_calibration_data(self) -> CalibrationPoints:
410
+ def get_calibration_data(self, rotation_angle: int = 0) -> CalibrationPoints:
413
411
  """Get the calibration data from the JSON data.
414
412
  this will create the attribute calibration points."""
415
413
  calibration_data = []
416
- rotation_angle = self.shared.image_rotate
417
414
  LOGGER.info("Getting %s Calibrations points.", self.file_name)
418
415
 
419
416
  # Define the map points (fixed)
@@ -539,16 +539,17 @@ class RandImageData:
539
539
  return None
540
540
 
541
541
  @staticmethod
542
- def get_rrm_currently_cleaned_zones(json_data: JsonType) -> dict:
542
+ def get_rrm_currently_cleaned_zones(json_data: JsonType) -> list[dict[str, Any]]:
543
543
  """Get the currently cleaned zones from the json."""
544
544
  re_zones = json_data.get("currently_cleaned_zones", [])
545
545
  formatted_zones = RandImageData._rrm_valetudo_format_zone(re_zones)
546
546
  return formatted_zones
547
547
 
548
548
  @staticmethod
549
- def get_rrm_forbidden_zones(json_data: JsonType) -> dict:
549
+ def get_rrm_forbidden_zones(json_data: JsonType) -> list[dict[str, Any]]:
550
550
  """Get the forbidden zones from the json."""
551
551
  re_zones = json_data.get("forbidden_zones", [])
552
+ re_zones.extend(json_data.get("forbidden_mop_zones", []))
552
553
  formatted_zones = RandImageData._rrm_valetudo_format_zone(re_zones)
553
554
  return formatted_zones
554
555
 
@@ -709,7 +710,7 @@ class HyperMapData:
709
710
  """Class to handle the map data snapshots."""
710
711
 
711
712
  json_data: Any = None
712
- json_id: str = "" or None
713
+ json_id: Optional[str] = None
713
714
  obstacles: dict[str, list[Any]] = field(default_factory=dict)
714
715
  paths: dict[str, list[Any]] = field(default_factory=dict)
715
716
  image_size: dict[str, int | list[int]] = field(default_factory=dict)
@@ -7,7 +7,6 @@ Version: 0.1.9.a6
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
- import logging
11
10
  import uuid
12
11
  from typing import Any
13
12
 
@@ -15,7 +14,6 @@ import numpy as np
15
14
 
16
15
  from .config.async_utils import AsyncPIL
17
16
 
18
- # from .config.auto_crop import AutoCrop
19
17
  from mvcrender.autocrop import AutoCrop
20
18
  from .config.drawable_elements import DrawableElement
21
19
  from .config.types import (
@@ -28,6 +26,7 @@ from .config.types import (
28
26
  RobotPosition,
29
27
  RoomsProperties,
30
28
  RoomStore,
29
+ LOGGER,
31
30
  )
32
31
  from .config.utils import (
33
32
  BaseHandler,
@@ -39,9 +38,6 @@ from .reimg_draw import ImageDraw
39
38
  from .rooms_handler import RandRoomsHandler
40
39
 
41
40
 
42
- _LOGGER = logging.getLogger(__name__)
43
-
44
-
45
41
  # noinspection PyTypeChecker
46
42
  class ReImageHandler(BaseHandler, AutoCrop):
47
43
  """
@@ -112,17 +108,17 @@ class ReImageHandler(BaseHandler, AutoCrop):
112
108
  self.shared.map_rooms = room_ids
113
109
 
114
110
  # get the zones and points data
115
- zone_properties = await self.async_zone_propriety(zones_data)
111
+ self.shared.map_pred_zones = await self.async_zone_propriety(zones_data)
116
112
  # get the points data
117
- point_properties = await self.async_points_propriety(points_data)
113
+ self.shared.map_pred_points = await self.async_points_propriety(points_data)
118
114
 
119
- if not (room_properties or zone_properties):
115
+ if not (room_properties or self.shared.map_pred_zones):
120
116
  self.rooms_pos = None
121
117
 
122
118
  rooms = RoomStore(self.file_name, room_properties)
123
- return room_properties, zone_properties, point_properties
119
+ return room_properties
124
120
  except (RuntimeError, ValueError) as e:
125
- _LOGGER.warning(
121
+ LOGGER.warning(
126
122
  "No rooms Data or Error in extract_room_properties: %s",
127
123
  e,
128
124
  exc_info=True,
@@ -146,12 +142,12 @@ class ReImageHandler(BaseHandler, AutoCrop):
146
142
 
147
143
  try:
148
144
  if (m_json is not None) and (not isinstance(m_json, tuple)):
149
- _LOGGER.info("%s: Composing the image for the camera.", self.file_name)
145
+ LOGGER.info("%s: Composing the image for the camera.", self.file_name)
150
146
  self.json_data = m_json
151
147
  size_x, size_y = self.data.get_rrm_image_size(m_json)
152
148
  self.img_size = DEFAULT_IMAGE_SIZE
153
149
  self.json_id = str(uuid.uuid4()) # image id
154
- _LOGGER.info("Vacuum Data ID: %s", self.json_id)
150
+ LOGGER.info("Vacuum Data ID: %s", self.json_id)
155
151
 
156
152
  (
157
153
  img_np_array,
@@ -178,7 +174,7 @@ class ReImageHandler(BaseHandler, AutoCrop):
178
174
  return await self._finalize_image(pil_img)
179
175
 
180
176
  except (RuntimeError, RuntimeWarning) as e:
181
- _LOGGER.warning(
177
+ LOGGER.warning(
182
178
  "%s: Runtime Error %s during image creation.",
183
179
  self.file_name,
184
180
  str(e),
@@ -214,7 +210,7 @@ class ReImageHandler(BaseHandler, AutoCrop):
214
210
  colors["background"],
215
211
  DEFAULT_PIXEL_SIZE,
216
212
  )
217
- _LOGGER.info("%s: Completed base Layers", self.file_name)
213
+ LOGGER.info("%s: Completed base Layers", self.file_name)
218
214
 
219
215
  # Update element map for rooms
220
216
  if 0 < room_id <= 15:
@@ -350,7 +346,7 @@ class ReImageHandler(BaseHandler, AutoCrop):
350
346
  else:
351
347
  self.zooming = False
352
348
 
353
- img_np_array = self.async_auto_trim_and_zoom_image(
349
+ img_np_array = self.auto_trim_and_zoom_image(
354
350
  img_np_array,
355
351
  detect_colour=colors["background"],
356
352
  margin_size=int(self.shared.margins),
@@ -362,7 +358,7 @@ class ReImageHandler(BaseHandler, AutoCrop):
362
358
 
363
359
  async def _finalize_image(self, pil_img):
364
360
  if not self.shared.image_ref_width or not self.shared.image_ref_height:
365
- _LOGGER.warning(
361
+ LOGGER.warning(
366
362
  "Image finalization failed: Invalid image dimensions. Returning original image."
367
363
  )
368
364
  return pil_img
@@ -515,7 +511,7 @@ class ReImageHandler(BaseHandler, AutoCrop):
515
511
  """Return the map calibration data."""
516
512
  if not self.calibration_data and self.crop_img_size:
517
513
  self.calibration_data = []
518
- _LOGGER.info(
514
+ LOGGER.info(
519
515
  "%s: Getting Calibrations points %s",
520
516
  self.file_name,
521
517
  str(self.crop_area),
@@ -6,17 +6,12 @@ Version: 0.1.9.b42
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- import logging
10
-
11
9
  from .config.drawable import Drawable
12
10
  from .config.drawable_elements import DrawableElement
13
- from .config.types import Color, JsonType, NumpyArray
11
+ from .config.types import Color, JsonType, NumpyArray, LOGGER
14
12
  from .map_data import ImageData, RandImageData
15
13
 
16
14
 
17
- _LOGGER = logging.getLogger(__name__)
18
-
19
-
20
15
  class ImageDraw:
21
16
  """Class to handle the image creation."""
22
17
 
@@ -48,7 +43,7 @@ class ImageDraw:
48
43
  )
49
44
  return np_array
50
45
  except KeyError as e:
51
- _LOGGER.warning(
46
+ LOGGER.warning(
52
47
  "%s: Error in extraction of go-to target: %s",
53
48
  self.file_name,
54
49
  e,
@@ -70,7 +65,7 @@ class ImageDraw:
70
65
  )
71
66
  except ValueError as e:
72
67
  self.img_h.segment_data = None
73
- _LOGGER.info("%s: No segments data found: %s", self.file_name, e)
68
+ LOGGER.info("%s: No segments data found: %s", self.file_name, e)
74
69
 
75
70
  async def async_draw_base_layer(
76
71
  self,
@@ -87,13 +82,13 @@ class ImageDraw:
87
82
  walls_data = self.data.get_rrm_walls(m_json)
88
83
  floor_data = self.data.get_rrm_floor(m_json)
89
84
 
90
- _LOGGER.info("%s: Empty image with background color", self.file_name)
85
+ LOGGER.info("%s: Empty image with background color", self.file_name)
91
86
  img_np_array = await self.draw.create_empty_image(
92
87
  self.img_h.img_size["x"], self.img_h.img_size["y"], color_background
93
88
  )
94
89
  room_id = 0
95
90
  if self.img_h.frame_number == 0:
96
- _LOGGER.info("%s: Overlapping Layers", self.file_name)
91
+ LOGGER.info("%s: Overlapping Layers", self.file_name)
97
92
 
98
93
  # checking if there are segments too (sorted pixels in the raw data).
99
94
  await self.async_segment_data(m_json, size_x, size_y, pos_top, pos_left)
@@ -148,10 +143,10 @@ class ImageDraw:
148
143
  room_id = 0
149
144
  rooms_list = [color_wall]
150
145
  if not segment_data:
151
- _LOGGER.info("%s: No segments data found.", self.file_name)
146
+ LOGGER.info("%s: No segments data found.", self.file_name)
152
147
  return room_id, img_np_array
153
148
 
154
- _LOGGER.info("%s: Drawing segments.", self.file_name)
149
+ LOGGER.info("%s: Drawing segments.", self.file_name)
155
150
  for pixels in segment_data:
156
151
  room_color = self.img_h.shared.rooms_colors[room_id]
157
152
  rooms_list.append(room_color)
@@ -211,7 +206,7 @@ class ImageDraw:
211
206
  self.data.get_rrm_charger_position(m_json)
212
207
  )
213
208
  except KeyError as e:
214
- _LOGGER.warning("%s: No charger position found: %s", self.file_name, e)
209
+ LOGGER.warning("%s: No charger position found: %s", self.file_name, e)
215
210
  else:
216
211
  if charger_pos:
217
212
  charger_pos_dictionary = {
@@ -238,7 +233,7 @@ class ImageDraw:
238
233
  zone_clean = None
239
234
 
240
235
  if zone_clean:
241
- _LOGGER.info("%s: Got zones.", self.file_name)
236
+ LOGGER.info("%s: Got zones.", self.file_name)
242
237
  return await self.draw.zones(np_array, zone_clean, color_zone_clean)
243
238
  return np_array
244
239
 
@@ -252,7 +247,7 @@ class ImageDraw:
252
247
  virtual_walls = None
253
248
 
254
249
  if virtual_walls:
255
- _LOGGER.info("%s: Got virtual walls.", self.file_name)
250
+ LOGGER.info("%s: Got virtual walls.", self.file_name)
256
251
  np_array = await self.draw.draw_virtual_walls(
257
252
  np_array, virtual_walls, color_no_go
258
253
  )
@@ -280,7 +275,7 @@ class ImageDraw:
280
275
  self.data.rrm_valetudo_path_array(path_pixel["points"]), 2
281
276
  )
282
277
  except KeyError as e:
283
- _LOGGER.warning(
278
+ LOGGER.warning(
284
279
  "%s: Error extracting paths data: %s", self.file_name, str(e)
285
280
  )
286
281
  finally:
@@ -297,7 +292,7 @@ class ImageDraw:
297
292
  except (ValueError, KeyError):
298
293
  entity_dict = None
299
294
  else:
300
- _LOGGER.info("%s: Got the points in the json.", self.file_name)
295
+ LOGGER.info("%s: Got the points in the json.", self.file_name)
301
296
  return entity_dict
302
297
 
303
298
  async def async_get_robot_position(self, m_json: JsonType) -> tuple | None:
@@ -310,7 +305,7 @@ class ImageDraw:
310
305
  robot_pos = self.data.rrm_coordinates_to_valetudo(robot_pos_data)
311
306
  angle = self.data.get_rrm_robot_angle(m_json)
312
307
  except (ValueError, KeyError):
313
- _LOGGER.warning("%s No robot position found.", self.file_name)
308
+ LOGGER.warning("%s No robot position found.", self.file_name)
314
309
  return None, None, None
315
310
  finally:
316
311
  robot_position_angle = round(angle[0], 0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valetudo-map-parser
3
- Version: 0.1.10rc5
3
+ Version: 0.1.10rc7
4
4
  Summary: A Python library to parse Valetudo map data returning a PIL Image object.
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Classifier: Programming Language :: Python :: 3.14
15
15
  Requires-Dist: Pillow (>=10.3.0)
16
- Requires-Dist: mvcrender (>=0.0.2)
16
+ Requires-Dist: mvcrender (>=0.0.4)
17
17
  Requires-Dist: numpy (>=1.26.4)
18
18
  Requires-Dist: scipy (>=1.12.0)
19
19
  Project-URL: Bug Tracker, https://github.com/sca075/Python-package-valetudo-map-parser/issues
@@ -15,22 +15,21 @@ valetudo_map_parser/config/fonts/NotoKufiArabic-VF.ttf,sha256=NaIy40eLx7d3ts0kue
15
15
  valetudo_map_parser/config/fonts/NotoSansCJKhk-VF.ttf,sha256=xIXXLKCJzmWoPEg8HdvxeRgotMjjxF6l6ugGP-IWRJU,36135040
16
16
  valetudo_map_parser/config/fonts/NotoSansKhojki.ttf,sha256=XJWzSmpN-Ql6jTfTvFojP_JkCHOztQvixQc1_7hPWrc,107388
17
17
  valetudo_map_parser/config/optimized_element_map.py,sha256=52BCnkvVv9bre52LeVIfT8nhnEIpc0TuWTv1xcNu0Rk,15744
18
- valetudo_map_parser/config/rand256_parser.py,sha256=LU3y7XvRRQxVen9iwom0dOaDnJJvhZdg97NqOYRZFas,16279
19
- valetudo_map_parser/config/shared.py,sha256=lvO3gz7aIVNCJ_K27S2Eh2yZcc5vdHI3WNG1KnyFOdg,13213
18
+ valetudo_map_parser/config/rand256_parser.py,sha256=jsUiuShrNY3UpgfdEMgmTJjH6fj-lC-0y2TdIt43aG0,20161
19
+ valetudo_map_parser/config/shared.py,sha256=58R6kaYl7RF0ESTIKarVy8pB1jo4LUlPHTb27_ubZFo,11789
20
20
  valetudo_map_parser/config/status_text/status_text.py,sha256=PaynYW11vXH_vhDxhZrR9j-xeDrCxbB6YQQtN-kcaxQ,4052
21
21
  valetudo_map_parser/config/status_text/translations.py,sha256=mmPbJkl_2A59w49wnesQf3ocXqwZxBsrqNX-yt5FSCQ,9132
22
- valetudo_map_parser/config/types.py,sha256=WfmTy8gPFU45ILLgqY20xeblHHmoWzeyVlPTD-N_cdo,17395
23
- valetudo_map_parser/config/utils.py,sha256=PrXrtRqcN0zhANRZz1Djr8F1L0qmo5p1EBfyfbPh7-E,36745
22
+ valetudo_map_parser/config/types.py,sha256=vSJjEsosbx9ZaM_JEuqhdzFIHnf97bfzDBMvx_V3U0s,18067
23
+ valetudo_map_parser/config/utils.py,sha256=sk6Vy3_QpJhX9Hvb6S36Womyu0n8bfxWejfuNEaEM-I,38658
24
24
  valetudo_map_parser/hypfer_draw.py,sha256=4zajujSOvtpRI_GMlmlioM3mDo19MvuOP861LhZmVlw,22495
25
- valetudo_map_parser/hypfer_handler.py,sha256=bGqeOyrBp8swJAXnMlIqlpYaS4yf98F_qwoKe1ksu4Y,20607
26
- valetudo_map_parser/hypfer_rooms_handler.py,sha256=NkpOA6Gdq-2D3lLAxvtNuuWMvPXHxeMY2TO5RZLSHlU,22652
27
- valetudo_map_parser/map_data.py,sha256=gVW_QhUcz-fZOM1ltSynTxZRHgu7yGjvZp8zUfd0ClA,27253
25
+ valetudo_map_parser/hypfer_handler.py,sha256=8g2zitibQkgVh-crqDO41kp1DQzZaMMixUdFqgPjfis,20477
26
+ valetudo_map_parser/map_data.py,sha256=OSscuvlYpAZ9q7pfjzIjh98UvT0PV8zjPk5eUEwmLb8,27355
28
27
  valetudo_map_parser/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- valetudo_map_parser/rand256_handler.py,sha256=tWTxWef-FTIs4XaEy7W-m88ABQYC8xPZUZFrBBCE2Rk,21603
30
- valetudo_map_parser/reimg_draw.py,sha256=a93UPwcVl5y9mXMY5DsNWD4_pXzm1QhC_n_WOokhEAE,12534
28
+ valetudo_map_parser/rand256_handler.py,sha256=jpbvhNr2tm6Gp1Xs7yMMLwjCN1dOnNUtED7MrjnH4Os,21504
29
+ valetudo_map_parser/reimg_draw.py,sha256=tDQGMDTYprgPZjETxws3rzgVfpPxm_K-armzYFyGzGw,12474
31
30
  valetudo_map_parser/rooms_handler.py,sha256=tE8BrXcdL0SeFAYsdFvjR3NVDfDi2RPKnXw9jD1e5k8,17494
32
- valetudo_map_parser-0.1.10rc5.dist-info/METADATA,sha256=hyUHXw787tVf6B-3pRSwtZsESy-LjaQFqmOMxe4CU0k,3404
33
- valetudo_map_parser-0.1.10rc5.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
34
- valetudo_map_parser-0.1.10rc5.dist-info/licenses/LICENSE,sha256=Lh-qBbuRV0-jiCIBhfV7NgdwFxQFOXH3BKOzK865hRs,10480
35
- valetudo_map_parser-0.1.10rc5.dist-info/licenses/NOTICE.txt,sha256=5lTOuWiU9aiEnJ2go8sc7lTJ7ntMBx0g0GFnNrswCY4,2533
36
- valetudo_map_parser-0.1.10rc5.dist-info/RECORD,,
31
+ valetudo_map_parser-0.1.10rc7.dist-info/METADATA,sha256=NPYlwO902_zvejWWjfzzjOkTVyn_CoquAG9zs1cRG0E,3404
32
+ valetudo_map_parser-0.1.10rc7.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
33
+ valetudo_map_parser-0.1.10rc7.dist-info/licenses/LICENSE,sha256=Lh-qBbuRV0-jiCIBhfV7NgdwFxQFOXH3BKOzK865hRs,10480
34
+ valetudo_map_parser-0.1.10rc7.dist-info/licenses/NOTICE.txt,sha256=5lTOuWiU9aiEnJ2go8sc7lTJ7ntMBx0g0GFnNrswCY4,2533
35
+ valetudo_map_parser-0.1.10rc7.dist-info/RECORD,,