synapse 2.218.1__py311-none-any.whl → 2.220.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 (37) hide show
  1. synapse/cortex.py +113 -14
  2. synapse/daemon.py +2 -1
  3. synapse/data/__init__.py +4 -0
  4. synapse/data/lark/__init__.py +0 -0
  5. synapse/data/lark/imap.lark +8 -0
  6. synapse/exc.py +2 -0
  7. synapse/lib/ast.py +86 -84
  8. synapse/lib/json.py +6 -5
  9. synapse/lib/layer.py +27 -0
  10. synapse/lib/link.py +49 -50
  11. synapse/lib/parser.py +3 -5
  12. synapse/lib/schemas.py +25 -0
  13. synapse/lib/storm.py +1 -0
  14. synapse/lib/stormlib/imap.py +476 -35
  15. synapse/lib/stormtypes.py +177 -2
  16. synapse/lib/version.py +2 -2
  17. synapse/models/inet.py +3 -0
  18. synapse/tests/files/stormpkg/badinits.yaml +12 -0
  19. synapse/tests/files/stormpkg/testpkg.yaml +12 -0
  20. synapse/tests/test_lib_grammar.py +2 -4
  21. synapse/tests/test_lib_json.py +29 -0
  22. synapse/tests/test_lib_layer.py +119 -0
  23. synapse/tests/test_lib_storm.py +184 -1
  24. synapse/tests/test_lib_stormlib_imap.py +1307 -230
  25. synapse/tests/test_lib_stormtypes.py +157 -0
  26. synapse/tests/test_model_inet.py +3 -0
  27. synapse/tests/test_telepath.py +31 -0
  28. synapse/tests/test_tools_genpkg.py +4 -0
  29. synapse/tests/utils.py +1 -1
  30. synapse/tools/genpkg.py +9 -0
  31. synapse/utils/stormcov/plugin.py +2 -5
  32. {synapse-2.218.1.dist-info → synapse-2.220.0.dist-info}/METADATA +2 -3
  33. {synapse-2.218.1.dist-info → synapse-2.220.0.dist-info}/RECORD +37 -34
  34. /synapse/{lib → data/lark}/storm.lark +0 -0
  35. {synapse-2.218.1.dist-info → synapse-2.220.0.dist-info}/WHEEL +0 -0
  36. {synapse-2.218.1.dist-info → synapse-2.220.0.dist-info}/licenses/LICENSE +0 -0
  37. {synapse-2.218.1.dist-info → synapse-2.220.0.dist-info}/top_level.txt +0 -0
@@ -732,13 +732,17 @@ class StormTest(s_t_utils.SynTest):
732
732
  [(ou:org=* :names=(foo, baz))]
733
733
  [(ou:org=* :names=(foo, hehe))]
