synapse 2.168.0__py311-none-any.whl → 2.170.0__py311-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 synapse might be problematic. Click here for more details.

Files changed (42) hide show
  1. synapse/cortex.py +99 -10
  2. synapse/datamodel.py +5 -0
  3. synapse/lib/agenda.py +3 -0
  4. synapse/lib/ast.py +70 -12
  5. synapse/lib/cell.py +83 -21
  6. synapse/lib/httpapi.py +3 -0
  7. synapse/lib/layer.py +75 -6
  8. synapse/lib/node.py +7 -0
  9. synapse/lib/snap.py +25 -5
  10. synapse/lib/storm.py +1 -1
  11. synapse/lib/stormlib/cortex.py +1 -1
  12. synapse/lib/stormlib/model.py +420 -1
  13. synapse/lib/stormtypes.py +68 -3
  14. synapse/lib/types.py +35 -0
  15. synapse/lib/version.py +2 -2
  16. synapse/lib/view.py +94 -24
  17. synapse/models/files.py +40 -0
  18. synapse/models/inet.py +8 -4
  19. synapse/models/infotech.py +355 -17
  20. synapse/tests/files/cpedata.json +525034 -0
  21. synapse/tests/test_cortex.py +99 -0
  22. synapse/tests/test_lib_agenda.py +17 -3
  23. synapse/tests/test_lib_ast.py +66 -0
  24. synapse/tests/test_lib_cell.py +133 -52
  25. synapse/tests/test_lib_layer.py +52 -1
  26. synapse/tests/test_lib_scrape.py +72 -71
  27. synapse/tests/test_lib_snap.py +16 -1
  28. synapse/tests/test_lib_storm.py +118 -0
  29. synapse/tests/test_lib_stormlib_cortex.py +27 -0
  30. synapse/tests/test_lib_stormlib_model.py +532 -0
  31. synapse/tests/test_lib_stormtypes.py +161 -14
  32. synapse/tests/test_lib_types.py +20 -0
  33. synapse/tests/test_lib_view.py +77 -0
  34. synapse/tests/test_model_files.py +51 -0
  35. synapse/tests/test_model_inet.py +63 -1
  36. synapse/tests/test_model_infotech.py +187 -26
  37. synapse/tests/utils.py +12 -0
  38. {synapse-2.168.0.dist-info → synapse-2.170.0.dist-info}/METADATA +1 -1
  39. {synapse-2.168.0.dist-info → synapse-2.170.0.dist-info}/RECORD +42 -41
  40. {synapse-2.168.0.dist-info → synapse-2.170.0.dist-info}/LICENSE +0 -0
  41. {synapse-2.168.0.dist-info → synapse-2.170.0.dist-info}/WHEEL +0 -0
  42. {synapse-2.168.0.dist-info → synapse-2.170.0.dist-info}/top_level.txt +0 -0
synapse/lib/layer.py CHANGED
@@ -107,6 +107,7 @@ reqValidLdef = s_config.getJsValidator({
107
107
  })
108
108
 
109
109
  WINDOW_MAXSIZE = 10_000
110
+ MIGR_COMMIT_SIZE = 1_000
110
111
 
111
112
  class LayerApi(s_cell.CellApi):
112
113
 
@@ -2612,7 +2613,7 @@ class Layer(s_nexus.Pusher):
2612
2613
  venc = lkey[32:]
2613
2614
 
2614
2615
  putkeys.append((n1buid + n2buid, venc))
2615
- if len(putkeys) > 1000:
2616
+ if len(putkeys) > MIGR_COMMIT_SIZE:
2616
2617
  commit()
2617
2618
 
2618
2619
  if len(putkeys):
@@ -2623,6 +2624,33 @@ class Layer(s_nexus.Pusher):
2623
2624
 
2624
2625
  logger.warning(f'...complete!')
2625
2626
 
