simo 2.5.23__py3-none-any.whl → 2.5.25__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
simo/core/context.py CHANGED
@@ -14,10 +14,14 @@ def additional_templates_context(request):
14
14
  instances = Instance.objects.none()
15
15
  else:
16
16
  instances = request.user.instances
17
+ try:
18
+ version = pkg_resources.get_distribution('simo')
19
+ except:
20
+ version = 'dev'
17
21
  ctx = {
18
22
  'hub_ip': get_self_ip(),
19
23
  'dynamic_settings': dynamic_settings,
20
- 'current_version': pkg_resources.get_distribution('simo').version,
24
+ 'current_version': version,
21
25
  'update_available': is_update_available(True),
22
26
  'instances': instances,
23
27
  'current_instance': get_current_instance()
@@ -54,7 +54,10 @@ def maybe_update():
54
54
  if not os.path.exists('/etc/SIMO/_var/auto_update'):
55
55
  print("Auto updates are disabled")
56
56
  else:
57
- current = pkg_resources.get_distribution('simo').version
57
+ try:
58
+ current = pkg_resources.get_distribution('simo')
59
+ except:
60
+ current = 'dev'
58
61
  resp = requests.get("https://pypi.org/pypi/simo/json")
59
62
  if resp.status_code != 200:
60
63
  sys.exit("Bad response from PyPi")
simo/core/tasks.py CHANGED
@@ -119,8 +119,13 @@ def sync_with_remote():
119
119
  except:
120
120
  mac = ''
121
121
 
122
+ try:
123
+ version = pkg_resources.get_distribution('simo').version,
124
+ except:
125
+ version = 'dev'
126
+
122
127
  report_data = {
123
- 'simo_version': pkg_resources.get_distribution('simo').version,
128
+ 'simo_version': version,
124
129
  'local_http': 'https://%s' % get_self_ip(),
125
130
  'mac': mac,
126
131
  'hub_uid': dynamic_settings['core__hub_uid'],
@@ -141,6 +146,7 @@ def sync_with_remote():
141
146
  'users': [],
142
147
  }
143
148
 
149
+ users_included = set()
144
150
  for iuser in instance.instance_users.all().select_related('user', 'role'):
145
151
  instance_data['users'].append({
146
152
  'email': iuser.user.email,
@@ -150,11 +156,16 @@ def sync_with_remote():
150
156
  'is_active': iuser.is_active,
151
157
  'device_token': iuser.user.primary_device_token
152
158
  })
159
+ users_included.add(iuser.user.id)
153
160
 
154
161
  # Include god mode users!
155
162
  for user in User.objects.filter(
156
- roles=None, is_master=True
157
- ).exclude(email__in=('system@simo.io', 'device@simo.io')).distinct():
163
+ is_master=True
164
+ ).exclude(
165
+ email__in=('system@simo.io', 'device@simo.io')
166
+ ).exclude(id__in=users_included).distinct():
167
+ if not user.is_active:
168
+ continue
158
169
  instance_data['users'].append({
159
170
  'email': user.email,
160
171
  'is_hub_master': True,
@@ -456,8 +467,14 @@ def maybe_update_to_latest():
456
467
  return
457
468
  latest = list(resp.json()['releases'].keys())[-1]
458
469
  dynamic_settings['core__latest_version_available'] = latest
459
- if dynamic_settings['core__latest_version_available'] == \
460
- pkg_resources.get_distribution('simo').version:
470
+
471
+ try:
472
+ version = pkg_resources.get_distribution('simo').version
473
+ except:
474
+ # dev environment
475
+ version = dynamic_settings['core__latest_version_available']
476
+
477
+ if dynamic_settings['core__latest_version_available'] == version:
461
478
  print("Up to date!")
462
479
  return
463
480
 
Binary file
simo/fleet/admin.py CHANGED
@@ -3,7 +3,7 @@ from django.contrib import admin
3
3
  from django.utils.safestring import mark_safe
4
4
  from django.template.loader import render_to_string
5
5
  from django.templatetags.static import static
6
- from simo.core.models import Component
6
+ from simo.core.middleware import get_current_instance
7
7
  from simo.core.utils.admin import FormAction
8
8
  from .models import Colonel, Interface, ColonelPin
9
9
  from .forms import ColonelAdminForm, MoveColonelForm, InterfaceAdminForm
@@ -75,9 +75,7 @@ class ColonelAdmin(admin.ModelAdmin):
75
75
 
76
76
  def get_queryset(self, request):
77
77
  qs = super().get_queryset(request)
78
- if request.user.is_master:
79
- return qs
80
- return qs.filter(instance__in=request.user.instances)
78
+ return qs.filter(instance=get_current_instance())
81
79
 
82
80
  def save_model(self, request, obj, form, change):
83
81
  super().save_model(request, obj, form, change)
@@ -173,6 +171,11 @@ class InterfaceAdmin(admin.ModelAdmin):
173
171
  list_filter = 'colonel', 'type'
174
172
  actions = 'broadcast_reset'
175
173
 
174
+ def get_queryset(self, request):
175
+ return super().get_queryset(request).filter(
176
+ colonel__instance=get_current_instance()
177
+ )
178
+
176
179
  def broadcast_reset(self, request, queryset):
177
180
  broadcasted = 0
178
181
  for interface in queryset.filter(
simo/fleet/managers.py CHANGED
@@ -8,7 +8,7 @@ class ColonelsManager(models.Manager):
8
8
  qs = super().get_queryset()
9
9
  instance = get_current_instance()
10
10
  if instance:
11
- qs = qs.filter(instance=instance)
11
+ qs = qs.filter(instance__is_active=True)
12
12
  return qs
13
13
 
14
14
 
@@ -18,7 +18,7 @@ class ColonelPinsManager(models.Manager):
18
18
  qs = super().get_queryset()
19
19
  instance = get_current_instance()
20
20
  if instance:
21
- qs = qs.filter(colonel__instance=instance)
21
+ qs = qs.filter(colonel__instance__is_active=True)
22
22
  return qs
23
23
 
24
24
 
@@ -28,7 +28,7 @@ class InterfacesManager(models.Manager):
28
28
  qs = super().get_queryset()
29
29
  instance = get_current_instance()
30
30
  if instance:
31
- qs = qs.filter(colonel__instance=instance)
31
+ qs = qs.filter(colonel__instance__is_active=True)
32
32
  return qs
33
33
 
34
34
 
@@ -13,6 +13,7 @@ import paho.mqtt.client as mqtt
13
13
  from channels.generic.websocket import AsyncWebsocketConsumer
14
14
  from asgiref.sync import sync_to_async
15
15
  from simo.core.utils.model_helpers import get_log_file_path
16
+ from simo.core.middleware import introduce_instance
16
17
  from simo.core.utils.logs import capture_socket_errors
17
18
  from simo.core.events import GatewayObjectCommand, get_event_obj
18
19
  from simo.core.models import Gateway, Instance, Component
@@ -86,8 +87,9 @@ class FleetConsumer(AsyncWebsocketConsumer):
86
87
  tz = await sync_to_async(get_tz, thread_sensitive=True)()
87
88
  timezone.activate(tz)
88
89
 
90
+ introduce_instance(self.instance)
91
+
89
92
  def get_colonel():
90
- # looks like update_or_create doesn't work in socket/async environment.
91
93
  defaults={
92
94
  'instance': self.instance,
93
95
  'name': headers.get('colonel-name'),
@@ -96,16 +98,22 @@ class FleetConsumer(AsyncWebsocketConsumer):
96
98
  'last_seen': timezone.now(),
97
99
  'enabled': True
98
100
  }
99
- with transaction.atomic():
100
- colonel, new = Colonel.objects.get_or_create(
101
- uid=headers['colonel-uid'], defaults=defaults
101
+ # !!!!! ATETION! !!!!!!!
102
+ # update_or_create and get_or_create doesn't
103
+ # provide reliable operation in socket/async environment.
104
+ new = False
105
+ colonel = Colonel.objects.filter(uid=headers['colonel-uid']).first()
106
+ if not colonel:
107
+ new = True
108
+ colonel = Colonel.objects.create(
109
+ uid=headers['colonel-uid'], **defaults
102
110
  )
103
- if not new:
104
- for key, val in defaults.items():
105
- if key == 'name':
106
- continue
107
- setattr(colonel, key, val)
108
- colonel.save()
111
+ else:
112
+ for key, val in defaults.items():
113
+ if key == 'name':
114
+ continue
115
+ setattr(colonel, key, val)
116
+ colonel.save()
109
117
 
110
118
  return colonel, new
111
119
 
@@ -232,6 +240,7 @@ class FleetConsumer(AsyncWebsocketConsumer):
232
240
  }
233
241
 
234
242
  def get_components(colonel):
243
+ introduce_instance(self.instance)
235
244
  return list(
236
245
  colonel.components.all().prefetch_related('slaves')
237
246
  )
@@ -357,6 +366,7 @@ class FleetConsumer(AsyncWebsocketConsumer):
357
366
 
358
367
  async def receive(self, text_data=None, bytes_data=None):
359
368
  try:
369
+ introduce_instance(self.instance)
360
370
  if text_data:
361
371
  print(f"{self.colonel}: {text_data}")
362
372
  data = json.loads(text_data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.5.23
3
+ Version: 2.5.25
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
@@ -41,7 +41,7 @@ simo/core/apps.py,sha256=CsqpiQerhmrMsH-wGiG-gQgXd9qEkIi-LUaA9cXpKSw,425
41
41
  simo/core/auto_urls.py,sha256=nNXEgLAAAQAhRWQDA9AbDtw-zcPKmu_pufJaSa8g818,1102
42
42
  simo/core/autocomplete_views.py,sha256=l7DmpoeXcwjmBda--tT6zFQTNcyfYpgTaryWP-ghETU,3846
43
43
  simo/core/base_types.py,sha256=WypW8hTfzveuTQtruGjLYAGQZIuczxTlW-SdRk3iQug,666
44
- simo/core/context.py,sha256=snfPIGcZQTrx8iiZc5PI91A0dRQH6y5kH4uG_lfhU6Q,1486
44
+ simo/core/context.py,sha256=xH7Fdd2uO7CMm3a1QHnYJTZfEfPfBDFSScKxAx6q69o,1549
45
45
  simo/core/controllers.py,sha256=JvXdwXD7iotA7fIjZmBVshKLQGSt9Na48FMAyHRDh84,35615
46
46
  simo/core/dynamic_settings.py,sha256=bUs58XEZOCIEhg1TigR3LmYggli13KMryBZ9pC7ugAQ,1872
47
47
  simo/core/events.py,sha256=fH6d5HcPdDqT3R7CZPdo69qTszJ23j3GJt3IFOso3WA,4757
@@ -59,7 +59,7 @@ simo/core/serializers.py,sha256=WgksN1Ombv240nfQR_UtmKslTWM9vz9Y0yTdN5usiHU,2189
59
59
  simo/core/signal_receivers.py,sha256=WYBRCFJhP83Ukd-Ipc1HlNyTXdTHD1rl0tV3uOKnYWY,8861
60
60
  simo/core/socket_consumers.py,sha256=trRZvBGTJ7xIbfdmVvn7zoiWp_qssSkMZykDrI5YQyE,9783
61
61
  simo/core/storage.py,sha256=_5igjaoWZAiExGWFEJMElxUw55DzJG1jqFty33xe8BE,342
62
- simo/core/tasks.py,sha256=0DUXplfS25DxbzVXgomo_q73rQjddo3kS5J-S04cJkk,16128
62
+ simo/core/tasks.py,sha256=KjRx7X948A7j-ZKZNU0LucV-HGRQnd4ai6ikb49yYb0,16517
63
63
  simo/core/todos.py,sha256=eYVXfLGiapkxKK57XuviSNe3WsUYyIWZ0hgQJk7ThKo,665
64
64
  simo/core/types.py,sha256=WJEq48mIbFi_5Alt4wxWMGXxNxUTXqfQU5koH7wqHHI,1108
65
65
  simo/core/views.py,sha256=3SRZr00fyLQf8ja3U-9eekKt-ld5TvU1WQqUWprXfQ4,2390
@@ -92,7 +92,7 @@ simo/core/__pycache__/serializers.cpython-38.pyc,sha256=d4wpUjFuo8GxaNWbin9GdHKi
92
92
  simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=ZxsQUC_bijcKs2A9BifeqdI5JVS0RCsZpdcBTRoT8o8,6733
93
93
  simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=KqbO1cOewodVPcy0-htVefyUjCuELKV0o7fOfYqfgPc,8490
94
94
  simo/core/__pycache__/storage.cpython-38.pyc,sha256=9R1Xu0FJDflfRXUPsqEgt0SpwiP7FGk7HaR8s8XRyI8,721
95
- simo/core/__pycache__/tasks.cpython-38.pyc,sha256=AkLMqXd-wW2sEI1A3RgSE0iF1s0S3nh9bAq9d4kW7bw,10790
95
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=PN2_K7yt2lDRYqbkKIozcENhq0gkW5muE0GVKevLM6o,10951
96
96
  simo/core/__pycache__/todos.cpython-38.pyc,sha256=lOqGZ58siHM3isoJV4r7sg8igrfE9fFd-jSfeBa0AQI,253
97
97
  simo/core/__pycache__/views.cpython-38.pyc,sha256=K_QM967bIJeU02DJu0Dm7j8RiFDKn_TLzX77YzNkA7c,2495
98
98
  simo/core/__pycache__/widgets.cpython-38.pyc,sha256=sR0ZeHCHrhnNDBJuRrxp3zUsfBp0xrtF0xrK2TkQv1o,3520
@@ -146,7 +146,7 @@ simo/core/drf_braces/tests/serializers/test_enforce_validation_serializer.py,sha
146
146
  simo/core/drf_braces/tests/serializers/test_form_serializer.py,sha256=IE2xQ1SzhSsOy2BFsBYw_Po-ujKBgIuNoTRxCzhyilE,12995
147
147
  simo/core/drf_braces/tests/serializers/test_swapping.py,sha256=o-B5YV5HDxHCVrXYGODeF7lB3rPDGtafNgClx97d6w4,1220
148
148
  simo/core/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
- simo/core/management/update.py,sha256=t-54NN9enr10ldWRemmIHEaSQSOHqTchbZzqucm1P6s,1911
149
+ simo/core/management/update.py,sha256=CDve2OAKBLJpnuhIgOp7riqBm_gl9D0oNKmNOFXGq2E,1964
150
150
  simo/core/management/__pycache__/__init__.cpython-38.pyc,sha256=Ptf1WzljXMt3wP1tzOy6q3JfLERYDs66wSHBVdrzjHg,169
151
151
  simo/core/management/_hub_template/hub/asgi.py,sha256=ElN_fdeSkf0Ysa7pS9rJVmZ1HmLhFxb8jFaMLqe1220,126
152
152
  simo/core/management/_hub_template/hub/celeryc.py,sha256=3ksDXftIZKJ4Cq9WNKJERdZdQlDEnjTQXycweRFmsSQ,27
@@ -10218,7 +10218,7 @@ simo/core/utils/__pycache__/serialization.cpython-38.pyc,sha256=9nTbzozDi8Avl6kr
10218
10218
  simo/core/utils/__pycache__/type_constants.cpython-38.pyc,sha256=DEgtIL7cPWeIsjGaPf-qIHXzfOTJUJIBxDCbKDTs64s,3417
10219
10219
  simo/core/utils/__pycache__/validators.cpython-38.pyc,sha256=gjeBOjL_keMoRDjdn8v-3F3wcjPIT3Xx5KpTalo0e-Y,1247
10220
10220
  simo/fleet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10221
- simo/fleet/admin.py,sha256=3iQLbpJnPku4MSp4sOL3Wj01lZQBBPyGV-bzTrRxKA4,6295
10221
+ simo/fleet/admin.py,sha256=3udiNaNoL37699SN-rQqjvvZ0lO2pi2zvg9SqZPp5R0,6403
10222
10222
  simo/fleet/api.py,sha256=bK-j762v-KsPIvdh2SQCVC3TZ0D_RZgAaIyOfyNifeU,3108
10223
10223
  simo/fleet/auto_urls.py,sha256=UX66eR2ykMqFgfIllW-RTdjup5-FieCWl_BVm3CcXKg,702
10224
10224
  simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
@@ -10226,16 +10226,16 @@ simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
10226
10226
  simo/fleet/controllers.py,sha256=fjri1GtCnflkkDpNqhTwy6i9CK6RDEB0Q_BtADzcG8E,29156
10227
10227
  simo/fleet/forms.py,sha256=LbYphCtfpSxK3GwzSrcbMkB_spcspsf5FzYQFE9n-Q4,62614
10228
10228
  simo/fleet/gateways.py,sha256=lKEJW0MgaOEiNnijH50DNSVChvaUT3TA3UurcI57P8k,5677
10229
- simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
10229
+ simo/fleet/managers.py,sha256=ZNeHFSkF5kzsl9E1DCBevOW6kXJlD6kw0LU4B-JMOG8,828
10230
10230
  simo/fleet/models.py,sha256=xAffeAh5hf8NC94B66ZqmYoF7qDN53wEQ1xE2E9D8Xc,17524
10231
10231
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10232
10232
  simo/fleet/serializers.py,sha256=X2M0DFKVaxM6JFGDsdg3S2nJlLIcBvbujidZdfxD88w,2169
10233
- simo/fleet/socket_consumers.py,sha256=8RLEmKQ0Q7nVgJJ6IrU4ioocsWBJrgBVH_AUpVas1no,18095
10233
+ simo/fleet/socket_consumers.py,sha256=nfwMAzHHDWrvmwOIfPJqYHgr2fF-OJ_l6gWOnljyFWI,18434
10234
10234
  simo/fleet/tasks.py,sha256=AGq9BXFNAqkhOANsPvId8yjEbDtVCB3MRsi_AKDpgIM,821
10235
10235
  simo/fleet/utils.py,sha256=wNJvURzLP3-aho3D3rfg07N9kWCaMIw5gOsmeeO9Nlg,4740
10236
10236
  simo/fleet/views.py,sha256=jT3GcGv_JEj3dqyfHH2whCnGqwT8YEAuFxRgIX4Dk9w,3237
10237
10237
  simo/fleet/__pycache__/__init__.cpython-38.pyc,sha256=pIZE7EL6-cuJ3pQtaSwjKLrKLsTYelp1k9sRhXKLh6s,159
10238
- simo/fleet/__pycache__/admin.cpython-38.pyc,sha256=IqVvpyyOnHChnEc07GubvtH6Tk1PA0rcYGYrJDg0hm4,6503
10238
+ simo/fleet/__pycache__/admin.cpython-38.pyc,sha256=iweeu5AkaggBhQntP6-VF_eEodkNc6E7zKy0VjfwC2o,6652
10239
10239
  simo/fleet/__pycache__/api.cpython-38.pyc,sha256=Ntc1sYKZMygW2eNTxVUgoeCF3StoUZcZA7ST7iYKrlg,3846
10240
10240
  simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=Tc6a6BCXHjijP8U2jE2ghlJwnSNrGm59-hW5t-80wF0,689
10241
10241
  simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
@@ -10243,11 +10243,11 @@ simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9o
10243
10243
  simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=jtFHr_uyjCCeuidL-o-hGaf21u0fnxK_O6hTRdY6lpc,24906
10244
10244
  simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=tvoi9np3Empg1GYBFTChznEy09M0v6UBRaGz9FZCJxc,42300
10245
10245
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=0RKVn0ndreVKhsrukqeLPSdMnRrsQ_W7yeVeBkRLfIk,5058
10246
- simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
10246
+ simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=Vmm23zoQnS3-uS5_WJt2n3wtjhLiEhLWaYxXJCU6Gts,1339
10247
10247
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=d1Reu7cAryqGuA_Z0eqVsX7SFUo4_jNnyi1JbK7mWuI,14138
10248
10248
  simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
10249
10249
  simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=gIWHJaSUbTe9H_xerD29Fz7BxIqXNzBI60GsIVXbNdY,3134
10250
- simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=phXtf8df1cToGMuJLSj0rnxeLs3NIgEmFy3BqpWvtsE,13893
10250
+ simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=YUu6CroTABvoZGRHnE-bVno1-5pUWLSA0wOQkbrHfuo,14032
10251
10251
  simo/fleet/__pycache__/tasks.cpython-38.pyc,sha256=RoNxL2WUiW67s9O9DjaYVVjCBSZu2nje0Qn9FJkWVS0,1116
10252
10252
  simo/fleet/__pycache__/utils.cpython-38.pyc,sha256=obUd-X2Y-ybx4icqUWq_qwIxrP9yyarJjexWAfO4MTI,3344
10253
10253
  simo/fleet/__pycache__/views.cpython-38.pyc,sha256=wilxSvZliSKQ5qC7JjWneYBSdbeZeTsF5uDrOQVmvms,3181
@@ -10561,9 +10561,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10561
10561
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10562
10562
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10563
10563
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10564
- simo-2.5.23.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10565
- simo-2.5.23.dist-info/METADATA,sha256=-vWzMgKAjan4BPPOY4e0LcmrR0BJljvaEH9uf52c1ks,1924
10566
- simo-2.5.23.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10567
- simo-2.5.23.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10568
- simo-2.5.23.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10569
- simo-2.5.23.dist-info/RECORD,,
10564
+ simo-2.5.25.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10565
+ simo-2.5.25.dist-info/METADATA,sha256=0QbwBkQyX8aCdHsmCEsHZAP2gqvrBugk80H1VV06kRI,1924
10566
+ simo-2.5.25.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10567
+ simo-2.5.25.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10568
+ simo-2.5.25.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10569
+ simo-2.5.25.dist-info/RECORD,,
File without changes