734
734
  ''')
735
- nodes = await core.nodes('ou:org | intersect { -> ou:name }')
735
+ nodes = await core.nodes('ou:org | intersect { -> ou:name }', opts={'readonly': True})
736
736
  self.len(1, nodes)
737
737
  self.eq(nodes[0].ndef[1], 'foo')
738
738
 
739
739
  msgs = await core.stormlist('ou:org $foo=$node.value() | intersect $foo')
740
740
  self.stormIsInErr('intersect arguments must be runtsafe', msgs)
741
741
 
742
+ with self.raises(s_exc.IsReadOnly) as exc:
743
+ await core.nodes('ou:org | intersect { [ou:org=*] }', opts={'readonly': True})
744
+ self.eq(exc.exception.get('mesg'), 'Storm runtime is in readonly mode, cannot create or edit nodes and other graph data.')
745
+
742
746
  async def test_lib_storm_trycatch(self):
743
747
 
744
748
  async with self.getTestCore() as core:
@@ -3105,6 +3109,185 @@ class StormTest(s_t_utils.SynTest):
3105
3109
 
3106
3110
  await core00.waitfini()
3107
3111
 
3112
+ async def test_storm_pkg_inits(self):
3113
+
3114
+ async def loadPkg(core, pkg):
3115
+ waiter = core.waiter(2, 'core:pkg:onload:start', 'core:pkg:onload:complete')
3116
+
3117
+ await core.addStormPkg(pkg)
3118
+
3119
+ events = await waiter.wait(timeout=10)
3120
+ self.eq(events, [
3121
+ ('core:pkg:onload:start', {'pkg': 'testload'}),
3122
+ ('core:pkg:onload:complete', {'pkg': 'testload'}),
3123
+ ])
3124
+
3125
+ with self.getTestDir() as dirn:
3126
+
3127
+ async with self.getTestCore(dirn=dirn) as core:
3128
+
3129
+ pkg = {
3130
+ 'name': 'testload',
3131
+ 'version': '0.1.0',
3132
+ 'inits': {
3133
+ 'key': 'testload:version',
3134
+ 'versions': [
3135
+ {
3136
+ 'version': 0,
3137
+ 'name': 'init00',
3138
+ 'query': '$lib.globals.set(init00, $lib.time.now())',
3139
+ },
3140
+ {
3141
+ 'version': 1,
3142
+ 'name': 'init01',
3143
+ 'inaugural': True,
3144
+ 'query': '$lib.globals.set(init01, $lib.time.now())',
3145
+ },
3146
+ ]
3147
+ },
3148
+ }
3149
+
3150
+ # bad init queries fail on load
3151
+
3152
+ pkg['inits']['versions'].append({
3153
+ 'version': 2,
3154
+ 'name': 'bad',
3155
+ 'query': '...',
3156
+ })
3157
+
3158
+ await self.asyncraises(s_exc.BadSyntax, core.addStormPkg(pkg))
3159
+
3160
+ pkg['inits']['versions'].pop(2)
3161
+
3162
+ # non-increasing init versions fail on load
3163
+
3164
+ pkg['inits']['versions'].append({
3165
+ 'version': 0,
3166
+ 'name': 'bad',
3167
+ 'query': '$lib.print("")',
3168
+ })
3169
+
3170
+ await self.asyncraises(s_exc.BadPkgDef, core.addStormPkg(pkg))
3171
+
3172
+ pkg['inits']['versions'].pop(2)
3173
+
3174
+ # only inaugural inits run on first load
3175
+
3176
+ await loadPkg(core, pkg)
3177
+
3178
+ self.eq(1, await core.getStormPkgVar('testload', 'testload:version'))
3179
+ self.none(await core.getStormVar('init00'))
3180
+ self.nn(init01 := await core.getStormVar('init01'))
3181
+
3182
+ # non-inaugural inits run on reload
3183
+ # inits always run before onload
3184
+
3185
+ pkg['version'] = '0.2.0'
3186
+ pkg['onload'] = '$lib.time.sleep((0.1)) $lib.globals.set(onload, $lib.time.now())'
3187
+ pkg['inits']['versions'].append({
3188
+ 'version': 2,
3189
+ 'name': 'init02',
3190
+ 'query': '$lib.globals.set(init02, $lib.time.now())',
3191
+ })
3192
+
3193
+ await loadPkg(core, pkg)
3194
+
3195
+ self.eq(2, await core.getStormPkgVar('testload', 'testload:version'))
3196
+ self.none(await core.getStormVar('init00'))
3197
+ self.eq(init01, await core.getStormVar('init01'))
3198
+ self.nn(init02 := await core.getStormVar('init02'))
3199
+ self.nn(onload := await core.getStormVar('onload'))
3200
+ self.gt(onload, init02)
3201
+
3202
+ # inits run even if onload fails
3203
+ # prior inits do not re-run
3204
+
3205
+ pkg['version'] = '0.3.0'
3206
+ pkg['onload'] = '$lib.raise(SynErr, whoopsie)'
3207
+ pkg['inits']['versions'].append({
3208
+ 'version': 3,
3209
+ 'name': 'init03',
3210
+ 'inaugural': True,
3211
+ 'query': '$lib.globals.set(init03, $lib.time.now())',
3212
+ })
3213
+
3214
+ await loadPkg(core, pkg)
3215
+
3216
+ self.eq(3, await core.getStormPkgVar('testload', 'testload:version'))
3217
+ self.eq(init02, await core.getStormVar('init02'))
3218
+ self.nn(await core.getStormVar('init03'))
3219
+
3220
+ # init failure stops progression
3221
+
3222
+ await core.setStormVar('dofail', True)
3223
+
3224
+ pkg['version'] = '0.4.0'
3225
+ pkg['onload'] = '$lib.globals.set(onload, $lib.time.now()) $lib.time.sleep((0.1))'
3226
+ pkg['inits']['versions'].extend([
3227
+ {
3228
+ 'version': 4,
3229
+ 'name': 'init04',
3230
+ 'query': '''
3231
+ if $lib.globals.get(dofail) { $lib.raise(SynErr, newp) }
3232
+ $lib.globals.set(init04, $lib.time.now())
3233
+ ''',
3234
+ },
3235
+ {
3236
+ 'version': 6,
3237
+ 'name': 'init06',
3238
+ 'query': '$lib.globals.set(init06, $lib.time.now())',
3239
+ },
3240
+ ])
3241
+
3242
+ mesg = 'testload init vers=4 output: (\'SynErr\''
3243
+ with self.getAsyncLoggerStream('synapse.cortex', mesg) as stream:
3244
+ await loadPkg(core, pkg)
3245
+ self.eq(3, await core.getStormPkgVar('testload', 'testload:version'))
3246
+ await stream.wait(timeout=10)
3247
+
3248
+ self.none(await core.getStormVar('init04'))
3249
+ self.none(await core.getStormVar('init06'))
3250
+
3251
+ await core.setStormVar('dofail', False)
3252
+
3253
+ with self.getAsyncLoggerStream('synapse.cortex', 'testload finished onload') as stream:
3254
+ async with self.getTestCore(dirn=dirn) as core:
3255
+ await stream.wait(timeout=10)
3256
+
3257
+ # prior versions dont re-run, but a failed one does
3258
+
3259
+ self.eq(6, await core.getStormPkgVar('testload', 'testload:version'))
3260
+ self.gt(await core.getStormVar('onload'), onload)
3261
+ self.eq(init02, await core.getStormVar('init02'))
3262
+ self.nn(await core.getStormVar('init04'))
3263
+ self.nn(await core.getStormVar('init06'))
3264
+
3265
+ # coverage for prints and warns
3266
+
3267
+ pkg['version'] = '0.5.0'
3268
+ pkg['inits']['versions'].append({
3269
+ 'version': 7,
3270
+ 'name': 'init07',
3271
+ 'query': '$lib.print("doing a print")',
3272
+ })
3273
+
3274
+ with self.getAsyncLoggerStream('synapse.cortex', 'doing a print') as stream:
3275
+ await loadPkg(core, pkg)
3276
+ await stream.wait(timeout=10)
3277
+ self.eq(7, await core.getStormPkgVar('testload', 'testload:version'))
3278
+
3279
+ pkg['version'] = '0.6.0'
3280
+ pkg['inits']['versions'].append({
3281
+ 'version': 8,
3282
+ 'name': 'init08',
3283
+ 'query': '$lib.warn("doing a warn")',
3284
+ })
3285
+
3286
+ with self.getAsyncLoggerStream('synapse.cortex', 'doing a warn') as stream:
3287
+ await loadPkg(core, pkg)
3288
+ await stream.wait(timeout=10)
3289
+ self.eq(8, await core.getStormPkgVar('testload', 'testload:version'))
3290
+
3108
3291
  async def test_storm_tree(self):
3109
3292
 
3110
3293
  async with self.getTestCore() as core: