jaclang 0.7.17__py3-none-any.whl → 0.7.18__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/cli/cli.py +3 -5
- jaclang/compiler/passes/main/pyast_gen_pass.py +25 -0
- jaclang/compiler/passes/tool/jac_formatter_pass.py +2 -0
- jaclang/langserve/engine.py +25 -16
- jaclang/langserve/tests/fixtures/import_include_statements.jac +3 -3
- jaclang/langserve/tests/test_server.py +8 -4
- jaclang/langserve/utils.py +11 -100
- jaclang/plugin/builtin.py +8 -4
- jaclang/plugin/default.py +17 -3
- jaclang/plugin/feature.py +10 -0
- jaclang/plugin/spec.py +12 -0
- jaclang/runtimelib/importer.py +1 -0
- jaclang/runtimelib/memory.py +6 -6
- jaclang/tests/fixtures/builtin_dotgen.jac +1 -0
- jaclang/tests/fixtures/objref.jac +12 -0
- jaclang/tests/test_language.py +13 -2
- {jaclang-0.7.17.dist-info → jaclang-0.7.18.dist-info}/METADATA +3 -1
- {jaclang-0.7.17.dist-info → jaclang-0.7.18.dist-info}/RECORD +20 -19
- {jaclang-0.7.17.dist-info → jaclang-0.7.18.dist-info}/WHEEL +0 -0
- {jaclang-0.7.17.dist-info → jaclang-0.7.18.dist-info}/entry_points.txt +0 -0
jaclang/cli/cli.py
CHANGED
|
@@ -8,7 +8,6 @@ import pickle
|
|
|
8
8
|
import shutil
|
|
9
9
|
import types
|
|
10
10
|
from typing import Optional
|
|
11
|
-
from uuid import UUID
|
|
12
11
|
|
|
13
12
|
import jaclang.compiler.absyntree as ast
|
|
14
13
|
from jaclang import jac_import
|
|
@@ -159,10 +158,9 @@ def get_object(
|
|
|
159
158
|
raise ValueError("Not a valid file!\nOnly supports `.jac` and `.jir`")
|
|
160
159
|
|
|
161
160
|
data = {}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
data = obj.__getstate__()
|
|
161
|
+
obj = Jac.get_object(id)
|
|
162
|
+
if obj:
|
|
163
|
+
data = obj.__jac__.__getstate__()
|
|
166
164
|
else:
|
|
167
165
|
print(f"Object with id {id} not found.")
|
|
168
166
|
|
|
@@ -2641,6 +2641,31 @@ class PyastGenPass(Pass):
|
|
|
2641
2641
|
]
|
|
2642
2642
|
elif node.op.name in [Tok.STAR_POW]:
|
|
2643
2643
|
node.gen.py_ast = node.operand.gen.py_ast
|
|
2644
|
+
elif node.op.name in [Tok.BW_AND]:
|
|
2645
|
+
node.gen.py_ast = [
|
|
2646
|
+
self.sync(
|
|
2647
|
+
ast3.Call(
|
|
2648
|
+
func=self.sync(
|
|
2649
|
+
ast3.Attribute(
|
|
2650
|
+
value=self.sync(
|
|
2651
|
+
ast3.Name(id=Con.JAC_FEATURE.value, ctx=ast3.Load())
|
|
2652
|
+
),
|
|
2653
|
+
attr="get_object",
|
|
2654
|
+
ctx=ast3.Load(),
|
|
2655
|
+
)
|
|
2656
|
+
),
|
|
2657
|
+
args=[],
|
|
2658
|
+
keywords=[
|
|
2659
|
+
self.sync(
|
|
2660
|
+
ast3.keyword(
|
|
2661
|
+
arg="id",
|
|
2662
|
+
value=node.operand.gen.py_ast[0],
|
|
2663
|
+
)
|
|
2664
|
+
),
|
|
2665
|
+
],
|
|
2666
|
+
)
|
|
2667
|
+
)
|
|
2668
|
+
]
|
|
2644
2669
|
else:
|
|
2645
2670
|
self.ice(f"Unknown Unary operator {node.op.value}")
|
|
2646
2671
|
|
|
@@ -1562,6 +1562,8 @@ class JacFormatPass(Pass):
|
|
|
1562
1562
|
self.emit(node, f"not {node.operand.gen.jac}")
|
|
1563
1563
|
elif node.op.name in [Tok.PIPE_FWD, Tok.KW_SPAWN, Tok.A_PIPE_FWD]:
|
|
1564
1564
|
self.emit(node, f"{node.op.value} {node.operand.gen.jac}")
|
|
1565
|
+
elif node.op.name in [Tok.BW_AND]:
|
|
1566
|
+
self.emit(node, f"{node.op.value}{node.operand.gen.jac}")
|
|
1565
1567
|
else:
|
|
1566
1568
|
self.error(f"Unary operator {node.op.value} not supported in bootstrap Jac")
|
|
1567
1569
|
|
jaclang/langserve/engine.py
CHANGED
|
@@ -22,8 +22,7 @@ from jaclang.langserve.utils import (
|
|
|
22
22
|
find_deepest_symbol_node_at_pos,
|
|
23
23
|
find_index,
|
|
24
24
|
gen_diagnostics,
|
|
25
|
-
|
|
26
|
-
get_mod_path,
|
|
25
|
+
get_location_range,
|
|
27
26
|
get_symbols_for_outline,
|
|
28
27
|
parse_symbol_path,
|
|
29
28
|
resolve_completion_symbol_table,
|
|
@@ -335,8 +334,9 @@ class JacLangServer(LanguageServer):
|
|
|
335
334
|
and node_selected.parent
|
|
336
335
|
and isinstance(node_selected.parent, ast.ModulePath)
|
|
337
336
|
):
|
|
338
|
-
spec =
|
|
337
|
+
spec = node_selected.parent.abs_path
|
|
339
338
|
if spec:
|
|
339
|
+
spec = spec[5:] if spec.startswith("File:") else spec
|
|
340
340
|
return lspt.Location(
|
|
341
341
|
uri=uris.from_fs_path(spec),
|
|
342
342
|
range=lspt.Range(
|
|
@@ -349,19 +349,28 @@ class JacLangServer(LanguageServer):
|
|
|
349
349
|
elif node_selected.parent and isinstance(
|
|
350
350
|
node_selected.parent, ast.ModuleItem
|
|
351
351
|
):
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
352
|
+
path = node_selected.parent.from_mod_path.abs_path
|
|
353
|
+
try: # TODO: Get rid of this when 'from' import is fixed
|
|
354
|
+
loc_range = tuple(
|
|
355
|
+
loc - 1 if loc > 0 else loc
|
|
356
|
+
for loc in get_location_range(node_selected.parent)
|
|
357
|
+
)
|
|
358
|
+
except ValueError:
|
|
359
|
+
loc_range = (0, 0, 0, 0)
|
|
360
|
+
|
|
361
|
+
if path and loc_range:
|
|
362
|
+
path = path[5:] if path.startswith("File:") else path
|
|
363
|
+
return lspt.Location(
|
|
364
|
+
uri=uris.from_fs_path(path),
|
|
365
|
+
range=lspt.Range(
|
|
366
|
+
start=lspt.Position(
|
|
367
|
+
line=loc_range[0], character=loc_range[1]
|
|
361
368
|
),
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
369
|
+
end=lspt.Position(
|
|
370
|
+
line=loc_range[2], character=loc_range[3]
|
|
371
|
+
),
|
|
372
|
+
),
|
|
373
|
+
)
|
|
365
374
|
elif isinstance(node_selected, (ast.ElementStmt, ast.BuiltinType)):
|
|
366
375
|
return None
|
|
367
376
|
decl_node = (
|
|
@@ -378,7 +387,7 @@ class JacLangServer(LanguageServer):
|
|
|
378
387
|
decl_uri = uris.from_fs_path(decl_node.loc.mod_path)
|
|
379
388
|
try:
|
|
380
389
|
decl_range = create_range(decl_node.loc)
|
|
381
|
-
except ValueError:
|
|
390
|
+
except ValueError:
|
|
382
391
|
return None
|
|
383
392
|
decl_location = lspt.Location(
|
|
384
393
|
uri=decl_uri,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import:py os;
|
|
2
|
-
import:py from math
|
|
2
|
+
import:py from math{ sqrt as square_root}
|
|
3
3
|
import:py datetime as dt;
|
|
4
|
-
import:jac from base_module_structure
|
|
4
|
+
import:jac from base_module_structure{ add as add_numbers , subtract,x,Colorenum as clr}
|
|
5
5
|
import:jac base_module_structure as base_module_structure;
|
|
6
|
-
import:py from py_import
|
|
6
|
+
import:py from py_import{add1 as ss, sub1 as subtract1,apple,Orange1}
|
|
@@ -187,11 +187,15 @@ class TestJacLangServer(TestCase):
|
|
|
187
187
|
)
|
|
188
188
|
lsp.deep_check(import_file)
|
|
189
189
|
positions = [
|
|
190
|
-
(
|
|
190
|
+
(0, 12, "tdlib/os/__init__.pyi:0:0-0:0"),
|
|
191
|
+
(1, 18, "stdlib/math.pyi:0:0-0:0"),
|
|
192
|
+
(2, 24, "datetime.pyi:0:0-0:0"),
|
|
191
193
|
(3, 17, "base_module_structure.jac:0:0-0:0"),
|
|
192
|
-
(3, 87, "base_module_structure.jac:23:
|
|
193
|
-
(5, 65, "py_import.py:
|
|
194
|
-
(5, 35, "py_import.py:
|
|
194
|
+
(3, 87, "base_module_structure.jac:23:5-23:14"),
|
|
195
|
+
(5, 65, "py_import.py:0:0-0:0"),
|
|
196
|
+
(5, 35, "py_import.py:0:0-0:0"),
|
|
197
|
+
# (5, 65, "py_import.py:12:0-20:5"), # TODO : Should work after 'from' import files are raised
|
|
198
|
+
# (5, 35, "py_import.py:3:0-4:5"),
|
|
195
199
|
]
|
|
196
200
|
|
|
197
201
|
for line, char, expected in positions:
|
jaclang/langserve/utils.py
CHANGED
|
@@ -2,10 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import builtins
|
|
5
|
-
import importlib.util
|
|
6
|
-
import os
|
|
7
5
|
import re
|
|
8
|
-
import sys
|
|
9
6
|
from functools import wraps
|
|
10
7
|
from typing import Any, Awaitable, Callable, Coroutine, Optional, ParamSpec, TypeVar
|
|
11
8
|
|
|
@@ -209,6 +206,17 @@ def create_range(loc: CodeLocInfo) -> lspt.Range:
|
|
|
209
206
|
)
|
|
210
207
|
|
|
211
208
|
|
|
209
|
+
def get_location_range(mod_item: ast.ModuleItem) -> tuple[int, int, int, int]:
|
|
210
|
+
"""Get location range."""
|
|
211
|
+
if not mod_item.from_mod_path.sub_module:
|
|
212
|
+
raise ValueError("Module items should have module path. Not Possible.")
|
|
213
|
+
lookup = mod_item.from_mod_path.sub_module.sym_tab.lookup(mod_item.name.value)
|
|
214
|
+
if not lookup:
|
|
215
|
+
raise ValueError("Module items should have a symbol table entry. Not Possible.")
|
|
216
|
+
loc = lookup.decl.loc
|
|
217
|
+
return loc.first_line, loc.col_start, loc.last_line, loc.col_end
|
|
218
|
+
|
|
219
|
+
|
|
212
220
|
def kind_map(sub_tab: ast.AstNode) -> lspt.SymbolKind:
|
|
213
221
|
"""Map the symbol node to an lspt.SymbolKind."""
|
|
214
222
|
return (
|
|
@@ -273,103 +281,6 @@ def label_map(sub_tab: SymbolType) -> lspt.CompletionItemKind:
|
|
|
273
281
|
)
|
|
274
282
|
|
|
275
283
|
|
|
276
|
-
def get_mod_path(
|
|
277
|
-
mod_path: ast.ModulePath, name_node: ast.Name
|
|
278
|
-
) -> str | None: # TODO: This should go away
|
|
279
|
-
"""Get path for a module import name."""
|
|
280
|
-
ret_target = None
|
|
281
|
-
if mod_path.parent and (
|
|
282
|
-
(
|
|
283
|
-
isinstance(mod_path.parent.parent, ast.Import)
|
|
284
|
-
and mod_path.parent.parent.is_py
|
|
285
|
-
)
|
|
286
|
-
or (
|
|
287
|
-
isinstance(mod_path.parent, ast.Import)
|
|
288
|
-
and mod_path.parent.from_loc
|
|
289
|
-
and mod_path.parent.is_py
|
|
290
|
-
)
|
|
291
|
-
):
|
|
292
|
-
if mod_path.path and name_node in mod_path.path:
|
|
293
|
-
temporary_path_str = ("." * mod_path.level) + ".".join(
|
|
294
|
-
[p.value for p in mod_path.path[: mod_path.path.index(name_node) + 1]]
|
|
295
|
-
if mod_path.path
|
|
296
|
-
else ""
|
|
297
|
-
)
|
|
298
|
-
else:
|
|
299
|
-
temporary_path_str = mod_path.dot_path_str
|
|
300
|
-
sys.path.append(os.path.dirname(mod_path.loc.mod_path))
|
|
301
|
-
spec = importlib.util.find_spec(temporary_path_str)
|
|
302
|
-
sys.path.remove(os.path.dirname(mod_path.loc.mod_path))
|
|
303
|
-
if spec and spec.origin and spec.origin.endswith(".py"):
|
|
304
|
-
ret_target = spec.origin
|
|
305
|
-
elif mod_path.parent and (
|
|
306
|
-
(
|
|
307
|
-
isinstance(mod_path.parent.parent, ast.Import)
|
|
308
|
-
and mod_path.parent.parent.is_jac
|
|
309
|
-
)
|
|
310
|
-
or (
|
|
311
|
-
isinstance(mod_path.parent, ast.Import)
|
|
312
|
-
and mod_path.parent.from_loc
|
|
313
|
-
and mod_path.parent.is_jac
|
|
314
|
-
)
|
|
315
|
-
):
|
|
316
|
-
ret_target = mod_path.resolve_relative_path()
|
|
317
|
-
return ret_target
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
def get_item_path(mod_item: ast.ModuleItem) -> tuple[str, tuple[int, int]] | None:
|
|
321
|
-
"""Get path."""
|
|
322
|
-
item_name = mod_item.name.value
|
|
323
|
-
if mod_item.from_parent.is_py and mod_item.from_parent.from_loc:
|
|
324
|
-
path = get_mod_path(mod_item.from_parent.from_loc, mod_item.name)
|
|
325
|
-
if path:
|
|
326
|
-
return get_definition_range(path, item_name)
|
|
327
|
-
elif mod_item.from_parent.is_jac:
|
|
328
|
-
mod_node = mod_item.from_mod_path
|
|
329
|
-
if mod_node.sub_module and mod_node.sub_module._sym_tab:
|
|
330
|
-
for symbol_name, symbol in mod_node.sub_module._sym_tab.tab.items():
|
|
331
|
-
if symbol_name == item_name:
|
|
332
|
-
return symbol.decl.loc.mod_path, (
|
|
333
|
-
symbol.decl.loc.first_line - 1,
|
|
334
|
-
symbol.decl.loc.last_line - 1,
|
|
335
|
-
)
|
|
336
|
-
return None
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
def get_definition_range(
|
|
340
|
-
filename: str, name: str
|
|
341
|
-
) -> tuple[str, tuple[int, int]] | None:
|
|
342
|
-
"""Get the start and end line of a function or class definition in a file."""
|
|
343
|
-
import ast
|
|
344
|
-
|
|
345
|
-
with open(filename, "r") as file:
|
|
346
|
-
source = file.read()
|
|
347
|
-
|
|
348
|
-
tree = ast.parse(source)
|
|
349
|
-
|
|
350
|
-
for node in ast.walk(tree):
|
|
351
|
-
if isinstance(node, (ast.FunctionDef, ast.ClassDef)) and node.name == name:
|
|
352
|
-
start_line = node.lineno
|
|
353
|
-
end_line = (
|
|
354
|
-
node.body[-1].end_lineno
|
|
355
|
-
if hasattr(node.body[-1], "end_lineno")
|
|
356
|
-
else node.body[-1].lineno
|
|
357
|
-
)
|
|
358
|
-
if start_line and end_line:
|
|
359
|
-
return filename, (start_line - 1, end_line - 1)
|
|
360
|
-
elif isinstance(node, ast.Assign):
|
|
361
|
-
for target in node.targets:
|
|
362
|
-
if isinstance(target, ast.Name) and target.id == name:
|
|
363
|
-
start_line = node.lineno
|
|
364
|
-
end_line = (
|
|
365
|
-
node.end_lineno if hasattr(node, "end_lineno") else node.lineno
|
|
366
|
-
)
|
|
367
|
-
if start_line and end_line:
|
|
368
|
-
return filename, (start_line - 1, end_line - 1)
|
|
369
|
-
|
|
370
|
-
return None
|
|
371
|
-
|
|
372
|
-
|
|
373
284
|
def collect_all_symbols_in_scope(
|
|
374
285
|
sym_tab: SymbolTable, up_tree: bool = True
|
|
375
286
|
) -> list[lspt.CompletionItem]:
|
jaclang/plugin/builtin.py
CHANGED
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Optional
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
from jaclang.runtimelib.constructs import NodeArchitype
|
|
7
|
+
from jaclang.plugin.feature import JacFeature as Jac
|
|
8
|
+
from jaclang.runtimelib.constructs import Architype, NodeArchitype
|
|
10
9
|
|
|
11
10
|
|
|
12
11
|
def dotgen(
|
|
@@ -40,3 +39,8 @@ def dotgen(
|
|
|
40
39
|
node_limit=node_limit,
|
|
41
40
|
dot_file=dot_file,
|
|
42
41
|
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def jid(obj: Architype) -> str:
|
|
45
|
+
"""Get the id of the object."""
|
|
46
|
+
return Jac.object_ref(obj)
|
jaclang/plugin/default.py
CHANGED
|
@@ -12,13 +12,13 @@ from collections import OrderedDict
|
|
|
12
12
|
from dataclasses import field
|
|
13
13
|
from functools import wraps
|
|
14
14
|
from typing import Any, Callable, Mapping, Optional, Sequence, Type, Union
|
|
15
|
+
from uuid import UUID
|
|
15
16
|
|
|
16
17
|
import jaclang.compiler.absyntree as ast
|
|
17
18
|
from jaclang.compiler.constant import EdgeDir, colors
|
|
18
19
|
from jaclang.compiler.passes.main.pyast_gen_pass import PyastGenPass
|
|
19
20
|
from jaclang.compiler.semtable import SemInfo, SemRegistry, SemScope
|
|
20
21
|
from jaclang.runtimelib.constructs import (
|
|
21
|
-
Anchor,
|
|
22
22
|
Architype,
|
|
23
23
|
DSFunc,
|
|
24
24
|
EdgeAnchor,
|
|
@@ -44,7 +44,6 @@ import pluggy
|
|
|
44
44
|
hookimpl = pluggy.HookimplMarker("jac")
|
|
45
45
|
|
|
46
46
|
__all__ = [
|
|
47
|
-
"Anchor",
|
|
48
47
|
"EdgeAnchor",
|
|
49
48
|
"GenericEdge",
|
|
50
49
|
"hookimpl",
|
|
@@ -72,6 +71,21 @@ class JacFeatureDefaults:
|
|
|
72
71
|
"""Get current execution context."""
|
|
73
72
|
return ExecutionContext.get()
|
|
74
73
|
|
|
74
|
+
@staticmethod
|
|
75
|
+
@hookimpl
|
|
76
|
+
def get_object(id: str) -> Architype | None:
|
|
77
|
+
if id == "root":
|
|
78
|
+
return Jac.get_context().root.architype
|
|
79
|
+
elif obj := Jac.get_context().mem.find_by_id(UUID(id)):
|
|
80
|
+
return obj.architype
|
|
81
|
+
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
@staticmethod
|
|
85
|
+
@hookimpl
|
|
86
|
+
def object_ref(obj: Architype) -> str:
|
|
87
|
+
return obj.__jac__.id.hex
|
|
88
|
+
|
|
75
89
|
@staticmethod
|
|
76
90
|
@hookimpl
|
|
77
91
|
def make_architype(
|
|
@@ -903,7 +917,7 @@ class JacBuiltin:
|
|
|
903
917
|
for source, target, edge in connections:
|
|
904
918
|
dot_content += (
|
|
905
919
|
f"{visited_nodes.index(source)} -> {visited_nodes.index(target)} "
|
|
906
|
-
f' [label="{html.escape(str(edge.__jac__.architype
|
|
920
|
+
f' [label="{html.escape(str(edge.__jac__.architype))} "];\n'
|
|
907
921
|
)
|
|
908
922
|
for node_ in visited_nodes:
|
|
909
923
|
color = (
|
jaclang/plugin/feature.py
CHANGED
|
@@ -46,6 +46,16 @@ class JacFeature:
|
|
|
46
46
|
"""Get current execution context."""
|
|
47
47
|
return pm.hook.get_context()
|
|
48
48
|
|
|
49
|
+
@staticmethod
|
|
50
|
+
def get_object(id: str) -> Architype | None:
|
|
51
|
+
"""Get object given id."""
|
|
52
|
+
return pm.hook.get_object(id=id)
|
|
53
|
+
|
|
54
|
+
@staticmethod
|
|
55
|
+
def object_ref(obj: Architype) -> str:
|
|
56
|
+
"""Get object reference id."""
|
|
57
|
+
return pm.hook.object_ref(obj=obj)
|
|
58
|
+
|
|
49
59
|
@staticmethod
|
|
50
60
|
def make_architype(
|
|
51
61
|
cls: type,
|
jaclang/plugin/spec.py
CHANGED
|
@@ -48,6 +48,18 @@ class JacFeatureSpec:
|
|
|
48
48
|
"""Get current execution context."""
|
|
49
49
|
raise NotImplementedError
|
|
50
50
|
|
|
51
|
+
@staticmethod
|
|
52
|
+
@hookspec(firstresult=True)
|
|
53
|
+
def get_object(id: str) -> Architype | None:
|
|
54
|
+
"""Get object given id.."""
|
|
55
|
+
raise NotImplementedError
|
|
56
|
+
|
|
57
|
+
@staticmethod
|
|
58
|
+
@hookspec(firstresult=True)
|
|
59
|
+
def object_ref(obj: Architype) -> str:
|
|
60
|
+
"""Get object given id.."""
|
|
61
|
+
raise NotImplementedError
|
|
62
|
+
|
|
51
63
|
@staticmethod
|
|
52
64
|
@hookspec(firstresult=True)
|
|
53
65
|
def make_architype(
|
jaclang/runtimelib/importer.py
CHANGED
jaclang/runtimelib/memory.py
CHANGED
|
@@ -18,7 +18,7 @@ class Memory(Generic[ID, TANCH]):
|
|
|
18
18
|
"""Generic Memory Handler."""
|
|
19
19
|
|
|
20
20
|
__mem__: dict[ID, TANCH] = field(default_factory=dict)
|
|
21
|
-
__gc__: set[
|
|
21
|
+
__gc__: set[TANCH] = field(default_factory=set)
|
|
22
22
|
|
|
23
23
|
def close(self) -> None:
|
|
24
24
|
"""Close memory handler."""
|
|
@@ -62,8 +62,8 @@ class Memory(Generic[ID, TANCH]):
|
|
|
62
62
|
ids = [ids]
|
|
63
63
|
|
|
64
64
|
for id in ids:
|
|
65
|
-
self.__mem__.pop(id, None)
|
|
66
|
-
|
|
65
|
+
if anchor := self.__mem__.pop(id, None):
|
|
66
|
+
self.__gc__.add(anchor)
|
|
67
67
|
|
|
68
68
|
|
|
69
69
|
@dataclass
|
|
@@ -84,9 +84,9 @@ class ShelfStorage(Memory[UUID, Anchor]):
|
|
|
84
84
|
|
|
85
85
|
root = Jac.get_root().__jac__
|
|
86
86
|
|
|
87
|
-
for
|
|
88
|
-
self.__shelf__.pop(str(id), None)
|
|
89
|
-
self.__mem__.pop(id, None)
|
|
87
|
+
for anchor in self.__gc__:
|
|
88
|
+
self.__shelf__.pop(str(anchor.id), None)
|
|
89
|
+
self.__mem__.pop(anchor.id, None)
|
|
90
90
|
|
|
91
91
|
for d in self.__mem__.values():
|
|
92
92
|
if d.persistent and d.hash != hash(dumps(d)):
|
|
@@ -31,6 +31,7 @@ with entry{
|
|
|
31
31
|
print(d2.count('a(val')==19,d2.count('#F5E5FF')==2 ,'Edge1' not in d2,d2.count('GenericEdge')==42);
|
|
32
32
|
print(d3.count('a(val')==6,d3.count("GenericEdge")==5,d3.count('#F5E5FF')==1);
|
|
33
33
|
print(d4.count("a(val")==25,d4.count("GenericEdge")==66,d4.count('#FFF0F')==3);
|
|
34
|
+
print(d5.count("Edge1(val=6)")==2, d5.count("GenericEdge()")==24);
|
|
34
35
|
# print(l3<l2);
|
|
35
36
|
# print(d1);
|
|
36
37
|
# print(d2);
|
jaclang/tests/test_language.py
CHANGED
|
@@ -39,7 +39,7 @@ class JacLanguageTests(TestCase):
|
|
|
39
39
|
sys.stdout = captured_output
|
|
40
40
|
|
|
41
41
|
# Execute the function
|
|
42
|
-
cli.run(self.fixture_abs_path("sub_abil_sep.jac"))
|
|
42
|
+
cli.run(self.fixture_abs_path("sub_abil_sep.jac"))
|
|
43
43
|
|
|
44
44
|
sys.stdout = sys.__stdout__
|
|
45
45
|
stdout_value = captured_output.getvalue()
|
|
@@ -376,7 +376,7 @@ class JacLanguageTests(TestCase):
|
|
|
376
376
|
jac_import("builtin_dotgen", base_path=self.fixture_abs_path("./"))
|
|
377
377
|
sys.stdout = sys.__stdout__
|
|
378
378
|
stdout_value = captured_output.getvalue()
|
|
379
|
-
self.assertEqual(stdout_value.count("True"),
|
|
379
|
+
self.assertEqual(stdout_value.count("True"), 16)
|
|
380
380
|
|
|
381
381
|
def test_with_contexts(self) -> None:
|
|
382
382
|
"""Test walking through edges."""
|
|
@@ -951,3 +951,14 @@ class JacLanguageTests(TestCase):
|
|
|
951
951
|
self.assertIn("Edges in bar:\n - Edge: Link", stdout_value)
|
|
952
952
|
self.assertIn("Item value: 0", stdout_value)
|
|
953
953
|
self.assertIn("Created 5 items.", stdout_value)
|
|
954
|
+
|
|
955
|
+
def test_object_ref_interface(self) -> None:
|
|
956
|
+
"""Test class method output."""
|
|
957
|
+
captured_output = io.StringIO()
|
|
958
|
+
sys.stdout = captured_output
|
|
959
|
+
cli.run(self.fixture_abs_path("objref.jac"))
|
|
960
|
+
sys.stdout = sys.__stdout__
|
|
961
|
+
stdout_value = captured_output.getvalue().split("\n")
|
|
962
|
+
self.assertEqual(len(stdout_value[0]), 32)
|
|
963
|
+
self.assertEqual("MyNode(value=0)", stdout_value[1])
|
|
964
|
+
self.assertEqual("valid: True", stdout_value[2])
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: jaclang
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.18
|
|
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
|
|
@@ -12,7 +12,9 @@ Classifier: License :: OSI Approved :: MIT License
|
|
|
12
12
|
Classifier: Programming Language :: Python :: 3
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.11
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Provides-Extra: all
|
|
15
16
|
Provides-Extra: llm
|
|
17
|
+
Provides-Extra: streamlit
|
|
16
18
|
Project-URL: Documentation, https://jac-lang.org
|
|
17
19
|
Project-URL: Repository, https://github.com/Jaseci-Labs/jaclang
|
|
18
20
|
Description-Content-Type: text/markdown
|
|
@@ -2,7 +2,7 @@ jaclang/__init__.py,sha256=quKqbhKk5CQ0k798jIXMbeAKzQxD0yhOpQGSvYD6TD8,399
|
|
|
2
2
|
jaclang/cli/.gitignore,sha256=NYuons2lzuCpCdefMnztZxeSMgtPVJF6R6zSgVDOV20,27
|
|
3
3
|
jaclang/cli/__init__.py,sha256=7aaPgYddIAHBvkdv36ngbfwsimMnfGaTDcaHYMg_vf4,23
|
|
4
4
|
jaclang/cli/cli.md,sha256=4BPJGdcyvs_rXgd_DPEGjkKSGe5ureXXYaQsf-_z_LU,5939
|
|
5
|
-
jaclang/cli/cli.py,sha256=
|
|
5
|
+
jaclang/cli/cli.py,sha256=XbxY2D6j0nRrhqaTBg0_e3f9haiHZNo1jUHbJYxZMUo,15878
|
|
6
6
|
jaclang/cli/cmdreg.py,sha256=5mhzLJnpHfc0Z22qKQgcEOICgBaC95G9gSJZ-R7GqvU,8282
|
|
7
7
|
jaclang/compiler/.gitignore,sha256=n1k2_xXTorp9PY8hhYM4psHircn-NMaFx95bSgDKopo,10
|
|
8
8
|
jaclang/compiler/__init__.py,sha256=O1GO5Hb02vRlz7OpYHinQV5lQ7YuNUV9Hgjlc3QWtZg,2780
|
|
@@ -21,7 +21,7 @@ jaclang/compiler/passes/main/def_use_pass.py,sha256=68Uts_v-R-9mzBXC9EfXpcBEQwqn
|
|
|
21
21
|
jaclang/compiler/passes/main/fuse_typeinfo_pass.py,sha256=afe2-0zsfdoP6-hUd2y2zKV_ZFtPpxxapm8q2Mkik4Y,22466
|
|
22
22
|
jaclang/compiler/passes/main/import_pass.py,sha256=F7CeHKhFip3zp7FVOCpEsua0HRAudwIQdxyjqOp4JdQ,11702
|
|
23
23
|
jaclang/compiler/passes/main/py_collect_dep_pass.py,sha256=OTulloovybZpXJXrQFsKgzXoRsgf-x5UfO6qalhJndg,2447
|
|
24
|
-
jaclang/compiler/passes/main/pyast_gen_pass.py,sha256=
|
|
24
|
+
jaclang/compiler/passes/main/pyast_gen_pass.py,sha256=ACUhGsLq34N-Sfo96IAgkTnds9ZY6I7J6okr6rFvPpo,142105
|
|
25
25
|
jaclang/compiler/passes/main/pyast_load_pass.py,sha256=k-tf5cZVlygDg4BGBYcAznO6w0hM4-0Pdzlwr4Sw48I,94027
|
|
26
26
|
jaclang/compiler/passes/main/pybc_gen_pass.py,sha256=CjA9AqyMO3Pv_b5Hh0YI6JmCqIru2ASonO6rhrkau-M,1336
|
|
27
27
|
jaclang/compiler/passes/main/pyjac_ast_link_pass.py,sha256=1pW0uLEnhM5hCwVFAREdd_miyr3qTK0h_SJVfR_ryig,8604
|
|
@@ -72,7 +72,7 @@ jaclang/compiler/passes/main/tests/test_typeinfo_pass.py,sha256=ehC0_giLg7NwB7fR
|
|
|
72
72
|
jaclang/compiler/passes/main/type_check_pass.py,sha256=TdMAzdHYXrKv-vTylGhvxjSDylk0HoOQUa7A4OC1d5A,4208
|
|
73
73
|
jaclang/compiler/passes/tool/__init__.py,sha256=xekCOXysHIcthWm8NRmQoA1Ah1XV8vFbkfeHphJtUdc,223
|
|
74
74
|
jaclang/compiler/passes/tool/fuse_comments_pass.py,sha256=CSnuWy4gZfTcWKe0Q7LBikBgWe1zJr0QmNUkgrZ7B38,3657
|
|
75
|
-
jaclang/compiler/passes/tool/jac_formatter_pass.py,sha256=
|
|
75
|
+
jaclang/compiler/passes/tool/jac_formatter_pass.py,sha256=ngLu4qrTXev0NYNcL1feng89xHxTBXzZEQ_AYSZO3Qw,89878
|
|
76
76
|
jaclang/compiler/passes/tool/schedules.py,sha256=kmbsCazAMizGAdQuZpFky5BPlYlMXqNw7wOUzdi_wBo,432
|
|
77
77
|
jaclang/compiler/passes/tool/tests/__init__.py,sha256=AeOaZjA1rf6VAr0JqIit6jlcmOzW7pxGr4U1fOwgK_Y,24
|
|
78
78
|
jaclang/compiler/passes/tool/tests/fixtures/corelib.jac,sha256=RGIOyYW5eyadmOf0H-COpLPMJIIkWOFVERI5dNEM3J8,12581
|
|
@@ -133,7 +133,7 @@ jaclang/compiler/tests/fixtures/stuff.jac,sha256=qOq6WOwhlprMmJpiqQudgqnr4qTd9uh
|
|
|
133
133
|
jaclang/compiler/tests/test_importer.py,sha256=glEyjV21nJaCVrDXbF5kkcZYBcCTnmWngdUBbuygAxY,2289
|
|
134
134
|
jaclang/compiler/tests/test_parser.py,sha256=Sj9Kz1FghESaPpyx_kEvScs4xvz-vgEdH8yyQJ0iB7M,4820
|
|
135
135
|
jaclang/langserve/__init__.py,sha256=3qbnivBBcLZCfmDYRMIeKkG08Lx7XQsJJg-qG8TU8yc,51
|
|
136
|
-
jaclang/langserve/engine.py,sha256=
|
|
136
|
+
jaclang/langserve/engine.py,sha256=3aTIGP0PIu8Wku4xRytsdstqPNe6xwU5QGikyj9jdcY,18015
|
|
137
137
|
jaclang/langserve/sem_manager.py,sha256=d5QzT9WVYarZfTg1sUF_pTfNMYb65HLz3vX839b5Jeo,14918
|
|
138
138
|
jaclang/langserve/server.py,sha256=qkWhsJLaQT2o-obIeOcPqag3B3wANzGFgW5EmC8tYYg,5445
|
|
139
139
|
jaclang/langserve/tests/__init__.py,sha256=iDM47k6c3vahaWhwxpbkdEOshbmX-Zl5x669VONjS2I,23
|
|
@@ -147,7 +147,7 @@ jaclang/langserve/tests/fixtures/circle_pure.test.jac,sha256=Ys-IoqcYqId1T-Pcz2i
|
|
|
147
147
|
jaclang/langserve/tests/fixtures/circle_pure_err.impl.jac,sha256=rsXatY9a-wZONRPJ6VOuw7Bj9R_CrJO_TEwAVXj1PjU,702
|
|
148
148
|
jaclang/langserve/tests/fixtures/circle_pure_err.jac,sha256=jQ5QX0G5khGACoY82CM-6LcOX57w4e29tHVicE2eMgw,608
|
|
149
149
|
jaclang/langserve/tests/fixtures/hello.jac,sha256=iRMKtYVCw1zLvjOQbj3q__3Manj1Di1YeDTNMEvYtBc,36
|
|
150
|
-
jaclang/langserve/tests/fixtures/import_include_statements.jac,sha256=
|
|
150
|
+
jaclang/langserve/tests/fixtures/import_include_statements.jac,sha256=4TiVpsj2Of1J67AJjZdxUQechHYVq9HlL1UDCuY9LME,300
|
|
151
151
|
jaclang/langserve/tests/fixtures/py_import.py,sha256=BvNimsRmsbJWd-JNM31oJpl52bYvSdfQ6Np3DJNt7d0,320
|
|
152
152
|
jaclang/langserve/tests/fixtures/rename.jac,sha256=VrdXiQh1xQIBWKVFT6oO4DxgEncyLRPFl87aKw5QUI8,251
|
|
153
153
|
jaclang/langserve/tests/pylsp_jsonrpc/__init__.py,sha256=bDWxRjmELPCVGy243_0kNrG7PttyZsv_eZ9JTKQrU1E,105
|
|
@@ -157,13 +157,13 @@ jaclang/langserve/tests/pylsp_jsonrpc/exceptions.py,sha256=NGHeFQawZcjoLUcgDmY3b
|
|
|
157
157
|
jaclang/langserve/tests/pylsp_jsonrpc/streams.py,sha256=R80_FvICIkrbdGmNtlemWYaxrr7-XldPgLaASnyv0W8,3332
|
|
158
158
|
jaclang/langserve/tests/session.py,sha256=3pIRoQjZnsnUWIYnO2SpK7c1PAiHMCFrrStNK2tawRM,9572
|
|
159
159
|
jaclang/langserve/tests/test_sem_tokens.py,sha256=HWNaA1CK5qxFeipmd4AAvjAbJSEW4-09hY2UHVfvtlc,9897
|
|
160
|
-
jaclang/langserve/tests/test_server.py,sha256=
|
|
161
|
-
jaclang/langserve/utils.py,sha256=
|
|
160
|
+
jaclang/langserve/tests/test_server.py,sha256=FEjC4mmG85sU0O4qykmfu1Ks62mkveKRgpHep4vt3Rk,22908
|
|
161
|
+
jaclang/langserve/utils.py,sha256=tDsdEOtZdmJ6Xn8b0Ohwt8fRVNm5qtUC4Cub85CG3Mk,19028
|
|
162
162
|
jaclang/plugin/__init__.py,sha256=5t2krHKt_44PrCTGojzxEimxpNHYVQcn89jAiCSXE_k,165
|
|
163
|
-
jaclang/plugin/builtin.py,sha256=
|
|
164
|
-
jaclang/plugin/default.py,sha256
|
|
165
|
-
jaclang/plugin/feature.py,sha256=
|
|
166
|
-
jaclang/plugin/spec.py,sha256=
|
|
163
|
+
jaclang/plugin/builtin.py,sha256=Hj8SVcauuhzsPQJBzt8jIfHkSUAcqsKfAFyCPYdBZKA,1300
|
|
164
|
+
jaclang/plugin/default.py,sha256=oxPO7tud8VqP20BrfnDNpLPtM0kaL00s-1F70X3hvCg,31173
|
|
165
|
+
jaclang/plugin/feature.py,sha256=SgTFAjJI_SbYn2ZdUsx-b4vtYHnl_STRa5oV7AM2yX8,11603
|
|
166
|
+
jaclang/plugin/spec.py,sha256=TlNUQu51daKsmiPeFoQcXZ7HVdoYN5zGA03OAMmpVac,10362
|
|
167
167
|
jaclang/plugin/tests/__init__.py,sha256=rn_tNG8jCHWwBc_rx4yFkGc4N1GISb7aPuTFVRTvrTk,38
|
|
168
168
|
jaclang/plugin/tests/fixtures/impl_match.jac,sha256=WEhcA1GlovusITEFO2bOjYYqiiULyYGKhM17uK2GqnI,91
|
|
169
169
|
jaclang/plugin/tests/fixtures/impl_match_impl.jac,sha256=k1385r7Hdlq6mUKxEHa3VOKJUIWH08hYg2kErhbYwFM,31
|
|
@@ -177,9 +177,9 @@ jaclang/runtimelib/__init__.py,sha256=jDDYBCV82qPhmcDVk3NIvHbhng0ebSrXD3xrojg0-e
|
|
|
177
177
|
jaclang/runtimelib/architype.py,sha256=sqsrobtbHaHDYJaqbXx9iapZ3TJ92APXFzw9bSGnQ90,21659
|
|
178
178
|
jaclang/runtimelib/constructs.py,sha256=QWut5kKRaBbIelb12cpTSa_D0xDGPOoHHq4SaDetyo8,760
|
|
179
179
|
jaclang/runtimelib/context.py,sha256=gUiPZ4ZoHoz_vHjxG9kvIw4hlmx8G8lPTquGC6qJoi4,5609
|
|
180
|
-
jaclang/runtimelib/importer.py,sha256=
|
|
180
|
+
jaclang/runtimelib/importer.py,sha256=dQWPj3n7Ahschq5FRJVy_r6oghNxp3j8o9zi72FEviE,14291
|
|
181
181
|
jaclang/runtimelib/machine.py,sha256=QAodSjVm45-0VmhmFRMEJtFp1j3k2VvoiUi117YVS5g,5455
|
|
182
|
-
jaclang/runtimelib/memory.py,sha256=
|
|
182
|
+
jaclang/runtimelib/memory.py,sha256=GlzdN81728IsTmPLOe70HCDFE_JRHIEWlfDzfjWxn8o,5072
|
|
183
183
|
jaclang/runtimelib/test.py,sha256=HRCl3cf0uPTe58Kcx_sBUb6ow8J53rnmpFOhA7g9oAA,2851
|
|
184
184
|
jaclang/runtimelib/utils.py,sha256=P9gVE3XFhRzr745RCDXXIP391AcsL4aL_6HrXws_qa4,8155
|
|
185
185
|
jaclang/settings.py,sha256=a8q39_6QvMVXGTjAzOwmfYMjk7w3H-iyMCEQADAw5iU,3455
|
|
@@ -193,7 +193,7 @@ jaclang/tests/fixtures/baddy.jac,sha256=waLlwMyW_JCE1x_SuVzRER1RBe1j3XiLTw-0Njzn
|
|
|
193
193
|
jaclang/tests/fixtures/baddy.test.jac,sha256=Uq-Nlf44QUAtbOfDCbc9_ceLxmo31PILDTSzAv8nJq4,33
|
|
194
194
|
jaclang/tests/fixtures/bar.jac,sha256=9I50W-KAhOqTwcsCkmug8Grm2cPMAhUwsE_fllIQNm8,781
|
|
195
195
|
jaclang/tests/fixtures/blankwithentry.jac,sha256=lnMDDKyKnldsUIx1AVCIHt47KY3gR2CZYhox8663sLM,53
|
|
196
|
-
jaclang/tests/fixtures/builtin_dotgen.jac,sha256=
|
|
196
|
+
jaclang/tests/fixtures/builtin_dotgen.jac,sha256=1CCJTSmMD1Zt_FkC-poPGyHRV3rIcst616UtYfuLIrE,1830
|
|
197
197
|
jaclang/tests/fixtures/byllmissue.jac,sha256=vAwxzbRNx5yOM3HTDSH7wafPYXU7AunBOZmgdsT2rhc,86
|
|
198
198
|
jaclang/tests/fixtures/chandra_bugs.jac,sha256=vcBjZ4P7S1PPUs-_0Stt779pus95RJTMs1x_-m0w7yY,282
|
|
199
199
|
jaclang/tests/fixtures/chandra_bugs2.jac,sha256=OZP6JOsIr8WK-joPZ54-LcbVVvtuZ5ILPdkynSSx3uU,559
|
|
@@ -254,6 +254,7 @@ jaclang/tests/fixtures/needs_import_2.jac,sha256=RC4aok5TCbxInmTp8OmArCt4afawPP9
|
|
|
254
254
|
jaclang/tests/fixtures/needs_import_3.jac,sha256=9ASkW82KUKDgydt8dR48XucG66n6xeLEGLwAgRgfOR8,104
|
|
255
255
|
jaclang/tests/fixtures/needs_import_dup.jac,sha256=hJab0QWdoTLuNaNhtY6zjzyGGUouRyT9uQknhP-lXXQ,315
|
|
256
256
|
jaclang/tests/fixtures/nosigself.jac,sha256=jCjNizUVOrgJwXJ_-TdOzKsq8hlhU6xuX0Mz27W92lQ,187
|
|
257
|
+
jaclang/tests/fixtures/objref.jac,sha256=u_Sc8CTbsqe0D0VI5jUEWsV36l2PH0uNukSn3LSlJPI,195
|
|
257
258
|
jaclang/tests/fixtures/pyfunc.py,sha256=Os1xnL4I4ddNkpv4Vs5aOxu95dEM0JuNIoiECyCCjJ0,163
|
|
258
259
|
jaclang/tests/fixtures/pyfunc_1.py,sha256=bDEx4oIco0CxXmy1OGwGhcYh9QTNSEIpBuwV8KZ-IFs,5304
|
|
259
260
|
jaclang/tests/fixtures/pyfunc_2.py,sha256=wnPS3t9wEElWtLekP3O5NcKI15-WKg08h4wbiijaMXo,5055
|
|
@@ -281,7 +282,7 @@ jaclang/tests/fixtures/walker_override.jac,sha256=Ok58ZAgxuV6aECNxYrjbbyAWSiqIbn
|
|
|
281
282
|
jaclang/tests/fixtures/with_context.jac,sha256=cDA_4YWe5UVmQRgcpktzkZ_zsswQpV_T2Otf_rFnPy8,466
|
|
282
283
|
jaclang/tests/test_bugs.py,sha256=tBPsIlSPqZDIz4QaScNRT-WdGIdJ0uU-aRBWq1XUZ6o,555
|
|
283
284
|
jaclang/tests/test_cli.py,sha256=cqGHeL15sy34qJRZyD48Wu6rnOh1ZDHNS3pg0jOJvag,12515
|
|
284
|
-
jaclang/tests/test_language.py,sha256=
|
|
285
|
+
jaclang/tests/test_language.py,sha256=5Vv2wD0PkBLESiNhKCToT3FAeQoQpzSElv_xwg6BVMo,39082
|
|
285
286
|
jaclang/tests/test_man_code.py,sha256=ZdNarlZVfT_-8Jv3FjLplHw76tsvkCuISyfX3M4qxPg,5027
|
|
286
287
|
jaclang/tests/test_reference.py,sha256=FISQpZbB8cmRoAeJOFfXUy13WVxykZjpkPSb1OTotfI,3340
|
|
287
288
|
jaclang/tests/test_settings.py,sha256=TIX5uiu8H9IpZN2__uFiclcdCpBpPpcAwtlEHyFC4kk,1999
|
|
@@ -1515,7 +1516,7 @@ jaclang/vendor/typing_extensions-4.12.2.dist-info/METADATA,sha256=BeUQIa8cnYbrjW
|
|
|
1515
1516
|
jaclang/vendor/typing_extensions-4.12.2.dist-info/RECORD,sha256=XS4fBVrPI7kaNZ56Ggl2RGa76jySWLqTzcrUpZIQTVM,418
|
|
1516
1517
|
jaclang/vendor/typing_extensions-4.12.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
|
1517
1518
|
jaclang/vendor/typing_extensions.py,sha256=gwekpyG9DVG3lxWKX4ni8u7nk3We5slG98mA9F3DJQw,134451
|
|
1518
|
-
jaclang-0.7.
|
|
1519
|
-
jaclang-0.7.
|
|
1520
|
-
jaclang-0.7.
|
|
1521
|
-
jaclang-0.7.
|
|
1519
|
+
jaclang-0.7.18.dist-info/METADATA,sha256=AEdrDMQWk6zb30Ji2LCf-h5DtAnEvzAPkhyc_3dwWC0,4853
|
|
1520
|
+
jaclang-0.7.18.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
1521
|
+
jaclang-0.7.18.dist-info/entry_points.txt,sha256=8sMi4Tvi9f8tQDN2QAXsSA2icO27zQ4GgEdph6bNEZM,49
|
|
1522
|
+
jaclang-0.7.18.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|