2627
+ async def _layrV10toV11(self):
2628
+
2629
+ logger.warning(f'Adding byform index to layer {self.iden}')
2630
+
2631
+ def commit():
2632
+ self.layrslab.putmulti(putkeys, db=self.byform)
2633
+ putkeys.clear()
2634
+
2635
+ putkeys = []
2636
+ async for buid, sode in self.getStorNodes():
2637
+ if not (form := sode.get('form')):
2638
+ continue
2639
+
2640
+ abrv = self.setPropAbrv(form, None)
2641
+ putkeys.append((abrv, buid))
2642
+
2643
+ if len(putkeys) > MIGR_COMMIT_SIZE:
2644
+ commit()
2645
+
2646
+ if putkeys:
2647
+ commit()
2648
+
2649
+ self.meta.set('version', 11)
2650
+ self.layrvers = 11
2651
+
2652
+ logger.warning('...complete!')
2653
+
2626
2654
  async def _initSlabs(self, slabopts):
2627
2655
 
2628
2656
  otherslabopts = {
@@ -2659,6 +2687,7 @@ class Layer(s_nexus.Pusher):
2659
2687
  self.edgesn1n2 = self.layrslab.initdb('edgesn1n2', dupsort=True)
2660
2688
 
2661
2689
  self.bytag = self.layrslab.initdb('bytag', dupsort=True)
2690
+ self.byform = self.layrslab.initdb('byform', dupsort=True)
2662
2691
  self.byprop = self.layrslab.initdb('byprop', dupsort=True)
2663
2692
  self.byarray = self.layrslab.initdb('byarray', dupsort=True)
2664
2693
  self.bytagprop = self.layrslab.initdb('bytagprop', dupsort=True)
@@ -2684,7 +2713,7 @@ class Layer(s_nexus.Pusher):
2684
2713
  await self._initSlabs(slabopts)
2685
2714
 
2686
2715
  if self.fresh:
2687
- self.meta.set('version', 10)
2716
+ self.meta.set('version', 11)
2688
2717
 
2689
2718
  self.layrslab.addResizeCallback(self.core.checkFreeSpace)
2690
2719
  self.dataslab.addResizeCallback(self.core.checkFreeSpace)
@@ -2719,8 +2748,11 @@ class Layer(s_nexus.Pusher):
2719
2748
  if self.layrvers < 10:
2720
2749
  await self._layrV9toV10()
2721
2750
 
2722
- if self.layrvers != 10:
2723
- mesg = f'Got layer version {self.layrvers}. Expected 10. Accidental downgrade?'
2751
+ if self.layrvers < 11:
2752
+ await self._layrV10toV11()
2753
+
2754
+ if self.layrvers != 11:
2755
+ mesg = f'Got layer version {self.layrvers}. Expected 11. Accidental downgrade?'
2724
2756
  raise s_exc.BadStorageVersion(mesg=mesg)
2725
2757
 
2726
2758
  async def getLayerSize(self):
@@ -3323,6 +3355,11 @@ class Layer(s_nexus.Pusher):
3323
3355
  return
3324
3356
 
3325
3357
  # no more refs in this layer. time to pop it...
3358
+ try:
3359
+ abrv = self.getPropAbrv(sode.get('form'), None)
3360
+ self.layrslab.delete(abrv, val=buid, db=self.byform)
3361
+ except s_exc.NoSuchAbrv:
3362
+ pass
3326
3363
  self.dirty.pop(buid, None)
3327
3364
  self.buidcache.pop(buid, None)
3328
3365
  self.layrslab.delete(buid, db=self.bybuidv3)
@@ -3343,11 +3380,14 @@ class Layer(s_nexus.Pusher):
3343
3380
  if sode.get('valu') == valt:
3344
3381
  return ()
3345
3382
 
3383
+ abrv = self.setPropAbrv(form, None)
3384
+
3385
+ if sode.get('form') is None:
3386
+ self.layrslab.put(abrv, buid, db=self.byform)
3387
+
3346
3388
  sode['valu'] = valt
3347
3389
  self.setSodeDirty(buid, sode, form)
3348
3390
 
3349
- abrv = self.setPropAbrv(form, None)
3350
-
3351
3391
  if stortype & STOR_FLAG_ARRAY:
3352
3392
 
3353
3393
  for indx in self.getStorIndx(stortype, valu):
@@ -3467,6 +3507,10 @@ class Layer(s_nexus.Pusher):
3467
3507
  if univabrv is not None:
3468
3508
  self.layrslab.delete(univabrv + oldi, buid, db=self.byprop)
3469
3509
 
3510
+ if sode.get('form') is None:
3511
+ formabrv = self.setPropAbrv(form, None)
3512
+ self.layrslab.put(formabrv, buid, db=self.byform)
3513
+
3470
3514
  sode['props'][prop] = (valu, stortype)
3471
3515
  self.setSodeDirty(buid, sode, form)
3472
3516
 
@@ -3561,6 +3605,9 @@ class Layer(s_nexus.Pusher):
3561
3605
  if oldv == valu:
3562
3606
  return ()
3563
3607
 
3608
+ if sode.get('form') is None:
3609
+ self.layrslab.put(formabrv, buid, db=self.byform)
3610
+
3564
3611
  sode['tags'][tag] = valu
3565
3612
  self.setSodeDirty(buid, sode, form)
3566
3613
 
@@ -3624,6 +3671,10 @@ class Layer(s_nexus.Pusher):
3624
3671
  self.layrslab.delete(tp_abrv + oldi, buid, db=self.bytagprop)
3625
3672
  self.layrslab.delete(ftp_abrv + oldi, buid, db=self.bytagprop)
3626
3673
 
3674
+ if sode.get('form') is None:
3675
+ formabrv = self.setPropAbrv(form, None)
3676
+ self.layrslab.put(formabrv, buid, db=self.byform)
3677
+
3627
3678
  if tag not in sode['tagprops']:
3628
3679
  sode['tagprops'][tag] = {}
3629
3680
  sode['tagprops'][tag][prop] = (valu, stortype)
@@ -3682,6 +3733,8 @@ class Layer(s_nexus.Pusher):
3682
3733
  # a bit of special case...
3683
3734
  if sode.get('form') is None:
3684
3735
  self.setSodeDirty(buid, sode, form)
3736
+ formabrv = self.setPropAbrv(form, None)
3737
+ self.layrslab.put(formabrv, buid, db=self.byform)
3685
3738
 
3686
3739
  if oldb is not None:
3687
3740
  oldv = s_msgpack.un(oldb)
@@ -3729,6 +3782,8 @@ class Layer(s_nexus.Pusher):
3729
3782
  # a bit of special case...
3730
3783
  if sode.get('form') is None:
3731
3784
  self.setSodeDirty(buid, sode, form)
3785
+ formabrv = self.setPropAbrv(form, None)
3786
+ self.layrslab.put(formabrv, buid, db=self.byform)
3732
3787
 
3733
3788
  self.layrslab.put(venc, buid + n2buid, db=self.byverb)
3734
3789
  self.layrslab.put(n1key, n2buid, db=self.edgesn1)
@@ -4208,6 +4263,20 @@ class Layer(s_nexus.Pusher):
4208
4263
  yield buid, s_msgpack.un(byts)
4209
4264
  await asyncio.sleep(0)
4210
4265
 
4266
+ async def getStorNodesByForm(self, form):
4267
+ '''
4268
+ Yield (buid, sode) tuples for nodes of a given form with props/tags/tagprops/edges/nodedata in this layer.
4269
+ '''
4270
+ try:
4271
+ abrv = self.getPropAbrv(form, None)
4272
+ except s_exc.NoSuchAbrv:
4273
+ return
4274
+
4275
+ for _, buid in self.layrslab.scanByDups(abrv, db=self.byform):
4276
+ sode = await self.getStorNode(buid)
4277
+ yield buid, sode
4278
+ await asyncio.sleep(0)
4279
+
4211
4280
  async def iterNodeEditLog(self, offs=0):
4212
4281
  '''
4213
4282
  Iterate the node edit log and yield (offs, edits, meta) tuples.
synapse/lib/node.py CHANGED
@@ -237,6 +237,13 @@ class Node:
237
237
  for item in valu:
238
238
  retn.append((name, (dest, item)))
239
239
 
240
+ for name in refs.get('ndefarray', ()):
241
+ if (valu := self.props.get(name)) is None:
242
+ continue
243
+
244
+ for item in valu:
245
+ retn.append((name, item))
246
+
240
247
  return retn
241
248
 
242
249
  async def set(self, name, valu, init=False):
synapse/lib/snap.py CHANGED
@@ -183,6 +183,15 @@ class ProtoNode:
183
183
 
184
184
  return s_common.novalu
185
185
 
186
+ async def hasData(self, name):
187
+ if name in self.nodedata:
188
+ return True
189
+
190
+ if self.node is not None:
191
+ return await self.node.hasData(name)
192
+
193
+ return False
194
+
186
195
  async def setData(self, name, valu):
187
196
 
188
197
  if await self.getData(name) == valu:
@@ -287,6 +296,15 @@ class ProtoNode:
287
296
  if self.node is not None:
288
297
  return self.node.getTagProp(tag, name)
289
298
 
299
+ def hasTagProp(self, tag, name):
300
+ if (tag, name) in self.tagprops:
301
+ return True
302
+
303
+ if self.node is not None:
304
+ return self.node.hasTagProp(tag, name)
305
+
306
+ return False
307
+
290
308
  async def setTagProp(self, tag, name, valu):
291
309
 
292
310
  tagnode = await self.addTag(tag)
@@ -322,7 +340,7 @@ class ProtoNode:
322
340
  if self.node is not None:
323
341
  return self.node.get(name)
324
342
 
325
- async def _set(self, prop, valu, norminfo=None):
343
+ async def _set(self, prop, valu, norminfo=None, ignore_ro=False):
326
344
 
327
345
  if prop.locked:
328
346
  mesg = f'Prop {prop.full} is locked due to deprecation.'
@@ -360,7 +378,7 @@ class ProtoNode:
360
378
  if curv == valu:
361
379
  return False
362
380
 
363
- if prop.info.get('ro') and curv is not None:
381
+ if not ignore_ro and prop.info.get('ro') and curv is not None:
364
382
  mesg = f'Property is read only: {prop.full}.'
365
383
  await self.ctx.snap._raiseOnStrict(s_exc.ReadOnlyProp, mesg)
366
384
  return False
@@ -372,12 +390,12 @@ class ProtoNode:
372
390
 
373
391
  return valu, norminfo
374
392
 
375
- async def set(self, name, valu, norminfo=None):
393
+ async def set(self, name, valu, norminfo=None, ignore_ro=False):
376
394
  prop = self.form.props.get(name)
377
395
  if prop is None:
378
396
  return False
379
397
 
380
- retn = await self._set(prop, valu, norminfo=norminfo)
398
+ retn = await self._set(prop, valu, norminfo=norminfo, ignore_ro=ignore_ro)
381
399
  if retn is False:
382
400
  return False
383
401
 
@@ -717,7 +735,9 @@ class Snap(s_base.Base):
717
735
 
718
736
  show_storage = False
719
737
 
720
- self.core._logStormQuery(text, user, info={'mode': opts.get('mode', 'storm'), 'view': self.view.iden})
738
+ info = opts.get('_loginfo', {})
739
+ info.update({'mode': opts.get('mode', 'storm'), 'view': self.view.iden})
740
+ self.core._logStormQuery(text, user, info=info)
721
741
 
722
742
  # { form: ( embedprop, ... ) }
723
743
  embeds = opts.get('embeds')
synapse/lib/storm.py CHANGED
@@ -2351,7 +2351,7 @@ class Runtime(s_base.Base):
2351
2351
  if view is None:
2352
2352
  raise s_exc.NoSuchView(mesg=f'No such view iden={viewiden}', iden=viewiden)
2353
2353
 
2354
- self.user.confirm(('view', 'read'), gateiden=viewiden)
2354
+ self.confirm(('view', 'read'), gateiden=viewiden)
2355
2355
  snap = await view.snap(self.user)
2356
2356
 
2357
2357
  return snap
@@ -980,7 +980,7 @@ class HttpReq(s_stormtypes.StormType):
980
980
  try:
981
981
  return json.loads(self.rnfo.get('body'))
982
982
  except (UnicodeDecodeError, json.JSONDecodeError) as e:
983
- raise s_exc.StormRuntimeError(mesg='Failed to decode request body as JSON: {e}') from None
983
+ raise s_exc.StormRuntimeError(mesg=f'Failed to decode request body as JSON: {e}') from None
984
984
 
985
985
  @s_stormtypes.stormfunc(readonly=True)
986
986
  async def _methSendCode(self, code):