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.
- synapse/cortex.py +99 -10
- synapse/datamodel.py +5 -0
- synapse/lib/agenda.py +3 -0
- synapse/lib/ast.py +70 -12
- synapse/lib/cell.py +83 -21
- synapse/lib/httpapi.py +3 -0
- synapse/lib/layer.py +75 -6
- synapse/lib/node.py +7 -0
- synapse/lib/snap.py +25 -5
- synapse/lib/storm.py +1 -1
- synapse/lib/stormlib/cortex.py +1 -1
- synapse/lib/stormlib/model.py +420 -1
- synapse/lib/stormtypes.py +68 -3
- synapse/lib/types.py +35 -0
- synapse/lib/version.py +2 -2
- synapse/lib/view.py +94 -24
- synapse/models/files.py +40 -0
- synapse/models/inet.py +8 -4
- synapse/models/infotech.py +355 -17
- synapse/tests/files/cpedata.json +525034 -0
- synapse/tests/test_cortex.py +99 -0
- synapse/tests/test_lib_agenda.py +17 -3
- synapse/tests/test_lib_ast.py +66 -0
- synapse/tests/test_lib_cell.py +133 -52
- synapse/tests/test_lib_layer.py +52 -1
- synapse/tests/test_lib_scrape.py +72 -71
- synapse/tests/test_lib_snap.py +16 -1
- synapse/tests/test_lib_storm.py +118 -0
- synapse/tests/test_lib_stormlib_cortex.py +27 -0
- synapse/tests/test_lib_stormlib_model.py +532 -0
- synapse/tests/test_lib_stormtypes.py +161 -14
- synapse/tests/test_lib_types.py +20 -0
- synapse/tests/test_lib_view.py +77 -0
- synapse/tests/test_model_files.py +51 -0
- synapse/tests/test_model_inet.py +63 -1
- synapse/tests/test_model_infotech.py +187 -26
- synapse/tests/utils.py +12 -0
- {synapse-2.168.0.dist-info → synapse-2.170.0.dist-info}/METADATA +1 -1
- {synapse-2.168.0.dist-info → synapse-2.170.0.dist-info}/RECORD +42 -41
- {synapse-2.168.0.dist-info → synapse-2.170.0.dist-info}/LICENSE +0 -0
- {synapse-2.168.0.dist-info → synapse-2.170.0.dist-info}/WHEEL +0 -0
- {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) >
|
|
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',
|
|
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
|
|
2723
|
-
|
|
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
|
-
|
|
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.
|
|
2354
|
+
self.confirm(('view', 'read'), gateiden=viewiden)
|
|
2355
2355
|
snap = await view.snap(self.user)
|
|
2356
2356
|
|
|
2357
2357
|
return snap
|
synapse/lib/stormlib/cortex.py
CHANGED
|
@@ -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):
|