simo 2.7.1__py3-none-any.whl → 2.7.3__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.

Potentially problematic release.


This version of simo might be problematic. Click here for more details.

simo/core/controllers.py CHANGED
@@ -608,6 +608,15 @@ class Dimmer(ControllerBase, TimerMixin, OnOffPokerMixin):
608
608
  else:
609
609
  self.turn_on()
610
610
 
611
+ def fade_up(self):
612
+ raise NotImplemented()
613
+
614
+ def fade_down(self):
615
+ raise NotImplemented()
616
+
617
+ def fade_stop(self):
618
+ raise NotImplemented()
619
+
611
620
 
612
621
  class DimmerPlus(ControllerBase, TimerMixin, OnOffPokerMixin):
613
622
  name = _("Dimmer Plus")
@@ -689,6 +698,16 @@ class DimmerPlus(ControllerBase, TimerMixin, OnOffPokerMixin):
689
698
  self.turn_on()
690
699
 
691
700
 
701
+ def fade_up(self):
702
+ raise NotImplemented()
703
+
704
+ def fade_down(self):
705
+ raise NotImplemented()
706
+
707
+ def fade_stop(self):
708
+ raise NotImplemented()
709
+
710
+
692
711
  class RGBWLight(ControllerBase, TimerMixin, OnOffPokerMixin):
693
712
  name = _("RGB(W) Light")
694
713
  base_type = 'rgbw-light'
@@ -747,6 +766,16 @@ class RGBWLight(ControllerBase, TimerMixin, OnOffPokerMixin):
747
766
  self.send(self.component.value)
748
767
 
749
768
 
769
+ def fade_up(self):
770
+ raise NotImplemented()
771
+
772
+ def fade_down(self):
773
+ raise NotImplemented()
774
+
775
+ def fade_stop(self):
776
+ raise NotImplemented()
777
+
778
+
750
779
  class MultiSwitchBase(ControllerBase):
751
780
 
752
781
  def _validate_val(self, value, occasion=None):
Binary file
simo/fleet/forms.py CHANGED
@@ -306,6 +306,12 @@ class ColonelButtonConfigForm(ColonelComponentForm):
306
306
  ('up', "UP (On +5V delivery)")
307
307
  )
308
308
  )
309
+ btn_type = forms.ChoiceField(
310
+ label="Type", initial='momentary',
311
+ choices=(
312
+ ('momentary', "Momentary"), ('toggle', "Toggle")
313
+ )
314
+ )
309
315
 
310
316
  def __init__(self, *args, **kwargs):
311
317
  super().__init__(*args, **kwargs)
@@ -33,6 +33,7 @@ from .app_widgets import (
33
33
  WeatherWidget
34
34
  )
