syncraft 0.2.1__py3-none-any.whl → 0.2.2__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 syncraft might be problematic. Click here for more details.

syncraft/constraint.py CHANGED
@@ -5,6 +5,7 @@ from dataclasses import dataclass, field, replace
5
5
  import collections.abc
6
6
  from collections import defaultdict
7
7
  from itertools import product
8
+ from inspect import Signature
8
9
  import inspect
9
10
 
10
11
  K = TypeVar('K')
@@ -122,9 +123,9 @@ class Constraint:
122
123
  def predicate(cls,
123
124
  f: Callable[..., bool],
124
125
  *,
125
- name: Optional[str] = None,
126
- quant: Quantifier = Quantifier.FORALL)->Constraint:
127
- sig = inspect.signature(f)
126
+ sig: Signature,
127
+ name: str,
128
+ quant: Quantifier)->Constraint:
128
129
  pos_params = []
129
130
  kw_params = []
130
131
  for pname, param in sig.parameters.items():
@@ -160,12 +161,31 @@ class Constraint:
160
161
  else:
161
162
  return ConstraintResult(result = all(eval_combo(c) for c in all_combos), unbound=frozenset())
162
163
 
163
- return cls(run_f=run_f, name=name or f.__name__)
164
+ return cls(run_f=run_f, name=name)
165
+
166
+
167
+ def predicate(f: Callable[..., bool],
168
+ *,
169
+ name: Optional[str] = None,
170
+ quant: Quantifier = Quantifier.FORALL,
171
+ bimap: bool = True) -> Constraint:
172
+ name = name or f.__name__
173
+ sig = inspect.signature(f)
174
+ if bimap:
175
+ def wrapper(*args: Any, **kwargs:Any) -> bool:
176
+ mapped_args = [a.bimap()[0] if hasattr(a, "bimap") else a for a in args]
177
+ mapped_kwargs = {k: (v.bimap()[0] if hasattr(v, "bimap") else v) for k,v in kwargs.items()}
178
+ return f(*mapped_args, **mapped_kwargs)
179
+
180
+ return Constraint.predicate(wrapper, sig=sig, name=name, quant=quant)
181
+ else:
182
+ return Constraint.predicate(f, sig=sig, name=name, quant=quant)
164
183
 
165
- def forall(f: Callable[..., bool], name: Optional[str] = None) -> Constraint:
166
- return Constraint.predicate(f, name=name, quant=Quantifier.FORALL)
184
+ def forall(f: Callable[..., bool], name: Optional[str] = None, bimap: bool=True) -> Constraint:
185
+ return predicate(f, name=name, quant=Quantifier.FORALL, bimap=bimap)
167
186
 
168
- def exists(f: Callable[..., bool], name: Optional[str] = None) -> Constraint:
169
- return Constraint.predicate(f, name=name, quant=Quantifier.EXISTS)
187
+ def exists(f: Callable[..., bool], name: Optional[str] = None, bimap:bool = True) -> Constraint:
188
+ return predicate(f, name=name, quant=Quantifier.EXISTS, bimap=bimap)
189
+
170
190
 
171
191
 
syncraft/generator.py CHANGED
@@ -297,7 +297,7 @@ class Generator(Algebra[ParseResult[T], GenState[T]]):
297
297
  def generate(syntax: Syntax[Any, Any],
298
298
  data: Optional[ParseResult[Any]] = None,
299
299
  seed: int = 0,
300
- restore_pruned: bool = False) -> Tuple[AST, FrozenDict[str, AST]] | Tuple[Any, None]:
300
+ restore_pruned: bool = False) -> Tuple[AST, FrozenDict[str, Tuple[AST, ...]]] | Tuple[Any, None]:
301
301
  from syncraft.syntax import run
302
302
  return run(syntax, Generator, False, ast=data, seed=seed, restore_pruned=restore_pruned)
303
303
 
syncraft/parser.py CHANGED
@@ -69,9 +69,9 @@ class ParserState(Bindable, Generic[T]):
69
69
  @dataclass(frozen=True)
70
70
  class Parser(Algebra[T, ParserState[T]]):
71
71
  @classmethod
72
- def state(cls, sql: str, dialect: str) -> ParserState[Token]:
72
+ def state(cls, sql: str, dialect: str) -> ParserState[T]:
73
73
  tokens = tuple([Token(token_type=token.token_type, text=token.text) for token in tokenize(sql, dialect=dialect)])
74
- return ParserState.from_tokens(tokens)
74
+ return ParserState.from_tokens(tokens) # type: ignore
75
75
 
76
76
  @classmethod
77
77
  def token(cls,
@@ -188,7 +188,7 @@ def sqlglot(parser: Syntax[Any, Any],
188
188
  return parser.map(lambda tokens: [e for e in gp.parse(raw_tokens=tokens) if e is not None])
189
189
 
190
190
 
191
- def parse(syntax: Syntax[Any, Any], sql: str, dialect: str) -> Tuple[AST, FrozenDict[str, AST]] | Tuple[Any, None]:
191
+ def parse(syntax: Syntax[Any, Any], sql: str, dialect: str) -> Tuple[AST, FrozenDict[str, Tuple[AST, ...]]] | Tuple[Any, None]:
192
192
  from syncraft.syntax import run
193
193
  return run(syntax, Parser, True, sql=sql, dialect=dialect)
194
194
 
syncraft/syntax.py CHANGED
@@ -319,7 +319,7 @@ def success(value: Any) -> Syntax[Any, Any]:
319
319
  def choice(*parsers: Syntax[Any, S]) -> Syntax[Any, S]:
320
320
  return reduce(lambda a, b: a | b, parsers) if len(parsers) > 0 else success(Nothing())
321
321
 
322
- def run(syntax: Syntax[A, S], alg: Type[Algebra[A, S]], use_cache:bool, *args: Any, **kwargs: Any) -> Tuple[Any, FrozenDict[str, Any]] | Tuple[Any, None]:
322
+ def run(syntax: Syntax[A, S], alg: Type[Algebra[A, S]], use_cache:bool, *args: Any, **kwargs: Any) -> Tuple[Any, FrozenDict[str, Tuple[Any, ...]]] | Tuple[Any, None]:
323
323
  parser = syntax(alg)
324
324
  input: Optional[S] = alg.state(*args, **kwargs)
325
325
  if input:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: syncraft
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Parser combinator library
5
5
  Author-email: Michael Afmokt <michael@esacca.com>
6
6
  License-Expression: MIT
@@ -0,0 +1,16 @@
1
+ syncraft/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ syncraft/algebra.py,sha256=2pyxbllcRsaDS_rEXfagBenZ_etSjMNdlVYxPkoU7cQ,15849
3
+ syncraft/ast.py,sha256=TAHj8IOgx_QtlI4zxFr2DRGZ4dwNGsb6TiH0TH9adIg,14556
4
+ syncraft/constraint.py,sha256=4HDWXgq9ZKacKBViBxIWhbRqgZNP7cZHXOSFMyGMaaA,7274
5
+ syncraft/diagnostic.py,sha256=cgwcQnCcgrCRX3h-oGTDb5rcJAtitPV3LfH9eLvO93E,2837
6
+ syncraft/finder.py,sha256=Wr7wiBuO9IaXBmYBA4DNXmoeEWteRIp-UetnuRScapM,1920
7
+ syncraft/generator.py,sha256=sa0Uyq2azFh5kW3RVsPS7aFmtR5sfBYODa5K2Fg_Jy8,13074
8
+ syncraft/parser.py,sha256=azO1P7c2QJK_XPZtrMnK6CyTHRdlQaT9rAqfyZNtUK0,11293
9
+ syncraft/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ syncraft/sqlite3.py,sha256=Pq09IHZOwuWg5W82l9D1flzd36QV0TOHQpTJ5U02V8g,34701
11
+ syncraft/syntax.py,sha256=kKECtd-yIIho6DjG0fHYNpqNkJ9_zo01S7bOWUUT0VA,16294
12
+ syncraft-0.2.2.dist-info/licenses/LICENSE,sha256=wHSV424U5csa3339dy1AZbsz2xsd0hrkMx2QK48CcUk,1062
13
+ syncraft-0.2.2.dist-info/METADATA,sha256=VlHmCHpIuBIfamHJ6jPr6PbGCShaR0mcTE6foAtk8nI,988
14
+ syncraft-0.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
15
+ syncraft-0.2.2.dist-info/top_level.txt,sha256=Kq3t8ESXB2xW1Xt3uPmkENFc-c4f2pamNmaURBk7zc8,9
16
+ syncraft-0.2.2.dist-info/RECORD,,
@@ -1,16 +0,0 @@
1
- syncraft/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- syncraft/algebra.py,sha256=2pyxbllcRsaDS_rEXfagBenZ_etSjMNdlVYxPkoU7cQ,15849
3
- syncraft/ast.py,sha256=TAHj8IOgx_QtlI4zxFr2DRGZ4dwNGsb6TiH0TH9adIg,14556
4
- syncraft/constraint.py,sha256=9VvnZtL3Q63qnU-j3cgTQm8cMrIXdgSgl4qIEF-YCx4,6509
5
- syncraft/diagnostic.py,sha256=cgwcQnCcgrCRX3h-oGTDb5rcJAtitPV3LfH9eLvO93E,2837
6
- syncraft/finder.py,sha256=Wr7wiBuO9IaXBmYBA4DNXmoeEWteRIp-UetnuRScapM,1920
7
- syncraft/generator.py,sha256=inNBE4dk1AHXCCgnBHsgVOuHRIsHXIY1BXnpy1oLq8s,13062
8
- syncraft/parser.py,sha256=XjLEkPnOb8YwlIJeqtn9VT6oAWLu_otD2H_o4utZP5I,11270
9
- syncraft/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- syncraft/sqlite3.py,sha256=Pq09IHZOwuWg5W82l9D1flzd36QV0TOHQpTJ5U02V8g,34701
11
- syncraft/syntax.py,sha256=qqPOxcelIwFNyzLdTKkQVtUzzz1Xkv0wEBJQ9vt8HTc,16282
12
- syncraft-0.2.1.dist-info/licenses/LICENSE,sha256=wHSV424U5csa3339dy1AZbsz2xsd0hrkMx2QK48CcUk,1062
13
- syncraft-0.2.1.dist-info/METADATA,sha256=ByoEIvwRb64_WH9MDoMJqJeEpwCqyJYi1OP9FJHNgsk,988
14
- syncraft-0.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
15
- syncraft-0.2.1.dist-info/top_level.txt,sha256=Kq3t8ESXB2xW1Xt3uPmkENFc-c4f2pamNmaURBk7zc8,9
16
- syncraft-0.2.1.dist-info/RECORD,,