jaclang 0.7.28__py3-none-any.whl → 0.7.30__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.

@@ -55,7 +55,7 @@ TOKEN_MAP.update(
55
55
  "CARROW_L": "<++", "CARROW_R": "++>", "GLOBAL_OP": ":global:",
56
56
  "NONLOCAL_OP": ":nonlocal:", "WALKER_OP": ":walker:", "NODE_OP": ":node:",
57
57
  "EDGE_OP": ":edge:", "CLASS_OP": ":class:", "OBJECT_OP": ":obj:",
58
- "TYPE_OP": "`", "ABILITY_OP": ":can:", "ELVIS_OP": "?:", "NULL_OK": "?",
58
+ "TYPE_OP": "`", "ABILITY_OP": ":can:", "NULL_OK": "?",
59
59
  "KW_OR": "|", "ARROW_BI": "<-->", "ARROW_L": "<--",
60
60
  "ARROW_R": "-->", "ARROW_L_P1": "<-:", "ARROW_R_P2": ":->",
61
61
  "ARROW_L_P2": ":-", "ARROW_R_P1": "-:", "CARROW_BI": "<++>",
@@ -1013,8 +1013,9 @@ class ModulePath(AstSymbolNode):
1013
1013
  target = self.dot_path_str
1014
1014
  if target_item:
1015
1015
  target += f".{target_item}"
1016
- base_path = os.path.dirname(self.loc.mod_path)
1017
- base_path = base_path if base_path else os.getcwd()
1016
+ base_path = (
1017
+ os.getenv("JACPATH") or os.path.dirname(self.loc.mod_path) or os.getcwd()
1018
+ )
1018
1019
  parts = target.split(".")
1019
1020
  traversal_levels = self.level - 1 if self.level > 0 else 0
1020
1021
  actual_parts = parts[traversal_levels:]
@@ -1026,6 +1027,15 @@ class ModulePath(AstSymbolNode):
1026
1027
  if os.path.exists(relative_path + ".jac")
1027
1028
  else relative_path
1028
1029
  )
1030
+ jacpath = os.getenv("JACPATH")
1031
+ if not os.path.exists(relative_path) and jacpath:
1032
+ name_to_find = actual_parts[-1] + ".jac"
1033
+
1034
+ # Walk through the single path in JACPATH
1035
+ for root, _, files in os.walk(jacpath):
1036
+ if name_to_find in files:
1037
+ relative_path = os.path.join(root, name_to_find)
1038
+ break
1029
1039
  return relative_path
1030
1040
 
1031
1041
  def normalize(self, deep: bool = False) -> bool:
@@ -31,7 +31,7 @@ def jac_file_to_pass(
31
31
  schedule: list[Type[Pass]] = pass_schedule,
32
32
  ) -> Pass:
33
33
  """Convert a Jac file to an AST."""
34
- with open(file_path) as file:
34
+ with open(file_path, "r", encoding="utf-8") as file:
35
35
  return jac_str_to_pass(
36
36
  jac_str=file.read(),
37
37
  file_path=file_path,
@@ -315,7 +315,6 @@ class Tokens(str, Enum):
315
315
  ABILITY_OP = "ABILITY_OP"
316
316
  A_PIPE_FWD = "A_PIPE_FWD"
317
317
  A_PIPE_BKWD = "A_PIPE_BKWD"
318
- ELVIS_OP = "ELVIS_OP"
319
318
  RETURN_HINT = "RETURN_HINT"
320
319
  NULL_OK = "NULL_OK"
321
320
  DECOR_OP = "DECOR_OP"
jaclang/compiler/jac.lark CHANGED
@@ -298,10 +298,7 @@ lambda_expr: KW_WITH func_decl_params? (RETURN_HINT expression)? KW_CAN expressi
298
298
  pipe: (pipe PIPE_FWD)? pipe_back
299
299
 
300
300
  // Pipe back expressions
301
- pipe_back: (pipe_back PIPE_BKWD)? elvis_check
302
-
303
- // Elvis expressions
304
- elvis_check: (elvis_check ELVIS_OP)? bitwise_or
301
+ pipe_back: (pipe_back PIPE_BKWD)? bitwise_or
305
302
 
306
303
  // Bitwise expressions
307
304
  bitwise_or: (bitwise_or BW_OR)? bitwise_xor
@@ -599,7 +596,6 @@ PIPE_BKWD: /<\|/
599
596
  DOT_FWD: /\.>/
600
597
  DOT_BKWD: /<\./
601
598
  RETURN_HINT: /->/
602
- ELVIS_OP: /\?:/
603
599
  NULL_OK: /\?/
604
600
  MATMUL_EQ: /@=/
605
601
  DECOR_OP: /@/
@@ -2037,16 +2037,8 @@ class JacParser(Pass):
2037
2037
  def pipe_back(self, kid: list[ast.AstNode]) -> ast.Expr:
2038
2038
  """Grammar rule.
2039
2039
 
2040
- pipe_back: elvis_check PIPE_BKWD pipe_back
2041
- | elvis_check
2042
- """
2043
- return self.binary_expr_unwind(kid)
2044
-
2045
- def elvis_check(self, kid: list[ast.AstNode]) -> ast.Expr:
2046
- """Grammar rule.
2047
-
2048
- elvis_check: bitwise_or ELVIS_OP elvis_check
2049
- | bitwise_or
2040
+ pipe_back: bitwise_or PIPE_BKWD pipe_back
2041
+ | bitwise_or
2050
2042
  """
2051
2043
  return self.binary_expr_unwind(kid)
2052
2044
 
@@ -186,7 +186,7 @@ class JacImportPass(Pass):
186
186
  self.warnings_had += mod_pass.warnings_had
187
187
  mod = mod_pass.ir
188
188
  except Exception as e:
189
- logger.info(e)
189
+ logger.error(e)
190
190
  mod = None
191
191
  if isinstance(mod, ast.Module):
192
192
  self.import_table[target] = mod
@@ -472,7 +472,7 @@ class PyImportPass(JacImportPass):
472
472
  if mod:
473
473
  mod.name = imported_mod_name if imported_mod_name else mod.name
474
474
  if mod.name == "__init__":
475
- mod_name = mod.loc.mod_path.split("/")[-2]
475
+ mod_name = mod.loc.mod_path.split(os.sep)[-2]
476
476
  self.__debug_print(
477
477
  f"\tRaised the __init__ file and rename the mod to be {mod_name}"
478
478
  )
@@ -2482,25 +2482,6 @@ class PyastGenPass(Pass):
2482
2482
  return func_node.gen.py_ast
2483
2483
  elif node.op.name == Tok.PIPE_FWD and isinstance(node.right, ast.TupleVal):
2484
2484
  self.error("Invalid pipe target.")
2485
- elif node.op.name == Tok.ELVIS_OP:
2486
- self.needs_jac_feature()
2487
- return [
2488
- self.sync(
2489
- ast3.Call(
2490
- func=self.sync(
2491
- ast3.Attribute(
2492
- value=self.sync(
2493
- ast3.Name(id=Con.JAC_FEATURE.value, ctx=ast3.Load())
2494
- ),
2495
- attr="elvis",
2496
- ctx=ast3.Load(),
2497
- )
2498
- ),
2499
- args=[node.left.gen.py_ast[0], node.right.gen.py_ast[0]],
2500
- keywords=[],
2501
- )
2502
- )
2503
- ]
2504
2485
  else:
2505
2486
  self.error(
2506
2487
  f"Binary operator {node.op.value} not supported in bootstrap Jac"
@@ -83,7 +83,10 @@ class ImportPassPassTests(TestCase):
83
83
  for i in p:
84
84
  self.assertIn(i, build.ir.py_info.py_raise_map)
85
85
  self.assertRegex(
86
- re.sub(r".*fixtures/", "", build.ir.py_info.py_raise_map[i]), p[i]
86
+ re.sub(r".*fixtures/", "", build.ir.py_info.py_raise_map[i]).replace(
87
+ "\\", "/"
88
+ ),
89
+ p[i],
87
90
  )
88
91
 
89
92
  def test_py_raised_mods(self) -> None:
@@ -973,7 +973,6 @@ class JacFormatPass(Pass):
973
973
  Tok.PIPE_FWD,
974
974
  Tok.KW_SPAWN,
975
975
  Tok.A_PIPE_FWD,
976
- Tok.ELVIS_OP,
977
976
  ]
978
977
  or (
979
978
  node.op.name == Tok.PIPE_FWD
@@ -33,7 +33,7 @@ class TestLoader(TestCase):
33
33
  )
34
34
  self.assertIn(
35
35
  "/tests/fixtures/hello_world.jac",
36
- str(JacMachine.get().loaded_modules),
36
+ str(JacMachine.get().loaded_modules).replace("\\\\", "/"),
37
37
  )
38
38
  JacMachine.detach()
39
39
 
@@ -62,3 +62,47 @@ class TestLoader(TestCase):
62
62
  "{SomeObj(a=10): 'check'} [MyObj(apple=5, banana=7), MyObj(apple=5, banana=7)]",
63
63
  stdout_value,
64
64
  )
