jaclang 0.7.26__py3-none-any.whl → 0.7.27__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 jaclang might be problematic. Click here for more details.

jaclang/plugin/default.py CHANGED
@@ -51,6 +51,20 @@ hookimpl = pluggy.HookimplMarker("jac")
51
51
  logger = getLogger(__name__)
52
52
 
53
53
 
54
+ class JacCallableImplementation:
55
+ """Callable Implementations."""
56
+
57
+ @staticmethod
58
+ def get_object(id: str) -> Architype | None:
59
+ """Get object by id."""
60
+ if id == "root":
61
+ return Jac.get_context().root.architype
62
+ elif obj := Jac.get_context().mem.find_by_id(UUID(id)):
63
+ return obj.architype
64
+
65
+ return None
66
+
67
+
54
68
  class JacAccessValidationImpl:
55
69
  """Jac Access Validation Implementations."""
56
70
 
@@ -599,14 +613,9 @@ class JacFeatureImpl(
599
613
 
600
614
  @staticmethod
601
615
  @hookimpl
602
- def get_object(id: str) -> Architype | None:
603
- """Get object by id."""
604
- if id == "root":
605
- return Jac.get_context().root.architype
606
- elif obj := Jac.get_context().mem.find_by_id(UUID(id)):
607
- return obj.architype
608
-
609
- return None
616
+ def get_object_func() -> Callable[[str], Architype | None]:
617
+ """Get object by id func."""
618
+ return JacCallableImplementation.get_object
610
619
 
611
620
  @staticmethod
612
621
  @hookimpl
jaclang/plugin/feature.py CHANGED
@@ -267,7 +267,12 @@ class JacFeature(
267
267
  @staticmethod
268
268
  def get_object(id: str) -> Architype | None:
269
269
  """Get object given id."""
270
- return plugin_manager.hook.get_object(id=id)
270
+ return plugin_manager.hook.get_object_func()(id=id)
271
+
272
+ @staticmethod
273
+ def get_object_func() -> Callable[[str], Architype | None]:
274
+ """Get object given id."""
275
+ return plugin_manager.hook.get_object_func()
271
276
 
272
277
  @staticmethod
273
278
  def object_ref(obj: Architype) -> str:
jaclang/plugin/spec.py CHANGED
@@ -258,8 +258,8 @@ class JacFeatureSpec(
258
258
 
259
259
  @staticmethod
260
260
  @hookspec(firstresult=True)
261
- def get_object(id: str) -> Architype | None:
262
- """Get object by id."""
261
+ def get_object_func() -> Callable[[str], Architype | None]:
262
+ """Get object by id func."""
263
263
  raise NotImplementedError
264
264
 
265
265
  @staticmethod
@@ -23,6 +23,16 @@ walker update_node {
23
23
  }
24
24
  }
25
25
 
26
+ walker update_target_node {
27
+ has val: int;
28
+ has node_id: str;
29
+
30
+ can enter with `root entry {
31
+ target_node = &(self.node_id);
32
+ target_node.val = self.val;
33
+ }
34
+ }
35
+
26
36
  walker update_node_forced {
27
37
  has val: int;
28
38
 
@@ -0,0 +1,84 @@
1
+ enum Enum {
2
+ A = "a",
3
+ B = "b",
4
+ C = "c"
5
+ }
6
+
7
+ obj Child {
8
+ has val: int, arr: list[int], json: dict[str, int], enum_field: Enum;
9
+ }
10
+
11
+ obj Parent:Child: {
12
+ has child: Child;
13
+ }
14
+
15
+ obj SavableObject {
16
+ has val: int, arr: list[int], json: dict[str, int], parent: Parent, enum_field: Enum;
17
+ }
18
+
19
+ walker create_custom_object {
20
+ can enter1 with `root entry {
21
+ o = SavableObject(
22
+ val=0,
23
+ arr=[],
24
+ json={},
25
+ parent=Parent(
26
+ val=1,
27
+ arr=[1],
28
+ json={"a": 1},
29
+ child=Child(
30
+ val=2,
31
+ arr=[1, 2],
32
+ json={"a": 1, "b": 2},
33
+ enum_field = Enum.C
34
+ ),
35
+ enum_field = Enum.B
36
+ ),
37
+ enum_field = Enum.A
38
+ );
39
+ Jac.save(o);
40
+ print(jid(o));
41
+ print(o);
42
+ }
43
+ }
44
+
45
+ walker get_custom_object {
46
+ has object_id: str;
47
+
48
+ can enter1 with `root entry {
49
+ try {
50
+ print(&(self.object_id));
51
+ } except Exception as e {
52
+ print(None);
53
+ }
54
+ }
55
+ }
56
+
57
+ walker update_custom_object {
58
+ has object_id: str;
59
+
60
+ can enter1 with `root entry {
61
+ savable_object = &(self.object_id);
62
+ savable_object.parent.child.json["c"] = 3;
63
+ savable_object.parent.child.arr.append(3);
64
+ savable_object.parent.child.val = 3;
65
+ savable_object.parent.child.enum_field = Enum.A;
66
+ savable_object.parent.json["b"] = 2;
67
+ savable_object.parent.arr.append(2);
68
+ savable_object.parent.val = 2;
69
+ savable_object.parent.enum_field = Enum.C;
70
+ savable_object.json["a"] = 1;
71
+ savable_object.arr.append(1);
72
+ savable_object.val = 1;
73
+ savable_object.enum_field = Enum.B;
74
+ print(savable_object);
75
+ }
76
+ }
77
+
78
+ walker delete_custom_object {
79
+ has object_id: str;
80
+
81
+ can enter1 with `root entry {
82
+ Jac.destroy(&(self.object_id));
83
+ }
84
+ }
@@ -385,6 +385,22 @@ class TestJaseciPlugin(TestCase):
385
385
  node=self.nodes[0],
386
386
  )
387
387
 
388
+ cli.enter(
389
+ filename=self.fixture_abs_path("other_root_access.jac"),
390
+ entrypoint="update_target_node",
391
+ args=[20, self.nodes[1]],
392
+ session=session,
393
+ root=self.roots[0],
394
+ )
395
+
396
+ cli.enter(
397
+ filename=self.fixture_abs_path("other_root_access.jac"),
398
+ entrypoint="update_target_node",
399
+ args=[10, self.nodes[0]],
400
+ session=session,
401
+ root=self.roots[1],
402
+ )
403
+
388
404
  cli.enter(
389
405
  filename=self.fixture_abs_path("other_root_access.jac"),
390
406
  entrypoint="check_node",
@@ -728,3 +744,75 @@ class TestJaseciPlugin(TestCase):
728
744
  )
729
745
 
730
746
  self._del_session(session)
747
+
748
+ def test_savable_object(self) -> None:
749
+ """Test ObjectAnchor save."""
750
+ global session
751
+ session = self.fixture_abs_path("other_root_access.session")
752
+
753
+ self._output2buffer()
754
+
755
+ cli.enter(
756
+ filename=self.fixture_abs_path("savable_object.jac"),
757
+ entrypoint="create_custom_object",
758
+ args=[],
759
+ session=session,
760
+ )
761
+
762
+ prints = self.capturedOutput.getvalue().strip().split("\n")
763
+ id = prints[0]
764
+
765
+ self.assertEqual(
766
+ "SavableObject(val=0, arr=[], json={}, parent=Parent(val=1, arr=[1], json"
767
+ "={'a': 1}, enum_field=<Enum.B: 'b'>, child=Child(val=2, arr=[1, 2], json"
768
+ "={'a': 1, 'b': 2}, enum_field=<Enum.C: 'c'>)), enum_field=<Enum.A: 'a'>)",
769
+ prints[1],
770
+ )
771
+
772
+ self._output2buffer()
773
+
774
+ cli.enter(
775
+ filename=self.fixture_abs_path("savable_object.jac"),
776
+ entrypoint="get_custom_object",
777
+ args=[id],
778
+ session=session,
779
+ )
780
+ self.assertEqual(
781
+ "SavableObject(val=0, arr=[], json={}, parent=Parent(val=1, arr=[1], json"
782
+ "={'a': 1}, enum_field=<Enum.B: 'b'>, child=Child(val=2, arr=[1, 2], json"
783
+ "={'a': 1, 'b': 2}, enum_field=<Enum.C: 'c'>)), enum_field=<Enum.A: 'a'>)",
784
+ self.capturedOutput.getvalue().strip(),
785
+ )
786
+
787
+ self._output2buffer()
788
+
789
+ cli.enter(
790
+ filename=self.fixture_abs_path("savable_object.jac"),
791
+ entrypoint="update_custom_object",
792
+ args=[id],
793
+ session=session,
794
+ )
795
+
796
+ self.assertEqual(
797
+ "SavableObject(val=1, arr=[1], json={'a': 1}, parent=Parent(val=2, arr=[1, 2], json"
798
+ "={'a': 1, 'b': 2}, enum_field=<Enum.C: 'c'>, child=Child(val=3, arr=[1, 2, 3], json"
799
+ "={'a': 1, 'b': 2, 'c': 3}, enum_field=<Enum.A: 'a'>)), enum_field=<Enum.B: 'b'>)",
800
+ self.capturedOutput.getvalue().strip(),
801
+ )
802
+
803
+ self._output2buffer()
804
+
805
+ cli.enter(
806
+ filename=self.fixture_abs_path("savable_object.jac"),
807
+ entrypoint="delete_custom_object",
808
+ args=[id],
809
+ session=session,
810
+ )
811
+
812
+ cli.enter(
813
+ filename=self.fixture_abs_path("savable_object.jac"),
814
+ entrypoint="get_custom_object",
815
+ args=[id],
816
+ session=session,
817
+ )
818
+ self.assertEqual("None", self.capturedOutput.getvalue().strip())
@@ -226,6 +226,13 @@ class WalkerAnchor(Anchor):
226
226
  disengaged: bool = False
227
227
 
228
228
 
229
+ @dataclass(eq=False, repr=False, kw_only=True)
230
+ class ObjectAnchor(Anchor):
231
+ """Edge Anchor."""
232
+
233
+ architype: ObjectArchitype
234
+
235
+
229
236
  class Architype:
230
237
  """Architype Protocol."""
231
238
 
@@ -267,6 +274,16 @@ class WalkerArchitype(Architype):
267
274
  self.__jac__ = WalkerAnchor(architype=self)
268
275
 
269
276
 
277
+ class ObjectArchitype(Architype):
278
+ """Walker Architype Protocol."""
279
+
280
+ __jac__: ObjectAnchor
281
+
282
+ def __init__(self) -> None:
283
+ """Create walker architype."""
284
+ self.__jac__ = ObjectAnchor(architype=self)
285
+
286
+
270
287
  @dataclass(eq=False)
271
288
  class GenericEdge(EdgeArchitype):
272
289
  """Generic Root Node."""
@@ -84,14 +84,32 @@ class ShelfStorage(Memory[UUID, Anchor]):
84
84
  def close(self) -> None:
85
85
  """Close memory handler."""
86
86
  if isinstance(self.__shelf__, Shelf):
87
- from jaclang.plugin.feature import JacFeature as Jac
88
-
89
87
  for anchor in self.__gc__:
90
88
  self.__shelf__.pop(str(anchor.id), None)
91
89
  self.__mem__.pop(anchor.id, None)
92
90
 
93
- for d in self.__mem__.values():
94
- if d.persistent and d.hash != hash(dumps(d)):
91
+ keys = set(self.__mem__.keys())
92
+
93
+ # current memory
94
+ self.sync_mem_to_db(keys)
95
+
96
+ # additional after memory sync
97
+ self.sync_mem_to_db(set(self.__mem__.keys() - keys))
98
+
99
+ self.__shelf__.close()
100
+ super().close()
101
+
102
+ def sync_mem_to_db(self, keys: Iterable[UUID]) -> None:
103
+ """Manually sync memory to db."""
104
+ from jaclang.plugin.feature import JacFeature as Jac
105
+
106
+ if isinstance(self.__shelf__, Shelf):
107
+ for key in keys:
108
+ if (
109
+ (d := self.__mem__.get(key))
110
+ and d.persistent
111
+ and d.hash != hash(dumps(d))
112
+ ):
95
113
  _id = str(d.id)
96
114
  if p_d := self.__shelf__.get(_id):
97
115
  if (
@@ -119,9 +137,6 @@ class ShelfStorage(Memory[UUID, Anchor]):
119
137
  ):
120
138
  self.__shelf__[_id] = d
121
139
 
122
- self.__shelf__.close()
123
- super().close()
124
-
125
140
  def find(
126
141
  self,
127
142
  ids: UUID | Iterable[UUID],
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  import ast as ast3
6
6
  import sys
7
7
  from contextlib import contextmanager
8
+ from types import UnionType
8
9
  from typing import Callable, Iterator, TYPE_CHECKING
9
10
 
10
11
  import jaclang.compiler.absyntree as ast
@@ -215,3 +216,18 @@ def extract_params(
215
216
  )
216
217
  exclude_info.append((var_name, i.gen.py_ast[0]))
217
218
  return model_params, include_info, exclude_info
219
+
220
+
221
+ def is_instance(
222
+ obj: object, target: type | UnionType | tuple[type | UnionType, ...]
223
+ ) -> bool:
224
+ """Check if object is instance of target type."""
225
+ match target:
226
+ case UnionType():
227
+ return any((is_instance(obj, trg) for trg in target.__args__))
228
+ case tuple():
229
+ return any((is_instance(obj, trg) for trg in target))
230
+ case type():
231
+ return isinstance(obj, target)
232
+ case _:
233
+ return False
@@ -117,10 +117,9 @@ class JacLanguageTests(TestCase):
117
117
  sys.stdout = sys.__stdout__
118
118
  stdout_value = captured_output.getvalue()
119
119
 
120
- # print(arr[1:3, 1::2]);
121
120
  expected_outputs = [
122
- "+-- AtomTrailer - Type: Any",
123
- " +-- Name - arr - Type: Any, SymbolTable: None",
121
+ "+-- AtomTrailer - Type: numpy.ndarray[Any, numpy.dtype[Any]]",
122
+ " +-- Name - arr - Type: numpy.ndarray[Any, numpy.dtype[Any]], SymbolTable: None",
124
123
  " +-- IndexSlice - [IndexSlice] - Type: builtins.slice, SymbolTable: None",
125
124
  " +-- Token - [,",
126
125
  " +-- Int - 1 - Type: Literal[1]?, SymbolTable: None",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaclang
3
- Version: 0.7.26
3
+ Version: 0.7.27
4
4
  Summary: Jac is a unique and powerful programming language that runs on top of Python, offering an unprecedented level of intelligence and intuitive understanding.
5
5
  Home-page: https://jaseci.org
6
6
  License: MIT
@@ -166,29 +166,30 @@ jaclang/langserve/tests/test_server.py,sha256=cZcQTMCMhJw4FS1BDz2oAmQb0J1mXdb5Bc
166
166
  jaclang/langserve/utils.py,sha256=edZCrq8ZFolao-rvv5RGPxtnEh6NmhrxOgPh8VxmEPs,15019
167
167
  jaclang/plugin/__init__.py,sha256=5t2krHKt_44PrCTGojzxEimxpNHYVQcn89jAiCSXE_k,165
168
168
  jaclang/plugin/builtin.py,sha256=zNTbe5knJrGFgJRa4l4hMzzuij6iXFyVqRTxputUHIo,1307
169
- jaclang/plugin/default.py,sha256=njt3AEJdH1OI-K6PTjCqVxmjx5yY2aX_ytJ195H1W8s,46741
170
- jaclang/plugin/feature.py,sha256=fFEWW45gme3BfIAww1RXBm8HiYeXDmUm8A7qHKzjhXE,16926
169
+ jaclang/plugin/default.py,sha256=65k0F5NsCH4qID6sCje0quU6atgUPF8f1pIK5z02q5E,46984
170
+ jaclang/plugin/feature.py,sha256=CJ87SfNPsxS7xuLvW0KpOboa6IrjDdPkOsVS3pjBsfk,17104
171
171
  jaclang/plugin/plugin.md,sha256=B252QTH3c8uZyvXTbGmZBafZtdXstFC5vT5jIN_gS4U,9994
172
- jaclang/plugin/spec.py,sha256=xWcLHRwRW42O8qS031R1Dwnw_g_yq1LxxfUtioQPND4,14694
172
+ jaclang/plugin/spec.py,sha256=N1T4lhiyt_2UYmqLvhP6xjBUvgRA3wQF-YWjxjxPAIs,14714
173
173
  jaclang/plugin/tests/__init__.py,sha256=rn_tNG8jCHWwBc_rx4yFkGc4N1GISb7aPuTFVRTvrTk,38
174
174
  jaclang/plugin/tests/fixtures/graph_purger.jac,sha256=c6kJD-KYYj2NErC21CjC2sjEMMBF6Qh9SdY9nSKWos8,1506
175
175
  jaclang/plugin/tests/fixtures/impl_match.jac,sha256=WEhcA1GlovusITEFO2bOjYYqiiULyYGKhM17uK2GqnI,91
176
176
  jaclang/plugin/tests/fixtures/impl_match_impl.jac,sha256=k1385r7Hdlq6mUKxEHa3VOKJUIWH08hYg2kErhbYwFM,31
177
- jaclang/plugin/tests/fixtures/other_root_access.jac,sha256=BYM6zGhF4ZY2ShPaGUVnZV8e2agF94msg1Wmg0iUEUY,1805
177
+ jaclang/plugin/tests/fixtures/other_root_access.jac,sha256=e8pL9t3monI9FhmgavbcFsh8gjUB3pZkhAZHvbYcRuU,1991
178
+ jaclang/plugin/tests/fixtures/savable_object.jac,sha256=5eqRnnL3tqAMrIWQGoHW4vsD5acX9jZLtXtg_GBb84A,1973
178
179
  jaclang/plugin/tests/fixtures/simple_node_connection.jac,sha256=KdbpACWtnj92TqQqEunwoI4VKhlnhcJCKMkbgh0Xqxg,1067
179
180
  jaclang/plugin/tests/fixtures/simple_persistent.jac,sha256=o0TZTOJEZjFW8A2IGY8ICBZEBZzHhqha0xQFFBK_DSI,624
180
181
  jaclang/plugin/tests/test_features.py,sha256=sK9d2UazofGl9qYZO_ODKmOHZY8E4fnXNoyw-_KQI9A,2344
181
- jaclang/plugin/tests/test_jaseci.py,sha256=AkZMggVUf-NzvHjICYVdHC56Y6r5qGKZoyBXXbmAo30,24430
182
+ jaclang/plugin/tests/test_jaseci.py,sha256=g2HQWPaG4E2FQOWcKmZ2SM2MDDOEy2s1u14Idb7GTbw,27398
182
183
  jaclang/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
184
  jaclang/runtimelib/__init__.py,sha256=jDDYBCV82qPhmcDVk3NIvHbhng0ebSrXD3xrojg0-eo,34
184
- jaclang/runtimelib/architype.py,sha256=FuPGzc-pPPm-W3E9NnEnHF6tRS1Z-8VUs_wRVUm6Phc,8294
185
+ jaclang/runtimelib/architype.py,sha256=Egw3hmLDAt_jxQBagT_WoLv5Evl7hUbGkPx0-skboLw,8650
185
186
  jaclang/runtimelib/constructs.py,sha256=1ARnsPrDi1UvyaFRhGRhO0kj0fnIZ2HbHF7O3itB-ZQ,796
186
187
  jaclang/runtimelib/context.py,sha256=DjCkj1S6WLBWbNMkhUjqPYIhxqXV0XjJ1Mpjy7WR4g0,5538
187
188
  jaclang/runtimelib/importer.py,sha256=a6ORKrDfK-jKXopgyZHz188O-VI2NflFQo7VTUVvqOw,14592
188
189
  jaclang/runtimelib/machine.py,sha256=8gyGLxURqfy0bLXMWyOwjIX-rH8Mz11b-jV6Ta5liTk,11566
189
- jaclang/runtimelib/memory.py,sha256=8a4-E1vO3PmRGGljGeEnl2PK4lMe2eip2bIvalNs2rw,5192
190
+ jaclang/runtimelib/memory.py,sha256=LrVTo6Cac0q-YG1wug-Fgc8O2Tue9zRHnxSulDw3ZQ4,5656
190
191
  jaclang/runtimelib/test.py,sha256=HRCl3cf0uPTe58Kcx_sBUb6ow8J53rnmpFOhA7g9oAA,2851
191
- jaclang/runtimelib/utils.py,sha256=P9gVE3XFhRzr745RCDXXIP391AcsL4aL_6HrXws_qa4,8155
192
+ jaclang/runtimelib/utils.py,sha256=xcxO45lEwEBRrWeeAaRjqGZ4Ua-XMCeNv0lS6dHwGIk,8652
192
193
  jaclang/settings.py,sha256=iLgVEA2fyARM5u-qMMMaEvNr88Qxej2NGZviw-R95kU,3681
193
194
  jaclang/tests/fixtures/abc.jac,sha256=HZvLz6IEt3Snlgg8Czs-N4emLjg4fT3IbTo95d3Gdww,1747
194
195
  jaclang/tests/fixtures/access_checker.jac,sha256=UVoY7sYW-R0ms2HDA4HXQ5xJNiW0vEbY2T5CCY1avus,281
@@ -306,7 +307,7 @@ jaclang/tests/foo/__init__.jac,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
306
307
  jaclang/tests/main.jac,sha256=UJ4dASLCMA3wW78Rq3AHcq5GfXVY5QBm2S16OCrR1hQ,13
307
308
  jaclang/tests/test_bugs.py,sha256=tBPsIlSPqZDIz4QaScNRT-WdGIdJ0uU-aRBWq1XUZ6o,555
308
309
  jaclang/tests/test_cli.py,sha256=NeaAND5r5040L_WeENQmRZSahuUZBthZV0D2gWkTNLk,16525
309
- jaclang/tests/test_language.py,sha256=mVs8oX47wHPLZ1MnBcj1KBG1CMOd-CZvyrGsfGToPjg,50363
310
+ jaclang/tests/test_language.py,sha256=arJ-Ay8Ebnqv498B4tegjk_j9gv_dCQzUOqKxqbKuPM,50396
310
311
  jaclang/tests/test_man_code.py,sha256=ZdNarlZVfT_-8Jv3FjLplHw76tsvkCuISyfX3M4qxPg,5027
311
312
  jaclang/tests/test_reference.py,sha256=FISQpZbB8cmRoAeJOFfXUy13WVxykZjpkPSb1OTotfI,3340
312
313
  jaclang/tests/test_settings.py,sha256=TIX5uiu8H9IpZN2__uFiclcdCpBpPpcAwtlEHyFC4kk,1999
@@ -1540,7 +1541,7 @@ jaclang/vendor/typing_extensions-4.12.2.dist-info/METADATA,sha256=BeUQIa8cnYbrjW
1540
1541
  jaclang/vendor/typing_extensions-4.12.2.dist-info/RECORD,sha256=XS4fBVrPI7kaNZ56Ggl2RGa76jySWLqTzcrUpZIQTVM,418
1541
1542
  jaclang/vendor/typing_extensions-4.12.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
1542
1543
  jaclang/vendor/typing_extensions.py,sha256=gwekpyG9DVG3lxWKX4ni8u7nk3We5slG98mA9F3DJQw,134451
1543
- jaclang-0.7.26.dist-info/METADATA,sha256=cIVrq9o3xtzylZyehZiL4MG_csNdC5arqEpaAaCeEWA,4965
1544
- jaclang-0.7.26.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
1545
- jaclang-0.7.26.dist-info/entry_points.txt,sha256=8sMi4Tvi9f8tQDN2QAXsSA2icO27zQ4GgEdph6bNEZM,49
1546
- jaclang-0.7.26.dist-info/RECORD,,
1544
+ jaclang-0.7.27.dist-info/METADATA,sha256=cV-TTH-3xthCP6EsxBV_KuxpqbGGAsM145QLg6wqlKs,4965
1545
+ jaclang-0.7.27.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
1546
+ jaclang-0.7.27.dist-info/entry_points.txt,sha256=8sMi4Tvi9f8tQDN2QAXsSA2icO27zQ4GgEdph6bNEZM,49
1547
+ jaclang-0.7.27.dist-info/RECORD,,