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

Binary file
Binary file
Binary file
simo/core/admin.py CHANGED
@@ -342,7 +342,7 @@ class ComponentAdmin(EasyObjectsDeleteMixin, admin.ModelAdmin):
342
342
 
343
343
  def pop_fields_from_form(form):
344
344
  for field_neme in (
345
- 'value_units', 'show_in_app', 'instance_methods',
345
+ 'value_units', 'value_translation',
346
346
  'alarm_category', 'arm_status'
347
347
  ):
348
348
  if field_neme in form.fields:
simo/core/controllers.py CHANGED
@@ -259,6 +259,15 @@ class ControllerBase(ABC):
259
259
  update_fields=['change_init_by', 'change_init_date']
260
260
  )
261
261
  value = self._prepare_for_send(value)
262
+ if self.component.value_translation:
263
+ try:
264
+ namespace = {}
265
+ exec(self.component.value_translation, namespace)
266
+ val_translate = namespace['translate']
267
+ value = val_translate(value, BEFORE_SEND)
268
+ except:
269
+ pass
270
+
262
271
  GatewayObjectCommand(
263
272
  self.component.gateway, self.component, set_val=value
264
273
  ).publish()
@@ -267,6 +276,14 @@ class ControllerBase(ABC):
267
276
  self.component.value = value
268
277
 
269
278
  def set(self, value, actor=None):
279
+ if self.component.value_translation:
280
+ try:
281
+ namespace = {}
282
+ exec(self.component.value_translation, namespace)
283
+ val_translate = namespace['translate']
284
+ value = val_translate(value, BEFORE_SET)
285
+ except:
286
+ pass
270
287
  value = self._validate_val(value, BEFORE_SET)
271
288
 
272
289
  if not actor:
simo/core/forms.py CHANGED
@@ -14,7 +14,7 @@ from .models import (
14
14
  Icon, Category, Gateway, Component
15
15
  )
16
16
  from .form_fields import Select2ModelMultipleChoiceField
17
- from .widgets import SVGFileWidget, LogOutputWidget
17
+ from .widgets import SVGFileWidget, LogOutputWidget, PythonCode
18
18
  from .utils.formsets import FormsetField
19
19
  from .utils.validators import validate_slaves
20
20
 
@@ -242,6 +242,7 @@ class ComponentAdminForm(forms.ModelForm):
242
242
  'category': autocomplete.ModelSelect2(
243
243
  url='autocomplete-category', attrs={'data-html': True}
244
244
  ),
245
+ 'value_translation': PythonCode()
245
246
  }
246
247
 
247
248
  def __init__(self, *args, **kwargs):
@@ -299,7 +300,6 @@ class ComponentAdminForm(forms.ModelForm):
299
300
  main_fields = (
300
301
  'name', 'icon', 'zone', 'category',
301
302
  'show_in_app', 'battery_level',
302
- #'instance_methods',
303
303
  'value_units',
304
304
  'alarm_category', 'arm_status',
305
305
  'notes'
@@ -315,12 +315,11 @@ class ComponentAdminForm(forms.ModelForm):
315
315
  if field_name not in main_fields:
316
316
  base_fields.append(field_name)
317
317
 
318
- base_fields.append('show_in_app')
319
318
  base_fields.append('control')
320
319
  base_fields.append('notes')
321
320
 
322
321
  fieldsets = [
323
- (_("Base settings"), {'fields': base_fields}),
322
+ (_("Base settings"), {'fields': base_fields + ['value_units', 'value_translation']}),
324
323
  ]
325
324
  if cls.has_alarm:
326
325
  fieldsets.append(
@@ -336,7 +335,7 @@ class ComponentAdminForm(forms.ModelForm):
336
335
  'fields': (
337
336
  'alive', 'error_msg', 'battery_level',
338
337
  'config', 'meta',
339
- 'value', 'value_units',
338
+ 'value',
340
339
  'history'
341
340
  ),
342
341
  'classes': ('collapse',),
@@ -354,22 +353,19 @@ class ComponentAdminForm(forms.ModelForm):
354
353
  ))
355
354
  return self.cleaned_data['category']
356
355
 
357
- def clean_instance_methods(self):
358
- custom_methods = {}
356
+ def clean_value_translation(self):
357
+ if 'value_translation' not in self.cleaned_data:
358
+ return
359
359
  try:
360
- # need new line at the beginning to display correct
361
- # line numbering in an event of exception
362
- exec(
363
- '\n' + self.cleaned_data['instance_methods'],
364
- None, custom_methods
365
- )
360
+ namespace = {}
361
+ exec(self.cleaned_data['value_translation'], namespace)
362
+ translate = namespace['translate']
363
+ translate(self.instance.controller.default_value, 'before-set')
366
364
  except Exception:
367
365
  error = traceback.format_exc()
368
- error = error[error.find('File') + 5:]
369
- error = error[error.find('File'):]
370
366
  error = error.replace('\n', '<br>').replace(' ', '&nbsp;')
371
367
  raise forms.ValidationError(mark_safe(error))
372
- return self.cleaned_data['instance_methods']
368
+ return self.cleaned_data['value_translation']
373
369
 
374
370
 
375
371
  class BaseComponentForm(ConfigFieldsMixin, ComponentAdminForm):
@@ -0,0 +1,23 @@
1
+ # Generated by Django 4.2.10 on 2024-12-06 16:02
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('core', '0045_alter_instance_device_report_history_days_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='component',
15
+ name='value_translation',
16
+ field=models.TextField(default="def translate(value, occasion):\n if occasion == 'before-set':\n return value\n else: # 'before-send'\n return value", help_text='Adjust this to make value translations before value isset on to a component and before it is sent to a device from your SIMO.io smart home instance.'),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='gateway',
20
+ name='type',
21
+ field=models.CharField(choices=[('simo.automation.gateways.AutomationsGatewayHandler', 'Automation'), ('simo.generic.gateways.DummyGatewayHandler', 'Dummy'), ('simo.generic.gateways.GenericGatewayHandler', 'Generic'), ('simo_komfovent.gateways.KomfoventGatewayHandler', 'Komfovent'), ('simo.fleet.gateways.FleetGatewayHandler', 'SIMO.io Fleet'), ('simo_zwave.gateways.ZwaveGatewayHandler', 'Zwave')], db_index=True, max_length=200, unique=True),
22
+ ),
23
+ ]
simo/core/models.py CHANGED
@@ -8,6 +8,7 @@ from django.utils.translation import gettext_lazy as _
8
8
  from django.db import models
9
9
  from django.db.models.signals import post_delete
10
10
  from django.dispatch import receiver
11
+ from django.template.loader import render_to_string
11
12
  from timezone_utils.choices import ALL_TIMEZONES_CHOICES
12
13
  from location_field.models.plain import PlainLocationField
13
14
  from model_utils import FieldTracker
@@ -343,6 +344,12 @@ class Component(DirtyFieldsMixin, models.Model, SimoAdminMixin, OnChangeMixin):
343
344
  value = models.JSONField(null=True, blank=True)
344
345
  value_previous = models.JSONField(null=True, blank=True, editable=False)
345
346
  value_units = models.CharField(max_length=100, null=True, blank=True)
347
+ value_translation = models.TextField(
348
+ default=render_to_string('core/value_translation.py'), blank=True,
349
+ help_text="Adjust this to make value translations before value is"
350
+ "set on to a component and before it is sent to a device "
351
+ "from your SIMO.io smart home instance."
352
+ )
346
353
 
347
354
  slaves = models.ManyToManyField(
348
355
  'Component', null=True, blank=True, related_name='masters'
@@ -0,0 +1,5 @@
1
+ def translate(value, occasion):
2
+ if occasion == 'before-set':
3
+ return value
4
+ else: # 'before-send'
5
+ return value
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.7.3
3
+ Version: 2.7.4
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
@@ -60,7 +60,7 @@ simo/backups/migrations/__pycache__/0003_alter_backuplog_options_alter_backup_si
60
60
  simo/backups/migrations/__pycache__/0004_alter_backup_options_alter_backuplog_options_and_more.cpython-38.pyc,sha256=f4leTBkOB2kraQYyCkz9B_2pb6aKn7srV2unQA5HV1Q,710
61
61
  simo/backups/migrations/__pycache__/__init__.cpython-38.pyc,sha256=Lz1fs6V05h2AoxTOLNye0do9bEMnyuaXB_hHOjG5-HU,172
62
62
  simo/core/__init__.py,sha256=_s2TjJfQImsMrTIxqLAx9AZie1Ojmm6sCHASdl3WLGU,50
63
- simo/core/admin.py,sha256=nmFDO57D5hXHDfl0wjJ9J5jBxyCqW4Gp_uqHhpS2uuw,18564
63
+ simo/core/admin.py,sha256=j07Dy3IsW7SRRsAJ2XXGzE0MTxmfY87CEEbT22kLlS4,18550
64
64
  simo/core/api.py,sha256=eJCV5kScDWfVUa7RprMWvu8PQlGX2T3vCGIhIl4Z6Jw,30306
65
65
  simo/core/api_auth.py,sha256=vCxvczA8aWNcW0VyKs5WlC_ytlqeGP_H_hkKUNVkCwM,1247
66
66
  simo/core/api_meta.py,sha256=dBIpQNDSMO4yum4Xa6acHkWwEDItooZC4QLV_EZfwIc,5221
@@ -70,17 +70,17 @@ 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=Js4r5SBi-61IlXN24FJtIbdD8sFIrNamObBVX3zGyuE,36786
73
+ simo/core/controllers.py,sha256=gVwQHYkJ6GNTHaKTSjf4H2VVykQbvKh4_fSe_MdAVi4,37412
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
77
77
  simo/core/form_fields.py,sha256=m3dR31M31q3DQM-7P4jBOXLofm-PiC0ykIfUrpWhOjg,5007
78
- simo/core/forms.py,sha256=BZQjKZ3E9jxZ4sDM6t7_dCSwZibx7MR_IQsfS8MDu44,21747
78
+ simo/core/forms.py,sha256=KZKmc5dWGvEicTEokQdijM5SgA-ZjrdenJPVwcb5R3s,21675
79
79
  simo/core/gateways.py,sha256=Y2BME6zSyeUq_e-hzEUF6gErCUCP6nFxedkLZKiLVOo,4141
80
80
  simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
81
81
  simo/core/managers.py,sha256=n-b3I4uXzfHKTeB1VMjSaMsDUxp8FegFJwnbV1IsWQ4,3019
82
82
  simo/core/middleware.py,sha256=eUFf6iP-Snx_0TE3MoXsSwqrd5IjlukqZk2GQGStRCo,3385
83
- simo/core/models.py,sha256=QNVTnWeHAW6LVrs3eaR7WNMhwjICuQpXZ8vyH_2qCBo,22834
83
+ simo/core/models.py,sha256=cJrY7mBnKD-AsM62WzCnrNw21wmGu6bGuxpvBPjQg60,23220
84
84
  simo/core/permissions.py,sha256=2YNRot2qoHjHKWPGOpO4PBseecctPbTlUQpepnFkCRs,3027
85
85
  simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
86
86
  simo/core/serializers.py,sha256=pa4F5fSvIxgGJWBEcXdzpmemRWl6QbUoUDMqQ_RdA2o,22514
@@ -93,7 +93,7 @@ simo/core/types.py,sha256=WJEq48mIbFi_5Alt4wxWMGXxNxUTXqfQU5koH7wqHHI,1108
93
93
  simo/core/views.py,sha256=yx9I0byeVUa-LAOnklpWIYwpNNOf5m9fyjKBvj4YCh4,2475
94
94
  simo/core/widgets.py,sha256=J9e06C6I22F6xKic3VMgG7WeX07glAcl-4bF2Mg180A,2827
95
95
  simo/core/__pycache__/__init__.cpython-38.pyc,sha256=ZJFM_XN0RmJMULQulgA_wFiOnEtsMoedcOWnXjH-Y8o,208
96
- simo/core/__pycache__/admin.cpython-38.pyc,sha256=WAfdq_hAdkW-_QwJ0E7NSd25yxnPRi_HjJ-uKFMJzcg,14146
96
+ simo/core/__pycache__/admin.cpython-38.pyc,sha256=oDG9Kem_VbiRDB6ednmvPS9asBDb3iki7OyLzzNRYCQ,14155
97
97
  simo/core/__pycache__/api.cpython-38.pyc,sha256=uSPeR38cxPN2H875ky5tDlF_tkkuInzB92qaK4lQWUA,23249
98
98
  simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=mi3mu5qEKio_PvfQEvr3Q6AhdPLAHxzxAxrMbAz_pKU,1712
99
99
  simo/core/__pycache__/api_meta.cpython-38.pyc,sha256=0IkX6_e09XSsHuA4NDhmyXtegiXo0bpiAeJvEl8LFoc,3837
@@ -103,17 +103,17 @@ 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=669Uz5CUb10fh7PHePJxLngnbOCB3Cc4skapyvEVbhs,31829
106
+ simo/core/__pycache__/controllers.cpython-38.pyc,sha256=LtrQQ8egOIOuQbAckeM-z8OfbzS4W8VQ3vBnryAm3iU,32086
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
110
110
  simo/core/__pycache__/form_fields.cpython-38.pyc,sha256=BXiHLzmLgex-JrCcTo5k26CyZyKZ_QJv7eoEwyJGE-g,5745
111
- simo/core/__pycache__/forms.cpython-38.pyc,sha256=G9dREppToXxKVP0ImmjCtKLBv3J7V1HNQjTWBq4fDV4,17613
111
+ simo/core/__pycache__/forms.cpython-38.pyc,sha256=GaAOXoLUc8xvu5sqJG1Z6K-xkkPtd2Y6WrGFft7dklw,17658
112
112
  simo/core/__pycache__/gateways.cpython-38.pyc,sha256=-_ugqnUOA1Cl6VfMqpV96n7ekVOEwYg_jNvoaZEcx9I,4815
113
113
  simo/core/__pycache__/loggers.cpython-38.pyc,sha256=Z-cdQnC6XlIonPV4Sl4E52tP4NMEdPAiHK0cFaIL7I8,1623
114
114
  simo/core/__pycache__/managers.cpython-38.pyc,sha256=6RTIxyjOgpQGtAqcUyE2vFPS09w1V5Wmd_vOV7rHRRI,3370
115
115
  simo/core/__pycache__/middleware.cpython-38.pyc,sha256=SgTLFNkKxvJ62hevSAVNZHgHdG_u2p7AZBhrj-jfFPs,2649
116
- simo/core/__pycache__/models.cpython-38.pyc,sha256=po4B4bMyA-KDBu8qbVwGjrpUZJQPVBB6dkfncEBKYnM,18554
116
+ simo/core/__pycache__/models.cpython-38.pyc,sha256=I6u3Gs4Af0lv6GWDDhlTSTqJWiErhMWSoksNWxSODsg,18865
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
@@ -236,6 +236,7 @@ simo/core/migrations/0042_alter_instance_timezone.py,sha256=5fLprOmoV06y37rh3uJW
236
236
  simo/core/migrations/0043_alter_category_instance_alter_instance_timezone_and_more.py,sha256=TpJRZjwJu1iDYt1cCQr62jLOz14yy7yjrfbyHYgu9pM,23896
237
237
  simo/core/migrations/0044_alter_gateway_type.py,sha256=xoQvOSz_JrWHECAAII83518tmhEEfLUHqxpIjoo4oLY,758
238
238
  simo/core/migrations/0045_alter_instance_device_report_history_days_and_more.py,sha256=saR7gEbTDfXTcKnT1R193Aboqlg32HvDRI_JAvZ97TY,1360
239
+ simo/core/migrations/0046_component_value_translation_alter_gateway_type.py,sha256=SUybDSLRCGevVS9mCQGvozO8LA43tKze3R5rCf1TQ4E,1282
239
240
  simo/core/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
240
241
  simo/core/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=w6GiBXVxWj30Bg4Sn_pFVeA041d-pCrkaq8mR3KuF70,5381
241
242
  simo/core/migrations/__pycache__/0002_load_icons.cpython-38.pyc,sha256=Nb9RrPjVYo_RpZ5PmzoaEIWGCeVt4kicpmGiKlBrpIw,2123
@@ -282,6 +283,7 @@ simo/core/migrations/__pycache__/0042_alter_instance_timezone.cpython-38.pyc,sha
282
283
  simo/core/migrations/__pycache__/0043_alter_category_instance_alter_instance_timezone_and_more.cpython-38.pyc,sha256=97_eFPQ_Iy-M1712Nad1w8t3ITBV4BF0eY1e8N-oOE4,16759
283
284
  simo/core/migrations/__pycache__/0044_alter_gateway_type.cpython-38.pyc,sha256=KwqGKoo8C1wH9ZUhagpC3plTwheSMcWtwlCGcSPd5WQ,964
284
285
  simo/core/migrations/__pycache__/0045_alter_instance_device_report_history_days_and_more.cpython-38.pyc,sha256=e1_hKjdokggnPndFkoBWrHQ18IkBi2W7WahcSjAbvKo,1278
286
+ simo/core/migrations/__pycache__/0046_component_value_translation_alter_gateway_type.cpython-38.pyc,sha256=0WowsGpjyPX7Z341bhU4bXErZqqFZaL1gtiusabrD0I,1445
285
287
  simo/core/migrations/__pycache__/__init__.cpython-38.pyc,sha256=VZmDQ57BTcebuM0KMhjiTOabgWZCBxQmSJzWZos9SO8,169
286
288
  simo/core/static/ansi_styles.css,sha256=4ieJGrjZPKyPSago9FdB_gflHoGE1vxCHi8qVn5tY-Y,37352
287
289
  simo/core/static/admin/Img/plus.svg,sha256=2NpSFPWqGIjpAQGFI7LDQHPKagEhYkJiJX95ufCoZaI,741
@@ -10203,6 +10205,7 @@ simo/core/templates/admin/wizard/wizard_add.html,sha256=RPkwKXctu_yxJxjJqcvVEzG4
10203
10205
  simo/core/templates/core/icon_acutocomplete_select_item.html,sha256=D7aWefAJjrDqyMcwt4vtuwkruklJ1aSjCTi99HLrQUY,768
10204
10206
  simo/core/templates/core/object_acutocomplete_select_item.html,sha256=pS8APlv1IdhfttONh3npzQNfrOhj63YC7837tnOfSHk,465
10205
10207
  simo/core/templates/core/openvpn_client.conf,sha256=z1838G8v8vmIiQKyfE8URCCMpLsges5jbX3hDJkztF4,249
10208
+ simo/core/templates/core/value_translation.py,sha256=o5FqQsKz2Mn-BVbkLuGuIq-K-_ss0sPxh-cTLlBWGvo,132
10206
10209
  simo/core/templates/gis/my-openlayers-osm.html,sha256=ze4Gcl4fjrkKS1lONZHgpD-ybdI_N4zZcWBsBeyL4-A,1790
10207
10210
  simo/core/templates/gis/js/OLMapWidget.js,sha256=QOOHCR4CyAljFTtXTP_MNKN5RTplp3lvDKxHJj3J4KY,8813
10208
10211
  simo/core/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -10603,9 +10606,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10603
10606
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10604
10607
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10605
10608
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
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,,
10609
+ simo-2.7.4.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10610
+ simo-2.7.4.dist-info/METADATA,sha256=IZ7071qtHFtciKffd8xBLX0pEEe-R3hXrsgqPA0Oogk,1952
10611
+ simo-2.7.4.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10612
+ simo-2.7.4.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10613
+ simo-2.7.4.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10614
+ simo-2.7.4.dist-info/RECORD,,
File without changes