65
+
66
+ def test_import_with_jacpath(self) -> None:
67
+ """Test module import using JACPATH."""
68
+ # Set up a temporary JACPATH environment variable
69
+ import os
70
+ import tempfile
71
+
72
+ jacpath_dir = tempfile.TemporaryDirectory()
73
+ os.environ["JACPATH"] = jacpath_dir.name
74
+
75
+ # Create a mock Jac file in the JACPATH directory
76
+ module_name = "test_module"
77
+ jac_file_path = os.path.join(jacpath_dir.name, f"{module_name}.jac")
78
+ with open(jac_file_path, "w") as f:
79
+ f.write(
80
+ """
81
+ with entry {
82
+ "Hello from JACPATH!" :> print;
83
+ }
84
+ """
85
+ )
86
+
87
+ # Capture the output
88
+ captured_output = io.StringIO()
89
+ sys.stdout = captured_output
90
+
91
+ try:
92
+ JacMachine(self.fixture_abs_path(__file__)).attach_program(
93
+ JacProgram(mod_bundle=None, bytecode=None, sem_ir=None)
94
+ )
95
+ jac_import(module_name, base_path=__file__)
96
+ cli.run(jac_file_path)
97
+
98
+ # Reset stdout and get the output
99
+ sys.stdout = sys.__stdout__
100
+ stdout_value = captured_output.getvalue()
101
+
102
+ self.assertIn("Hello from JACPATH!", stdout_value)
103
+
104
+ finally:
105
+ captured_output.close()
106
+ JacMachine.detach()
107
+ os.environ.pop("JACPATH", None)
108
+ jacpath_dir.cleanup()
jaclang/plugin/default.py CHANGED
@@ -43,8 +43,11 @@ from jaclang.runtimelib.constructs import (
43
43
  from jaclang.runtimelib.importer import ImportPathSpec, JacImporter, PythonImporter
44
44
  from jaclang.runtimelib.machine import JacMachine, JacProgram
45
45
  from jaclang.runtimelib.memory import Shelf, ShelfStorage
46
- from jaclang.runtimelib.utils import collect_node_connections, traverse_graph
47
-
46
+ from jaclang.runtimelib.utils import (
47
+ all_issubclass,
48
+ collect_node_connections,
49
+ traverse_graph,
50
+ )
48
51
 
49
52
  import pluggy
50
53
 
@@ -176,14 +179,12 @@ class JacAccessValidationImpl:
176
179
  if to_root.access.all > access_level:
177
180
  access_level = to_root.access.all
178
181
 
179
- level = to_root.access.roots.check(str(jroot.id))
180
- if level > AccessLevel.NO_ACCESS and access_level == AccessLevel.NO_ACCESS:
182
+ if (level := to_root.access.roots.check(str(jroot.id))) is not None:
181
183
  access_level = level
182
184
 
183
185
  # if target anchor have set allowed roots
184
186
  # if current root is allowed to target anchor
185
- level = to_access.roots.check(str(jroot.id))
186
- if level > AccessLevel.NO_ACCESS and access_level == AccessLevel.NO_ACCESS:
187
+ if (level := to_access.roots.check(str(jroot.id))) is not None:
187
188
  access_level = level
188
189
 
189
190
  return access_level
@@ -399,64 +400,85 @@ class JacWalkerImpl:
399
400
 
400
401
  walker.path = []
401
402
  walker.next = [node]
402
- if walker.next:
403
- current_node = walker.next[-1].architype
404
- for i in warch._jac_entry_funcs_:
405
- trigger = i.get_funcparam_annotations(i.func)
406
- if not trigger:
407
- if i.func:
408
- i.func(warch, current_node)
409
- else:
410
- raise ValueError(f"No function {i.name} to call.")
403
+ current_node = node.architype
404
+
405
+ # walker entry
406
+ for i in warch._jac_entry_funcs_:
407
+ if i.func and not i.trigger:
408
+ i.func(warch, current_node)
409
+ if walker.disengaged:
410
+ return warch
411
+
411
412
  while len(walker.next):
412
413
  if current_node := walker.next.pop(0).architype:
414
+ # walker entry with
415
+ for i in warch._jac_entry_funcs_:
416
+ if (
417
+ i.func
418
+ and i.trigger
419
+ and all_issubclass(i.trigger, NodeArchitype)
420
+ and isinstance(current_node, i.trigger)
421
+ ):
422
+ i.func(warch, current_node)
423
+ if walker.disengaged:
424
+ return warch
425
+
426
+ # node entry
413
427
  for i in current_node._jac_entry_funcs_:
414
- trigger = i.get_funcparam_annotations(i.func)
415
- if not trigger or isinstance(warch, trigger):
416
- if i.func:
417
- i.func(current_node, warch)
418
- else:
419
- raise ValueError(f"No function {i.name} to call.")
428
+ if i.func and not i.trigger:
429
+ i.func(current_node, warch)
420
430
  if walker.disengaged:
421
431
  return warch
422
- for i in warch._jac_entry_funcs_:
423
- trigger = i.get_funcparam_annotations(i.func)
424
- if not trigger or isinstance(current_node, trigger):
425
- if i.func and trigger:
426
- i.func(warch, current_node)
427
- elif not trigger:
428
- continue
429
- else:
430
- raise ValueError(f"No function {i.name} to call.")
432
+
433
+ # node entry with
434
+ for i in current_node._jac_entry_funcs_:
435
+ if (
436
+ i.func
437
+ and i.trigger
438
+ and all_issubclass(i.trigger, WalkerArchitype)
439
+ and isinstance(warch, i.trigger)
440
+ ):
441
+ i.func(current_node, warch)
431
442
  if walker.disengaged:
432
443
  return warch
433
- for i in warch._jac_exit_funcs_:
434
- trigger = i.get_funcparam_annotations(i.func)
435
- if not trigger or isinstance(current_node, trigger):
436
- if i.func and trigger:
437
- i.func(warch, current_node)
438
- elif not trigger:
439
- continue
440
- else:
441
- raise ValueError(f"No function {i.name} to call.")
444
+
445
+ # node exit with
446
+ for i in current_node._jac_exit_funcs_:
447
+ if (
448
+ i.func
449
+ and i.trigger
450
+ and all_issubclass(i.trigger, WalkerArchitype)
451
+ and isinstance(warch, i.trigger)
452
+ ):
453
+ i.func(current_node, warch)
442
454
  if walker.disengaged:
443
455
  return warch
456
+
457
+ # node exit
444
458
  for i in current_node._jac_exit_funcs_:
445
- trigger = i.get_funcparam_annotations(i.func)
446
- if not trigger or isinstance(warch, trigger):
447
- if i.func:
448
- i.func(current_node, warch)
449
- else:
450
- raise ValueError(f"No function {i.name} to call.")
459
+ if i.func and not i.trigger:
460
+ i.func(current_node, warch)
451
461
  if walker.disengaged:
452
462
  return warch
463
+
464
+ # walker exit with
465
+ for i in warch._jac_exit_funcs_:
466
+ if (
467
+ i.func
468
+ and i.trigger
469
+ and all_issubclass(i.trigger, NodeArchitype)
470
+ and isinstance(current_node, i.trigger)
471
+ ):
472
+ i.func(warch, current_node)
473
+ if walker.disengaged:
474
+ return warch
475
+ # walker exit
453
476
  for i in warch._jac_exit_funcs_:
454
- trigger = i.get_funcparam_annotations(i.func)
455
- if not trigger:
456
- if i.func:
457
- i.func(warch, current_node)
458
- else:
459
- raise ValueError(f"No function {i.name} to call.")
477
+ if i.func and not i.trigger:
478
+ i.func(warch, current_node)
479
+ if walker.disengaged:
480
+ return warch
481
+
460
482
  walker.ignores = []
461
483
  return warch
462
484
 
@@ -896,12 +918,6 @@ class JacFeatureImpl(
896
918
 
897
919
  return ret_count
898
920
 
899
- @staticmethod
900
- @hookimpl
901
- def elvis(op1: Optional[T], op2: T) -> T:
902
- """Jac's elvis operator feature."""
903
- return ret if (ret := op1) is not None else op2
904
-
905
921
  @staticmethod
906
922
  @hookimpl
907
923
  def has_instance_default(gen_func: Callable[[], T]) -> T:
@@ -1008,7 +1024,7 @@ class JacFeatureImpl(
1008
1024
  dir in [EdgeDir.OUT, EdgeDir.ANY]
1009
1025
  and node == source
1010
1026
  and target.architype in right
1011
- and Jac.check_write_access(target)
1027
+ and Jac.check_connect_access(target)
1012
1028
  ):
1013
1029
  Jac.destroy(anchor) if anchor.persistent else Jac.detach(anchor)
1014
1030
  disconnect_occurred = True
@@ -1016,7 +1032,7 @@ class JacFeatureImpl(
1016
1032
  dir in [EdgeDir.IN, EdgeDir.ANY]
1017
1033
  and node == target
1018
1034
  and source.architype in right
1019
- and Jac.check_write_access(source)
1035
+ and Jac.check_connect_access(source)
1020
1036
  ):
1021
1037
  Jac.destroy(anchor) if anchor.persistent else Jac.detach(anchor)
1022
1038
  disconnect_occurred = True
jaclang/plugin/feature.py CHANGED
@@ -377,11 +377,6 @@ class JacFeature(
377
377
  verbose=verbose,
378
378
  )
379
379
 
380
- @staticmethod
381
- def elvis(op1: Optional[T], op2: T) -> T:
382
- """Jac's elvis operator feature."""
383
- return plugin_manager.hook.elvis(op1=op1, op2=op2)
384
-
385
380
  @staticmethod
386
381
  def has_instance_default(gen_func: Callable[[], T]) -> T:
387
382
  """Jac's has container default feature."""
jaclang/plugin/spec.py CHANGED
@@ -355,12 +355,6 @@ class JacFeatureSpec(
355
355
  """Run the test suite in the specified .jac file."""
356
356
  raise NotImplementedError
357
357
 
358
- @staticmethod
359
- @hookspec(firstresult=True)
360
- def elvis(op1: Optional[T], op2: T) -> T:
361
- """Jac's elvis operator feature."""
362
- raise NotImplementedError
363
-
364
358
  @staticmethod
365
359
  @hookspec(firstresult=True)
366
360
  def has_instance_default(gen_func: Callable[[], T]) -> T:
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  import inspect
6
6
  from dataclasses import asdict, dataclass, field, fields, is_dataclass
7
7
  from enum import IntEnum
8
+ from functools import cached_property
8
9
  from logging import getLogger
9
10
  from pickle import dumps
10
11
  from types import UnionType
@@ -43,9 +44,9 @@ class Access:
43
44
 
44
45
  anchors: dict[str, AccessLevel] = field(default_factory=dict)
45
46
 
46
- def check(self, anchor: str) -> AccessLevel:
47
+ def check(self, anchor: str) -> AccessLevel | None:
47
48
  """Validate access."""
48
- return self.anchors.get(anchor, AccessLevel.NO_ACCESS)
49
+ return self.anchors.get(anchor)
49
50
 
50
51
 
51
52
  @dataclass
@@ -220,9 +221,9 @@ class WalkerAnchor(Anchor):
220
221
  """Walker Anchor."""
221
222
 
222
223
  architype: WalkerArchitype
223
- path: list[Anchor] = field(default_factory=list)
224
- next: list[Anchor] = field(default_factory=list)
225
- ignores: list[Anchor] = field(default_factory=list)
224
+ path: list[NodeAnchor] = field(default_factory=list)
225
+ next: list[NodeAnchor] = field(default_factory=list)
226
+ ignores: list[NodeAnchor] = field(default_factory=list)
226
227
  disengaged: bool = False
227
228
 
228
229
 
@@ -311,17 +312,20 @@ class DSFunc:
311
312
  name: str
312
313
  func: Callable[[Any, Any], Any] | None = None
313
314
 
315
+ @cached_property
316
+ def trigger(self) -> type | UnionType | tuple[type | UnionType, ...] | None:
317
+ """Get function parameter annotations."""
318
+ t = (
319
+ (
320
+ inspect.signature(self.func, eval_str=True)
321
+ .parameters["_jac_here_"]
322
+ .annotation
323
+ )
324
+ if self.func
325
+ else None
326
+ )
327
+ return None if t is inspect._empty else t
328
+
314
329
  def resolve(self, cls: type) -> None:
315
330
  """Resolve the function."""
316
331
  self.func = getattr(cls, self.name)
317
-
318
- def get_funcparam_annotations(
319
- self, func: Callable[[Any, Any], Any] | None
320
- ) -> type | UnionType | tuple[type | UnionType, ...] | None:
321
- """Get function parameter annotations."""
322
- if not func:
323
- return None
324
- annotation = (
325
- inspect.signature(func, eval_str=True).parameters["_jac_here_"].annotation
326
- )
327
- return annotation if annotation != inspect._empty else None
@@ -158,9 +158,6 @@ class ImportReturn:
158
158
  return getattr(new_module, name, new_module)
159
159
  except ImportError as e:
160
160
  logger.error(dump_traceback(e))
161
- # logger.error(
162
- # f"Failed to load {name} from {jac_file_path} in {module.__name__}: {str(e)}"
163
- # )
164
161
  return None
165
162
 
166
163
 
@@ -319,6 +316,32 @@ class JacImporter(Importer):
319
316
  """Run the import process for Jac modules."""
320
317
  unique_loaded_items: list[types.ModuleType] = []
321
318
  module = None
319
+ # Gather all possible search paths
320
+ jacpaths = os.environ.get("JACPATH", "")
321
+ search_paths = [spec.caller_dir]
322
+ if jacpaths:
323
+ for p in jacpaths.split(os.pathsep):
324
+ p = p.strip()
325
+ if p and p not in search_paths:
326
+ search_paths.append(p)
327
+
328
+ # Attempt to locate the module file or directory
329
+ found_path = None
330
+ target_path_components = spec.target.split(".")
331
+ for search_path in search_paths:
332
+ candidate = os.path.join(search_path, "/".join(target_path_components))
333
+ # Check if the candidate is a directory or a .jac file
334
+ if (os.path.isdir(candidate)) or (os.path.isfile(candidate + ".jac")):
335
+ found_path = candidate
336
+ break
337
+
338
+ # If a suitable path was found, update spec.full_target; otherwise, raise an error
339
+ if found_path:
340
+ spec.full_target = os.path.abspath(found_path)
341
+ else:
342
+ raise ImportError(
343
+ f"Unable to locate module '{spec.target}' in {search_paths}"
344
+ )
322
345
  if os.path.isfile(spec.full_target + ".jac"):
323
346
  module_name = self.get_sys_mod_name(spec.full_target + ".jac")
324
347
  module_name = spec.override_name if spec.override_name else module_name
@@ -38,6 +38,7 @@ class JacMachine:
38
38
  self.loaded_modules: dict[str, types.ModuleType] = {}
39
39
  if not base_path:
40
40
  base_path = os.getcwd()
41
+ # Ensure the base_path is a list rather than a string
41
42
  self.base_path = base_path
42
43
  self.base_path_dir = (
43
44
  os.path.dirname(base_path)
@@ -306,12 +307,11 @@ class JacProgram:
306
307
  return marshal.load(f)
307
308
 
308
309
  result = compile_jac(full_target, cache_result=cachable)
309
- if result.errors_had or not result.ir.gen.py_bytecode:
310
+ if result.errors_had:
310
311
  for alrt in result.errors_had:
311
312
  # We're not logging here, it already gets logged as the errors were added to the errors_had list.
312
313
  # Regardless of the logging, this needs to be sent to the end user, so we'll printing it to stderr.
313
314
  logger.error(alrt.pretty_print())
314
- return None
315
315
  if result.ir.gen.py_bytecode is not None:
316
316
  return marshal.loads(result.ir.gen.py_bytecode)
317
317
  else:
@@ -231,3 +231,18 @@ def is_instance(
231
231
  return isinstance(obj, target)
232
232
  case _:
233
233
  return False
234
+
235
+
236
+ def all_issubclass(
237
+ classes: type | UnionType | tuple[type | UnionType, ...], target: type
238
+ ) -> bool:
239
+ """Check if all classes is subclass of target type."""
240
+ match classes:
241
+ case type():
242
+ return issubclass(classes, target)
243
+ case UnionType():
244
+ return all((all_issubclass(cls, target) for cls in classes.__args__))
245
+ case tuple():
246
+ return all((all_issubclass(cls, target) for cls in classes))
247
+ case _:
248
+ return False
@@ -0,0 +1,50 @@
1
+ node Node {
2
+ has val: str;
3
+
4
+ can entry1 with entry {
5
+ print(f"{self.val}-2");
6
+ }
7
+
8
+ can entry2 with Walker entry {
9
+ print(f"{self.val}-3");
10
+ }
11
+
12
+ can exit1 with Walker exit {
13
+ print(f"{self.val}-4");
14
+ }
15
+
16
+ can exit2 with exit {
17
+ print(f"{self.val}-5");
18
+ }
19
+ }
20
+
21
+ walker Walker {
22
+ can entry1 with entry {
23
+ print("walker entry");
24
+ }
25
+
26
+ can entry2 with `root entry {
27
+ print("walker enter to root");
28
+ visit [-->];
29
+ }
30
+
31
+ can entry3 with Node entry {
32
+ print(f"{here.val}-1");
33
+ }
34
+
35
+ can exit1 with Node exit {
36
+ print(f"{here.val}-6");
37
+ }
38
+
39
+ can exit2 with exit {
40
+ print("walker exit");
41
+ }
42
+ }
43
+
44
+ with entry{
45
+ root ++> Node(val = "a");
46
+ root ++> Node(val = "b");
47
+ root ++> Node(val = "c");
48
+
49
+ Walker() spawn root;
50
+ }
jaclang/tests/test_cli.py CHANGED
@@ -168,7 +168,7 @@ class JacCliTests(TestCase):
168
168
  cli.tool("ir", ["ast", f"{self.fixture_abs_path('import.jac')}"])
169
169
 
170
170
  sys.stdout = sys.__stdout__
171
- stdout_value = captured_output.getvalue()
171
+ stdout_value = captured_output.getvalue().replace("\\", "/")
172
172
  self.assertRegex(
173
173
  stdout_value,
174
174
  r"1\:11 \- 1\:13.*ModulePath - os - abs_path\:.*typeshed/stdlib/os/__init__.pyi",
@@ -1230,5 +1230,20 @@ class JacLanguageTests(TestCase):
1230
1230
  jac_import("architype_def_bug", base_path=self.fixture_abs_path("./"))
1231
1231
  sys.stdout = sys.__stdout__
1232
1232
  stdout_value = captured_output.getvalue().split("\n")
1233
- self.assertIn("MyNode", stdout_value[0])
1234
- self.assertIn("MyWalker", stdout_value[1])
1233
+ self.assertIn("MyWalker", stdout_value[0])
1234
+ self.assertIn("MyNode", stdout_value[1])
1235
+
1236
+ def test_visit_sequence(self) -> None:
1237
+ """Test conn assign on edges."""
1238
+ captured_output = io.StringIO()
1239
+ sys.stdout = captured_output
1240
+ jac_import("visit_sequence", base_path=self.fixture_abs_path("./"))
1241
+ sys.stdout = sys.__stdout__
1242
+ self.assertEqual(
1243
+ "walker entry\nwalker enter to root\n"
1244
+ "a-1\na-2\na-3\na-4\na-5\na-6\n"
1245
+ "b-1\nb-2\nb-3\nb-4\nb-5\nb-6\n"
1246
+ "c-1\nc-2\nc-3\nc-4\nc-5\nc-6\n"
1247
+ "walker exit\n",
1248
+ captured_output.getvalue(),
1249
+ )
jaclang/utils/test.py CHANGED
@@ -41,12 +41,12 @@ class TestCase(_TestCase):
41
41
  raise ValueError("Unable to determine the file of the module.")
42
42
  fixture_src = module.__file__
43
43
  fixture_path = os.path.join(os.path.dirname(fixture_src), "fixtures", fixture)
44
- with open(fixture_path, "r") as f:
44
+ with open(fixture_path, "r", encoding="utf-8") as f:
45
45
  return f.read()
46
46
 
47
47
  def file_to_str(self, file_path: str) -> str:
48
48
  """Load fixture from fixtures directory."""
49
- with open(file_path, "r") as f:
49
+ with open(file_path, "r", encoding="utf-8") as f:
50
50
  return f.read()
51
51
 
52
52
  def fixture_abs_path(self, fixture: str) -> str:
@@ -107,8 +107,10 @@ class JacFormatPassTests(TestCase):
107
107
 
108
108
  def test_sym_sym_dot(self) -> None:
109
109
  """Testing for sym, sym. AstTool."""
110
- jac_file = os.path.join(
111
- os.path.dirname(jaclang.__file__), "../examples/reference/atom.jac"
110
+ jac_file = os.path.normpath(
111
+ os.path.join(
112
+ os.path.dirname(jaclang.__file__), "../examples/reference/atom.jac"
113
+ )
112
114
  )
113
115
  out = AstTool().ir(["sym", jac_file])
114
116
  self.assertNotIn(
@@ -1,8 +1,7 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: jaclang
3
- Version: 0.7.28
3
+ Version: 0.7.30
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
- Home-page: https://jaseci.org
6
5
  License: MIT
7
6
  Keywords: jac,jaclang,jaseci,python,programming-language,machine-learning,artificial-intelligence
8
7
  Author: Jason Mars
@@ -19,6 +18,7 @@ Provides-Extra: all
19
18
  Provides-Extra: llm
20
19
  Provides-Extra: streamlit
21
20
  Project-URL: Documentation, https://jac-lang.org
21
+ Project-URL: Homepage, https://jaseci.org
22
22
  Project-URL: Repository, https://github.com/Jaseci-Labs/jaclang
23
23
  Description-Content-Type: text/markdown
24
24
 
@@ -5,13 +5,13 @@ jaclang/cli/cli.md,sha256=4BPJGdcyvs_rXgd_DPEGjkKSGe5ureXXYaQsf-_z_LU,5939
5
5
  jaclang/cli/cli.py,sha256=oOwM8tbq6HrOcYvoqBiNpT11qPkSofnlpkXXo86zAlU,16837
6
6
  jaclang/cli/cmdreg.py,sha256=5mhzLJnpHfc0Z22qKQgcEOICgBaC95G9gSJZ-R7GqvU,8282
7
7
  jaclang/compiler/.gitignore,sha256=n1k2_xXTorp9PY8hhYM4psHircn-NMaFx95bSgDKopo,10
8
- jaclang/compiler/__init__.py,sha256=0c0Eu3TPoo--hxvciM6kn9_A9YKjQOQdXX-yYILWFNM,2742
9
- jaclang/compiler/absyntree.py,sha256=7XI-zWwLOJ1KeyZqQ4-_ZJPEsLwCBFdpWvuTKEgK60g,141463
8
+ jaclang/compiler/__init__.py,sha256=QKNNJswgDdvn7qjvggio4BicJfCus1JCqyhsTGYN5sg,2724
9
+ jaclang/compiler/absyntree.py,sha256=7eiK13nNSvrdRu3brEXuF3wgBAugjBltvV79t_QnIEg,141860
10
10
  jaclang/compiler/codeloc.py,sha256=clz7ofOE0Rgf7eqco3zEO31mCbG3Skj9-rLooliBeik,2942
11
- jaclang/compiler/compile.py,sha256=eYoKSLCgzWQBMaRkeXSv1D_EuixEtrFP1iSjxUGtHzs,3773
12
- jaclang/compiler/constant.py,sha256=gKccXK4Qf3CWuv8J1oaWrwqdP7CRIf7ndayquRx6Xgs,9007
13
- jaclang/compiler/jac.lark,sha256=PX9R46947zcu4sITyJ56xQFGArLygPhZj-uulGfAx3M,17584
14
- jaclang/compiler/parser.py,sha256=TIz4Wa1zPfgVYWwqkdCcuJcDAMP4yPcFu1WXnb7iPdI,143263
11
+ jaclang/compiler/compile.py,sha256=FD3jxK8zoxdpQrYRJvwO3CoPWjYL3bbW2WhPRzj3hz8,3796
12
+ jaclang/compiler/constant.py,sha256=9EhbI1Q2Z0RL2z6tI612ifykxRicXLSJ9cby3ylIz1w,8981
13
+ jaclang/compiler/jac.lark,sha256=xLs771uRhbiU10uQLwle80RcbbOh1GassZa0he5RIPE,17497
14
+ jaclang/compiler/parser.py,sha256=xaYkqpiWvwdMNf2aSh6lorUA-RBb-0R4BnGVyrfavNA,143006
15
15
  jaclang/compiler/passes/__init__.py,sha256=0Tw0d130ZjzA05jVcny9cf5NfLjlaM70PKqFnY4zqn4,69
16
16
  jaclang/compiler/passes/ir_pass.py,sha256=CgtuBrVjfG7PgTCLNSjxgFffYR5naTC3tIjOjsXx5gk,5597
17
17
  jaclang/compiler/passes/main/__init__.py,sha256=m5ukLwMcdoi85Ee80-A-zDLbg81z0ztT2IKhOCegNpE,973
@@ -19,10 +19,10 @@ jaclang/compiler/passes/main/access_modifier_pass.py,sha256=h4R81e8rOanFjArjj2bZ
19
19
  jaclang/compiler/passes/main/def_impl_match_pass.py,sha256=cCOXyL-yyLxIvSyrlhOtVgjJNu0T-RyKx3sP4bFaQ54,8172
20
20
  jaclang/compiler/passes/main/def_use_pass.py,sha256=3rfLaQw4mScSedqPCY8vVkvZH77TTOKEbBYYGC0SZnA,9634
21
21
  jaclang/compiler/passes/main/fuse_typeinfo_pass.py,sha256=tLEUzuddDgELAjQwP1L3NEPZ4wYK7HOulNjnw0E1Dl4,26899
22
- jaclang/compiler/passes/main/import_pass.py,sha256=fvJ1ySHD5et2bqpaNV2JY9Y4g7cxQnNX2QKOWVdbQJQ,22981
22
+ jaclang/compiler/passes/main/import_pass.py,sha256=DmiQPoIi1nPNudwnu2Bn_vJrbVkM1VvO9XLbQqHj26s,22985
23
23
  jaclang/compiler/passes/main/inheritance_pass.py,sha256=EXj65jDjFZv-Ayac_12iiGeQUStA87-N0mGvNbAJZjQ,4708
24
24
  jaclang/compiler/passes/main/py_collect_dep_pass.py,sha256=TE4h6HLYRE5YdHZK9gtbPPaBJBLOg0g0xSlT_oPzwzY,2874
25
- jaclang/compiler/passes/main/pyast_gen_pass.py,sha256=UGfR-JNRDbvx99RxEf51OAEe3VljylZLQ1hD7eUS8Kk,143389
25
+ jaclang/compiler/passes/main/pyast_gen_pass.py,sha256=OyLaqzdhagGG8JEL7b-dzGeOl_Y28UTnOzZt_I_strs,142648
26
26
  jaclang/compiler/passes/main/pyast_load_pass.py,sha256=VmlR1j0iY60nFF9DrWVwWrvpUDZpXamkfoyF7miqysA,94697
27
27
  jaclang/compiler/passes/main/pybc_gen_pass.py,sha256=CjA9AqyMO3Pv_b5Hh0YI6JmCqIru2ASonO6rhrkau-M,1336
28
28
  jaclang/compiler/passes/main/pyjac_ast_link_pass.py,sha256=snbqUIPtPcD9ZKsItOlKGVnujoMGFwF8XNP0GvxS9AI,8628
@@ -66,7 +66,7 @@ jaclang/compiler/passes/main/tests/fixtures/type_info.jac,sha256=64Im2L-R3YF8DEu
66
66
  jaclang/compiler/passes/main/tests/fixtures/uninitialized_hasvars.jac,sha256=RVxT9k1R_O_daYZJPvOTjZcd8-CX3zlaaIB0Chg2IvU,542
67
67
  jaclang/compiler/passes/main/tests/test_decl_def_match_pass.py,sha256=JuemAIeaHf1wcpbkRTQdp_xlqUmSBZg91pLFyxEv1VM,4393
68
68
  jaclang/compiler/passes/main/tests/test_def_use_pass.py,sha256=NJr8d4iS9maoySBMLtxi8a3DJjbcLgEy6GjRgU_nzhM,843
69
- jaclang/compiler/passes/main/tests/test_import_pass.py,sha256=L376AEgfXM8lFP2KjIdzYjMyLi7NchUtqwwBsYR7lgE,4819
69
+ jaclang/compiler/passes/main/tests/test_import_pass.py,sha256=Z7g_kY8lkq0jrN_WugTh1tRQpYmcgHyz_TfMyKIk3HY,4893
70
70
  jaclang/compiler/passes/main/tests/test_pyast_build_pass.py,sha256=LIT4TP-nhtftRtY5rNySRQlim-dWMSlkfUvkhZTk4pc,1383
71
71
  jaclang/compiler/passes/main/tests/test_pyast_gen_pass.py,sha256=6ZpLNYxblzBg6bmWSA0fikNM7nEAR9b9F18LJaO5buM,4679
72
72
  jaclang/compiler/passes/main/tests/test_pybc_gen_pass.py,sha256=If8PE4exN5g9o1NRElNC0XdfIwJAp7M7f69rzmYRYUQ,655
@@ -78,7 +78,7 @@ jaclang/compiler/passes/main/tests/test_typeinfo_pass.py,sha256=o908glXImFXOlKKT
78
78
  jaclang/compiler/passes/main/type_check_pass.py,sha256=eDVvCO5I46ZUdCc86nZgfrIRi0-gL0KAlM_1RGEPnCY,4343
79
79
  jaclang/compiler/passes/tool/__init__.py,sha256=xekCOXysHIcthWm8NRmQoA1Ah1XV8vFbkfeHphJtUdc,223
80
80
  jaclang/compiler/passes/tool/fuse_comments_pass.py,sha256=CSnuWy4gZfTcWKe0Q7LBikBgWe1zJr0QmNUkgrZ7B38,3657
81
- jaclang/compiler/passes/tool/jac_formatter_pass.py,sha256=ILagQpjv4wcBlu3dMQ1kaA-X7il1IwICdB9GqcBlPZ4,91207
81
+ jaclang/compiler/passes/tool/jac_formatter_pass.py,sha256=iKwxfOIjh5_kI6xuantMWrYt1cGALE1PBSW_Fz8X4DI,91173
82
82
  jaclang/compiler/passes/tool/schedules.py,sha256=kmbsCazAMizGAdQuZpFky5BPlYlMXqNw7wOUzdi_wBo,432
83
83
  jaclang/compiler/passes/tool/tests/__init__.py,sha256=AeOaZjA1rf6VAr0JqIit6jlcmOzW7pxGr4U1fOwgK_Y,24
84
84
  jaclang/compiler/passes/tool/tests/fixtures/corelib.jac,sha256=QvGgP1v_RRqM2t8BOMbbEj3g6jCgyYKvZEdqydJqlqg,12581
@@ -138,7 +138,7 @@ jaclang/compiler/tests/fixtures/kwesc.jac,sha256=OXxVL_fwiFuvYO1YX1RHa2hpETSpb0Q
138
138
  jaclang/compiler/tests/fixtures/mod_doc_test.jac,sha256=aFZpjn7V5lvCHp0lPoGXtdkcY3CK8_-SKeZGruutv4Y,35
139
139
  jaclang/compiler/tests/fixtures/staticcheck.jac,sha256=t849--dTkSSjCJX1OiMV-lgao_hIDSKwKVs-aS6IwK8,342
140
140
  jaclang/compiler/tests/fixtures/stuff.jac,sha256=qOq6WOwhlprMmJpiqQudgqnr4qTd9uhulQSDGQ3o6sY,82
141
- jaclang/compiler/tests/test_importer.py,sha256=5gcP-oHoQ6i4VWh7_NlDl8uKLlwfbgzoWTd44ugs5Go,2315
141
+ jaclang/compiler/tests/test_importer.py,sha256=BKRZ0-n459LaXpJOJt73NHcYkYFAFfFalYz3TF4VgD8,3764
142
142
  jaclang/compiler/tests/test_parser.py,sha256=Ke5bF2nrLufhp4y92_dONvBZ8S5GgvfDozOJnEy4-9U,5044
143
143
  jaclang/langserve/__init__.py,sha256=3qbnivBBcLZCfmDYRMIeKkG08Lx7XQsJJg-qG8TU8yc,51
144
144
  jaclang/langserve/engine.py,sha256=2U6sSCXLedVZhbUGFMadSecKUmW23LAk8S99vN7tsyc,20911
@@ -169,10 +169,10 @@ jaclang/langserve/tests/test_server.py,sha256=Z-RXNuCXFPi67uXkW1hmoJmrb37VFRpRdH
169
169
  jaclang/langserve/utils.py,sha256=edZCrq8ZFolao-rvv5RGPxtnEh6NmhrxOgPh8VxmEPs,15019
170
170
  jaclang/plugin/__init__.py,sha256=5t2krHKt_44PrCTGojzxEimxpNHYVQcn89jAiCSXE_k,165
171
171
  jaclang/plugin/builtin.py,sha256=zNTbe5knJrGFgJRa4l4hMzzuij6iXFyVqRTxputUHIo,1307
172
- jaclang/plugin/default.py,sha256=ufEhllQ19UIDnPFsbZRgL_f_uMjc_0tL4yltO9y01ok,47303
173
- jaclang/plugin/feature.py,sha256=MwTG38T0kyCAUiZd_dKFLu4eW6lYKn7LDUObv-iBc1k,17178
172
+ jaclang/plugin/default.py,sha256=yaF0JtGrDGJqPKdXUk4v_Uxd5PXFz3Zv9UWTENT0JbI,47142
173
+ jaclang/plugin/feature.py,sha256=zXI0uZDioToOoC9z294Kbt3zVLkDO59RXhSEN9FYyI4,17010
174
174
  jaclang/plugin/plugin.md,sha256=B252QTH3c8uZyvXTbGmZBafZtdXstFC5vT5jIN_gS4U,9994
175
- jaclang/plugin/spec.py,sha256=c6Syscbo38eDOLfx34YaIa5lW0PUjIc9lgFtEtRBVzg,14748
175
+ jaclang/plugin/spec.py,sha256=4QAluXPJ_4Hbg9rPBu97JfkRbHJv8tc-tVxfhI_LWTI,14573
176
176
  jaclang/plugin/tests/__init__.py,sha256=rn_tNG8jCHWwBc_rx4yFkGc4N1GISb7aPuTFVRTvrTk,38
177
177
  jaclang/plugin/tests/fixtures/graph_purger.jac,sha256=c6kJD-KYYj2NErC21CjC2sjEMMBF6Qh9SdY9nSKWos8,1506
178
178
  jaclang/plugin/tests/fixtures/impl_match.jac,sha256=WEhcA1GlovusITEFO2bOjYYqiiULyYGKhM17uK2GqnI,91
@@ -185,14 +185,14 @@ jaclang/plugin/tests/test_features.py,sha256=sK9d2UazofGl9qYZO_ODKmOHZY8E4fnXNoy
185
185
  jaclang/plugin/tests/test_jaseci.py,sha256=g2HQWPaG4E2FQOWcKmZ2SM2MDDOEy2s1u14Idb7GTbw,27398
186
186
  jaclang/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
187
  jaclang/runtimelib/__init__.py,sha256=jDDYBCV82qPhmcDVk3NIvHbhng0ebSrXD3xrojg0-eo,34
188
- jaclang/runtimelib/architype.py,sha256=Egw3hmLDAt_jxQBagT_WoLv5Evl7hUbGkPx0-skboLw,8650
188
+ jaclang/runtimelib/architype.py,sha256=masm9grqVRFzBFJbpbxrDQ9nWrrA4RZ9FJfK2KmfIZQ,8679
189
189
  jaclang/runtimelib/constructs.py,sha256=1ARnsPrDi1UvyaFRhGRhO0kj0fnIZ2HbHF7O3itB-ZQ,796
190
190
  jaclang/runtimelib/context.py,sha256=DjCkj1S6WLBWbNMkhUjqPYIhxqXV0XjJ1Mpjy7WR4g0,5538
191
- jaclang/runtimelib/importer.py,sha256=a6ORKrDfK-jKXopgyZHz188O-VI2NflFQo7VTUVvqOw,14592
192
- jaclang/runtimelib/machine.py,sha256=8gyGLxURqfy0bLXMWyOwjIX-rH8Mz11b-jV6Ta5liTk,11566
191
+ jaclang/runtimelib/importer.py,sha256=A2YIoPTPaRYvIrj3JZL7bDOyxFpU25Ld-V_fWQMsTbE,15650
192
+ jaclang/runtimelib/machine.py,sha256=JvJiuh_QSFmqHIwWsOXb1pRPdAmM7sadUzWkNpb6jJc,11571
193
193
  jaclang/runtimelib/memory.py,sha256=LrVTo6Cac0q-YG1wug-Fgc8O2Tue9zRHnxSulDw3ZQ4,5656
194
194
  jaclang/runtimelib/test.py,sha256=4HW7MjHmxjwWjwtIqLtFpcq9B9rI4NmyA92qFy9yhz8,4709
195
- jaclang/runtimelib/utils.py,sha256=xcxO45lEwEBRrWeeAaRjqGZ4Ua-XMCeNv0lS6dHwGIk,8652
195
+ jaclang/runtimelib/utils.py,sha256=6_fLmG3zfcX7cVKCq_NvkGjsDsx1nxvV_1GLpyIp8IY,9150
196
196
  jaclang/settings.py,sha256=1oxaHpRfrjuwtwgoRJl-abxb8qlvIXUf0JqE-apLLqo,3793
197
197
  jaclang/tests/fixtures/abc.jac,sha256=HZvLz6IEt3Snlgg8Czs-N4emLjg4fT3IbTo95d3Gdww,1747
198
198
  jaclang/tests/fixtures/access_checker.jac,sha256=UVoY7sYW-R0ms2HDA4HXQ5xJNiW0vEbY2T5CCY1avus,281
@@ -310,14 +310,15 @@ jaclang/tests/fixtures/tupleunpack.jac,sha256=AP6rbofc0VmsTNxInY6WLGRKWVY6u8ut0u
310
310
  jaclang/tests/fixtures/tuplytuples.jac,sha256=6qiXn5OV_qn4cqKwROjJ1VuBAh0nbUGpp-5vtH9n_Dg,344
311
311
  jaclang/tests/fixtures/type_info.jac,sha256=4Cw31ef5gny6IS0kLzgeSO-7ArEH1HgFFFip1BGQhZM,316
312
312
  jaclang/tests/fixtures/visit_order.jac,sha256=5_U-sJX_TkY9A1ho4ibCr-53pFYRtkl97FfMlhoke3w,260
313
+ jaclang/tests/fixtures/visit_sequence.jac,sha256=My5EdoMMc-6kSKtIuVQLTQ9bmiyfZb1xAyLvd5KH1CQ,830
313
314
  jaclang/tests/fixtures/walker_override.jac,sha256=Ok58ZAgxuV6aECNxYrjbbyAWSiqIbnly3N3O6cD563o,271
314
315
  jaclang/tests/fixtures/walker_update.jac,sha256=_bN3ASAN6LpfIQFfDMRnrx2oteM-ef7OrbE91f2qvrs,463
315
316
  jaclang/tests/fixtures/with_context.jac,sha256=cDA_4YWe5UVmQRgcpktzkZ_zsswQpV_T2Otf_rFnPy8,466
316
317
  jaclang/tests/foo/__init__.jac,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
317
318
  jaclang/tests/main.jac,sha256=UJ4dASLCMA3wW78Rq3AHcq5GfXVY5QBm2S16OCrR1hQ,13
318
319
  jaclang/tests/test_bugs.py,sha256=tBPsIlSPqZDIz4QaScNRT-WdGIdJ0uU-aRBWq1XUZ6o,555
319
- jaclang/tests/test_cli.py,sha256=jADI7iZN7PguCzmtAt0oK1RZkboRFKjHfz-fN5rC78w,19332
320
- jaclang/tests/test_language.py,sha256=e92KDCXtP9myt4nvA7iCzBUq6V4zjbkro39vW1Lrh6U,50423
320
+ jaclang/tests/test_cli.py,sha256=QT1pdVxv6Wyp7xKXJc_w4YdOiwpgQ8KYYROq1KhfzAk,19351
321
+ jaclang/tests/test_language.py,sha256=s4phFcN1lK_OdpjhWq2bpzHC4s58Djjsn6REeHV4sRU,50988
321
322
  jaclang/tests/test_man_code.py,sha256=ZdNarlZVfT_-8Jv3FjLplHw76tsvkCuISyfX3M4qxPg,5027
322
323
  jaclang/tests/test_reference.py,sha256=FISQpZbB8cmRoAeJOFfXUy13WVxykZjpkPSb1OTotfI,3340
323
324
  jaclang/tests/test_settings.py,sha256=TIX5uiu8H9IpZN2__uFiclcdCpBpPpcAwtlEHyFC4kk,1999
@@ -325,9 +326,9 @@ jaclang/utils/__init__.py,sha256=86LQ_LDyWV-JFkYBpeVHpLaVxkqwFDP60XpWXOFZIQk,46
325
326
  jaclang/utils/helpers.py,sha256=0n3J50D5XvLI6nEalDewDWRkjO2EO71OkKS_6lGYuyY,10340
326
327
  jaclang/utils/lang_tools.py,sha256=HECF9zXH8si6Q_oBhSSoOMmv-k8ppKPb6RAlX_wZPWE,10177
327
328
  jaclang/utils/log.py,sha256=G8Y_DnETgTh9xzvlW5gh9zqJ1ap4YY_MDTwIMu5Uc0Y,262
328
- jaclang/utils/test.py,sha256=27TS33HkjKMy-hb-E4J1qQ3aBVqBPJaI_222ZT7P5TQ,6053
329
+ jaclang/utils/test.py,sha256=c12ZyRvG2IQtuRaU9XEGBrdM26fH82tWP9u64HH2Mz4,6089
329
330
  jaclang/utils/tests/__init__.py,sha256=8uwVqMsc6cxBAM1DuHLuNuTnzLXqOqM-WRa4ixOMF6w,23
330
- jaclang/utils/tests/test_lang_tools.py,sha256=hFQzkzdmJIhP99xqjR5z7bqkefMLmE6kwldXYrfK--E,4831
331
+ jaclang/utils/tests/test_lang_tools.py,sha256=wIMWdoKF24gVTlG_dGLAxetZhGmBF8cftUY-bugNOOQ,4879
331
332
  jaclang/utils/treeprinter.py,sha256=ElR4IuXewv2D7MykE9bNji1KxgCNCOTCp2j4ZECeiEk,13512
332
333
  jaclang/vendor/__init__.py,sha256=tEcp2kl3hMvF2d6X6WlJSAGuAMYOVCKCstXuPMQSR4Q,265
333
334
  jaclang/vendor/attr/__init__.py,sha256=WlXJN6ICB0Y_HZ0lmuTUgia0kuSdn2p67d4N6cYxNZM,3307
@@ -1551,7 +1552,7 @@ jaclang/vendor/typing_extensions-4.12.2.dist-info/METADATA,sha256=BeUQIa8cnYbrjW
1551
1552
  jaclang/vendor/typing_extensions-4.12.2.dist-info/RECORD,sha256=XS4fBVrPI7kaNZ56Ggl2RGa76jySWLqTzcrUpZIQTVM,418
1552
1553
  jaclang/vendor/typing_extensions-4.12.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
1553
1554
  jaclang/vendor/typing_extensions.py,sha256=gwekpyG9DVG3lxWKX4ni8u7nk3We5slG98mA9F3DJQw,134451
1554
- jaclang-0.7.28.dist-info/METADATA,sha256=dHW7qbjtqZqrcvGQYgK25k01-zfa7pnliEAzqyBB1BA,4965
1555
- jaclang-0.7.28.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
1556
- jaclang-0.7.28.dist-info/entry_points.txt,sha256=8sMi4Tvi9f8tQDN2QAXsSA2icO27zQ4GgEdph6bNEZM,49
1557
- jaclang-0.7.28.dist-info/RECORD,,
1555
+ jaclang-0.7.30.dist-info/METADATA,sha256=ACKhVDb2Ry7XFK-JK1Uf4ZtcjgmmpZmbABTfzwzl6hE,4977
1556
+ jaclang-0.7.30.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
1557
+ jaclang-0.7.30.dist-info/entry_points.txt,sha256=8sMi4Tvi9f8tQDN2QAXsSA2icO27zQ4GgEdph6bNEZM,49
1558
+ jaclang-0.7.30.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.0.0
2
+ Generator: poetry-core 2.0.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any