35
35
  from .forms import (
36
+ DimmableLightsGroupConfigForm, SwitchGroupConfigForm,
36
37
  ThermostatConfigForm, AlarmGroupConfigForm,
37
38
  IPCameraConfigForm, WeatherForm,
38
39
  WateringConfigForm, StateSelectForm, MainStateSelectForm,
@@ -43,6 +44,17 @@ from .forms import (
43
44
 
44
45
 
45
46
 
47
+ class DimmableLightsGroup(Dimmer):
48
+ name = _("Dimmable Lights Group")
49
+ gateway_class = GenericGatewayHandler
50
+ config_form = DimmableLightsGroupConfigForm
51
+
52
+
53
+ class SwitchGroup(Switch):
54
+ name = _("On/Off Group")
55
+ gateway_class = GenericGatewayHandler
56
+ config_form = SwitchGroupConfigForm
57
+
46
58
 
47
59
  class Thermostat(ControllerBase):
48
60
  name = _("Thermostat")
simo/generic/forms.py CHANGED
@@ -16,7 +16,7 @@ from simo.core.form_fields import (
16
16
  Select2ModelChoiceField, Select2ListChoiceField,
17
17
  Select2ModelMultipleChoiceField
18
18
  )
19
-
19
+ from simo.core.forms import DimmerConfigForm, SwitchForm
20
20
 
21
21
  ACTION_METHODS = (
22
22
  ('turn_on', "Turn ON"), ('turn_off', "Turn OFF"),
@@ -26,6 +26,46 @@ ACTION_METHODS = (
26
26
  )
27
27
 
28
28
 
29
+ class ControlForm(forms.Form):
30
+ button = Select2ModelChoiceField(
31
+ queryset=Component.objects.filter(base_type='button'),
32
+ url='autocomplete-component'
33
+ )
34
+ prefix = 'controls'
35
+
36
+
37
+ class DimmableLightsGroupConfigForm(DimmerConfigForm):
38
+ slaves = Select2ModelMultipleChoiceField(
39
+ queryset=Component.objects.filter(
40
+ base_type__in=('dimmer', 'switch')
41
+ ),
42
+ url='autocomplete-component',
43
+ forward=(forward.Const(['dimmer', 'switch'], 'base_type'),),
44
+ required=False
45
+ )
46
+ controls = FormsetField(
47
+ formset_factory(
48
+ ControlForm, can_delete=True, can_order=True, extra=0, max_num=999
49
+ )
50
+ )
51
+
52
+
53
+ class SwitchGroupConfigForm(SwitchForm):
54
+ slaves = Select2ModelMultipleChoiceField(
55
+ queryset=Component.objects.filter(
56
+ base_type__in=('dimmer', 'switch')
57
+ ),
58
+ url='autocomplete-component',
59
+ forward=(forward.Const(['dimmer', 'switch'], 'base_type'),),
60
+ required=False
61
+ )
62
+ controls = FormsetField(
63
+ formset_factory(
64
+ ControlForm, can_delete=True, can_order=True, extra=0, max_num=999
65
+ )
66
+ )
67
+
68
+
29
69
  class ThermostatConfigForm(BaseComponentForm):
30
70
  temperature_sensor = Select2ModelChoiceField(
31
71
  queryset=Component.objects.filter(
simo/generic/gateways.py CHANGED
@@ -59,6 +59,82 @@ class CameraWatcher(threading.Thread):
59
59
 
60
60
 
61
61
 
62
+ class GroupButtonsHandler:
63
+
64
+ def __init__(self, *args, **kwargs):
65
+ super().__init__(*args, **kwargs)
66
+ self.group_buttons = {}
67
+ self.fade_directions = {}
68
+
69
+ def watch_groups(self):
70
+ from .controllers import DimmableLightsGroup, SwitchGroup
71
+ current_group_buttons = {}
72
+ for group_comp in Component.objects.filter(
73
+ controller_uid__in=(DimmableLightsGroup.uid, SwitchGroup.uid)
74
+ ):
75
+ for ctrl in group_comp.config.get('controls', []):
76
+ if ctrl['button'] not in current_group_buttons:
77
+ current_group_buttons[ctrl['button']] = set(group_comp.id)
78
+ else:
79
+ current_group_buttons[ctrl['button']].add(group_comp.id)
80
+
81
+ if ctrl['button'] not in self.group_buttons:
82
+ self.group_buttons[ctrl['button']] = set()
83
+ if group_comp.id not in self.group_buttons[ctrl['button']]:
84
+ self.group_buttons[ctrl['button']].add(group_comp.id)
85
+ btn = Component.objects.filter(id=ctrl['button']).first()
86
+ if btn:
87
+ btn.on_change(self.watch_group_button)
88
+
89
+ # remove groups and buttons that are no longer in use
90
+ for btn_id, groups in self.group_buttons.items():
91
+ if btn_id not in current_group_buttons:
92
+ self.group_buttons[btn_id] = set()
93
+ continue
94
+ self.group_buttons[btn_id] = current_group_buttons[btn_id]
95
+
96
+
97
+ def watch_group_button(self, button):
98
+ group_ids = self.group_buttons.get(button.id)
99
+ if not group_ids:
100
+ return
101
+
102
+ btn_type = button.config.get('btn_type', 'momentary')
103
+
104
+ if btn_type == 'momentary':
105
+ if button.value not in ('click', 'hold', 'up', 'double-click'):
106
+ return
107
+ for g_id in group_ids:
108
+ group = Component.objects.filter(id=g_id).first()
109
+ if not group:
110
+ continue
111
+ if button.value == 'click':
112
+ group.toggle()
113
+ elif button.value == 'double-click':
114
+ group.send(group.config.get('max', 100))
115
+ elif button.value == 'down':
116
+ if self.fade_directions.get(group.id, 0) < 0:
117
+ self.fade_directions[group.id] = 1
118
+ group.fade_up()
119
+ else:
120
+ self.fade_directions[group.id] = -1
121
+ group.fade_down()
122
+ elif button.value == 'up':
123
+ if self.fade_directions.get(group.id):
124
+ self.fade_directions[group.id] = 0
125
+ group.fade_stop()
126
+
127
+ else: # toggle
128
+ if button.value not in ('down', 'up'):
129
+ return
130
+ for g_id in group_ids:
131
+ group = Component.objects.filter(id=g_id).first()
132
+ if not group:
133
+ continue
134
+ group.toggle()
135
+
136
+
137
+
62
138
  class GenericGatewayHandler(BaseObjectCommandsGatewayHandler):
63
139
  name = "Generic"
64
140
  config_form = BaseGatewayForm
@@ -259,8 +335,8 @@ class GenericGatewayHandler(BaseObjectCommandsGatewayHandler):
259
335
 
260
336
  if state.config.get('away_on_no_action'):
261
337
  for sensor in Component.objects.filter(
262
- zone__instance=state.zone.instance,
263
- base_type='binary-sensor', alarm_category='security'
338
+ zone__instance=state.zone.instance,
339
+ base_type='binary-sensor', alarm_category='security'
264
340
  ):
265
341
  if state.id not in self.sensors_on_watch:
266
342
  self.sensors_on_watch[state.id] = {}
@@ -313,10 +389,9 @@ class GenericGatewayHandler(BaseObjectCommandsGatewayHandler):
313
389
  print(traceback.format_exc(), file=sys.stderr)
314
390
 
315
391
 
316
-
317
392
  def security_sensor_change(self, sensor):
318
393
  self.last_sensor_actions[
319
- self.sensors_on_watch[sensor.id]
394
+ sensor.zone.instance.id
320
395
  ] = time.time()
321
396
 
322
397
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.7.1
3
+ Version: 2.7.3
4
4
  Summary: Smart Home on Steroids!
5
5
  Author-email: Simanas Venčkauskas <simanas@simo.io>
6
6
  Project-URL: Homepage, https://simo.io
@@ -70,7 +70,7 @@ simo/core/auto_urls.py,sha256=FBDclIeRp5UVWomIUbRzUgY-AoMk-r2qC2htlwKD4Lo,1106
70
70
  simo/core/autocomplete_views.py,sha256=x3MKOZvXYS3xVQ-V1S7Liv_U5bxr-uc0gePa85wv5nA,4561
71
71
  simo/core/base_types.py,sha256=WypW8hTfzveuTQtruGjLYAGQZIuczxTlW-SdRk3iQug,666
72
72
  simo/core/context.py,sha256=LKw1I4iIRnlnzoTCuSLLqDX7crHdBnMo3hjqYvVmzFc,1557
73
- simo/core/controllers.py,sha256=9O5tr9rrHq3k-C__gv5le54VBCEcIyBYbSZp9-ZQk3I,36277
73
+ simo/core/controllers.py,sha256=Js4r5SBi-61IlXN24FJtIbdD8sFIrNamObBVX3zGyuE,36786
74
74
  simo/core/dynamic_settings.py,sha256=bUs58XEZOCIEhg1TigR3LmYggli13KMryBZ9pC7ugAQ,1872
75
75
  simo/core/events.py,sha256=1_KIk5pJqdLPRQlCQ9xSyALst2Cn0b2lAEAJ3QjwIjE,4801
76
76
  simo/core/filters.py,sha256=6wbn8C2WvKTTjtfMwwLBp2Fib1V0-DMpS4iqJd6jJQo,2540
@@ -103,7 +103,7 @@ simo/core/__pycache__/auto_urls.cpython-38.pyc,sha256=ib_ns5Ko8ybfrdJJWYVV1jevih
103
103
  simo/core/__pycache__/autocomplete_views.cpython-38.pyc,sha256=rZzjrxAir0HzN9uKPoXIY753f1CSdFWaSW7QBDen3qc,4448
104
104
  simo/core/__pycache__/base_types.cpython-38.pyc,sha256=CX-qlF7CefRi_mCE954wYa9rUFR88mOl6g7fybDRu7g,803
105
105
  simo/core/__pycache__/context.cpython-38.pyc,sha256=NlTHt2GvXxA21AhBkeyOLfRFUuXw7wmwqyNhhcDl2cw,1373
106
- simo/core/__pycache__/controllers.cpython-38.pyc,sha256=6xiOzM5B7G2mZ0s80FTVC5bbBhvosziWAD6At_wLyuc,30714
106
+ simo/core/__pycache__/controllers.cpython-38.pyc,sha256=669Uz5CUb10fh7PHePJxLngnbOCB3Cc4skapyvEVbhs,31829
107
107
  simo/core/__pycache__/dynamic_settings.cpython-38.pyc,sha256=wGpnscX1DxFpRl54MQURhjz2aD3NJohSzw9JCFnzh2Y,2384
108
108
  simo/core/__pycache__/events.cpython-38.pyc,sha256=1y8YaZsiDkBOeIWzH7SQz4holmMG_RLlMWi8kuSZcoE,5280
109
109
  simo/core/__pycache__/filters.cpython-38.pyc,sha256=WBBDwcDQwOmgbrRhyUxenSN80rU4Eq9jQ6RcrRGCP_o,2440
@@ -117,7 +117,7 @@ simo/core/__pycache__/models.cpython-38.pyc,sha256=po4B4bMyA-KDBu8qbVwGjrpUZJQPV
117
117
  simo/core/__pycache__/permissions.cpython-38.pyc,sha256=UdtxCTXPEbe99vgZOfRz9wfKSYvUn9hSRbpIV9CJSyI,2988
118
118
  simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
119
119
  simo/core/__pycache__/serializers.cpython-38.pyc,sha256=xegjaPbTp71RK9pfle_vgbHiUhr4CQIq34A7RxpvNGg,19817
120
- simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=hz56sQNQgsXTReWvBSggmF222kB_g-17tGKSgYayVdo,4932
120
+ simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=v-qSKC9KX--aw9-vSNX8z8HXNFr0yOII0Aw8JxrYM0U,4920
121
121
  simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=KqbO1cOewodVPcy0-htVefyUjCuELKV0o7fOfYqfgPc,8490
122
122
  simo/core/__pycache__/storage.cpython-38.pyc,sha256=9R1Xu0FJDflfRXUPsqEgt0SpwiP7FGk7HaR8s8XRyI8,721
123
123
  simo/core/__pycache__/tasks.cpython-38.pyc,sha256=GFIC8IsQ_bK4rgNRl_oGbMCQHhbcgGS7dx-rjPcLy08,11220
@@ -10256,7 +10256,7 @@ simo/fleet/auto_urls.py,sha256=vrfrooPyY4pDuQjya-eLxCgZldfhwbEeEiXa7diO_CY,847
10256
10256
  simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
10257
10257
  simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
10258
10258
  simo/fleet/controllers.py,sha256=PezfOT-1N_UONSsbyTXEIyGO6Po57KdEBRv4yzk_sw0,28605
10259
- simo/fleet/forms.py,sha256=jXeReRgXleYTFjC_BZCAtT7-MHMrgkBTXQu3rj_N3aw,66741
10259
+ simo/fleet/forms.py,sha256=cA0iqixII5k9LUqbMPWzTyvfu9SNH23ChH_Mt6C6Ggk,66913
10260
10260
  simo/fleet/gateways.py,sha256=C7dyapWDlJ5erYPNLkSoH50I8kj0lIXicSno0_CrdXc,5783
10261
10261
  simo/fleet/managers.py,sha256=ZNeHFSkF5kzsl9E1DCBevOW6kXJlD6kw0LU4B-JMOG8,828
10262
10262
  simo/fleet/models.py,sha256=zPplx_v64nfKBmb-nCb74aCVtEeY3m3SjEy-VhbnydU,17511
@@ -10272,8 +10272,8 @@ simo/fleet/__pycache__/api.cpython-38.pyc,sha256=rZ1mkfkaMBEXhi9sw_jTKdk2CPJhBNx
10272
10272
  simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=jHsvfwAumiBusr91QK1-qC-nmpPEC3r2uMGG8g0fABE,769
10273
10273
  simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
10274
10274
  simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
10275
- simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=UtuihR455FLsHFAtMBh6haJzypp_HTyo3o8kPH02gnI,24739
10276
- simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=k6vnmP4eO_x60Lxm5rDDKpK-BfzNSCxiwWtDHSEboHA,45117
10275
+ simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=vH7mK1K4JBcLU9eKtqTJwbgB0SFMJ-s7WvO0qOsWjrg,24739
10276
+ simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=lNb_jc66-aO1NkYIJs4TWOX7uS8H2a8oCP-HCLJZoNY,45169
10277
10277
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=MIpXuGWitGNdsxJ99fWvMXJ6sVE96ac7iR4K4aM4Sds,5148
10278
10278
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=Vmm23zoQnS3-uS5_WJt2n3wtjhLiEhLWaYxXJCU6Gts,1339
10279
10279
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=AXk1Q_nnHDXirHYgM3EW5pLsrR2CaPWk4EuvGCuDUpI,14131
@@ -10376,18 +10376,18 @@ simo/fleet/templates/fleet/controllers_info/ENS160AirQualitySensor.md,sha256=3LS
10376
10376
  simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10377
10377
  simo/generic/app_widgets.py,sha256=y8W3jR76Hh26O9pPQyg2SophMbYIOtAWD33MPKbB8Mg,856
10378
10378
  simo/generic/base_types.py,sha256=u3SlfpNYaCwkVBwomWgso4ODzL71ay9MhiAW-bxgnDU,341
10379
- simo/generic/controllers.py,sha256=bcN4xhERgDgLjvNAFi6nQjGToIiHRJliOWKK1qUY8WU,45705
10380
- simo/generic/forms.py,sha256=yGmYWTRyFxR1N0TvY9aanzPXd1yb6FNLqOZ3Ze1p10M,21712
10381
- simo/generic/gateways.py,sha256=j-cBvjhF__ZfxSINWzgloYD9HX5sA8thG4fBFTTHUZs,12195
10379
+ simo/generic/controllers.py,sha256=_WN2TTJ4JQWmnB-Zoew8p5J_xbbuQc-vVtXt4crS9sQ,46067
10380
+ simo/generic/forms.py,sha256=kQL8NdK_9-PxFcoPK6fMMCmtroY2Nbx_MqERgBoRg6g,22933
10381
+ simo/generic/gateways.py,sha256=x_rVCNwL7tCfL0S2lUkIMiMfaRJKgzLPi8hd_kPkVRo,15218
10382
10382
  simo/generic/models.py,sha256=Adq7ipWK-renxJlNW-SZnAq2oGEOwKx8EdUWaKnfcVQ,7597
10383
10383
  simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
10384
10384
  simo/generic/socket_consumers.py,sha256=K2OjphIhKJH48BvfFfoCOyCQZ1NmXb_phs6y1IP-qaQ,1757
10385
10385
  simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
10386
10386
  simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=D9b13pbMlirgHmjDnQhfLIDGSVINoSouHb4SWOeCRrs,1642
10387
10387
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=aV5NdIuvXR-ItKpI__MwcyPZHD6Z882TFdgYkPCkr1I,493
10388
- simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=QIuQdbmvrh9OfJoTDLmBgOQbbbigqhnphNTF0KwSuPw,29623
10389
- simo/generic/__pycache__/forms.cpython-38.pyc,sha256=2k7XABbFdElGy8kIKAHHxgXnfaxeWYBp8zaOYmWoaRg,16271
10390
- simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=yOYb5JHIDxaCOypZQnIQICn7V0yI1R9YO7nPgYRdb3E,9518
10388
+ simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=-QCIswFOwMP9jKONuPUcmcVEaZOzwKXfJimkUJXyBpg,30118
10389
+ simo/generic/__pycache__/forms.cpython-38.pyc,sha256=2rmamwhD9wdrW2zO73oAAbeAMZiJqGKB1lizwTRuGZs,17258
10390
+ simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=ZVlY3Fixz0s-D2hGz3-iZvvkAd7DpC6_YKDbWuVp3jY,11362
10391
10391
  simo/generic/__pycache__/models.cpython-38.pyc,sha256=MZpum7syAFxuulf47K7gtUlJJ7xRD-IBUBAwUM1ZRnw,5825
10392
10392
  simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
10393
10393
  simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=qJO5kvQLWhsQDOr1AtAtsAybuRWioxSkQei3Pc7rdP0,1737
@@ -10603,9 +10603,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10603
10603
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10604
10604
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10605
10605
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10606
- simo-2.7.1.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10607
- simo-2.7.1.dist-info/METADATA,sha256=9DQF5eS56HxB-FA_WqJJGzA2HN1S1hxE3moxoFQmK04,1952
10608
- simo-2.7.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10609
- simo-2.7.1.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10610
- simo-2.7.1.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10611
- simo-2.7.1.dist-info/RECORD,,
10606
+ simo-2.7.3.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10607
+ simo-2.7.3.dist-info/METADATA,sha256=retVvXZoSbqPfz_EkmsP55-k3SOTce0bl-z53SLm7Os,1952
10608
+ simo-2.7.3.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10609
+ simo-2.7.3.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10610
+ simo-2.7.3.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10611
+ simo-2.7.3.dist-info/RECORD,,
File without changes